如何基于Excel Range对象创建数组?VBA代码运行遇索引越界异常
解决VBA中Range转数组的索引越界问题
嘿,这个问题我太熟了!你遇到的索引越界报错,根源在于VBA里把Range对象直接赋值给Variant变量时,得到的是二维数组——哪怕你选的是单列或者单行区域!
问题原因拆解
你的A5:A7是3行1列的区域,赋值给arrayMe后,数组的结构是arrayMe(行号, 列号):
arrayMe(1, 1)= 1(对应A5)arrayMe(2, 1)= 2(对应A6)arrayMe(3, 1)= 3(对应A7)
你直接用arrayMe(i)访问,相当于只传入了一个索引,VBA找不到对应的元素,自然触发索引越界异常。
两种快速解决方法
方法1:直接使用二维数组索引
不用改数组结构,只要在访问时加上列索引(因为是单列,列索引固定为1):
Public Sub Test() Dim Test As Range Set Test = Worksheets("Sheet1").Range("A5:A7") Dim arrayMe As Variant arrayMe = Test Dim i As Integer For i = 1 To 3 MsgBox (arrayMe(i, 1)) ' 补充列索引1 Next i End Sub
方法2:转成一维数组(更符合你的代码习惯)
用Application.Transpose函数把单列的二维数组转成一维数组,这样就能用arrayMe(i)直接访问了:
Public Sub Test() Dim Test As Range Set Test = Worksheets("Sheet1").Range("A5:A7") Dim arrayMe As Variant arrayMe = Application.Transpose(Test) ' 转成一维数组 Dim i As Integer For i = 1 To 3 MsgBox (arrayMe(i)) Next i End Sub
小贴士:如果是单行区域(比如A1:C1)要转一维数组,需要用两次
Transpose:arrayMe = Application.Transpose(Application.Transpose(Test))
内容的提问来源于stack exchange,提问作者Snowflake
相关产品推荐
相关产品推荐

