Excel VBA中ReDim语句何时无需使用?
Excel VBA动态数组中ReDim的使用场景
先解释你的示例
你代码里的ReDim arr(1 To 4)之所以多余,是因为Split函数会返回一个已经分配好存储空间的数组。当你用arr = Split(s, ",")把这个返回值赋值给动态数组时,VBA会自动重新分配arr的存储空间,完全覆盖之前ReDim指定的大小,所以那行代码没有实际作用。
需要使用ReDim的场景
- 手动逐个给动态数组元素赋值时:比如你要自己循环往数组里添加元素,必须先通过ReDim指定数组的初始大小,或者后续用
ReDim Preserve来扩容(避免丢失已有数据)。示例:Sub test_manual_assign() Dim arr() As String ' 必须先ReDim才能通过索引赋值 ReDim arr(1 To 2) arr(1) = "Apple" arr(2) = "Banana" ' 扩容并保留原有数据 ReDim Preserve arr(1 To 3) arr(3) = "Cherry" End Sub - 需要调整数组维度或上下界时:比如把一维数组改成二维,或者修改数组的起始下标(比如从0开始改成从1开始)。
- 初始化动态数组后直接通过索引访问元素时:如果不先ReDim,会触发「下标越界」错误。
无需使用ReDim的场景
- 直接用数组赋值语句给动态数组赋值时:包括把其他数组、返回数组的函数结果赋值给动态数组,VBA会自动处理存储空间分配。除了你用到的Split,还有这些例子:
- 用Array函数初始化:
Dim arr() As Variant arr = Array(1, 2, 3, 4) ' 无需ReDim - 赋值Range区域的数组:
Dim arr() As Variant arr = Range("A1:C5").Value ' 自动匹配单元格区域的大小 - 用Filter函数返回的数组:
Dim arr() As String arr = Filter(Split("Red,Yellow,Green", ","), "e") ' 无需提前ReDim
- 用Array函数初始化:
- 注意:这和数组类型无关——不管是String、Integer还是Variant类型的动态数组,只要是通过这种直接赋值的方式获取数组内容,都不需要提前用ReDim分配空间。
内容的提问来源于stack exchange,提问作者jgg
相关产品推荐
相关产品推荐

