Excel VBA中通过索引访问Variant类型变量中选中值的问题
解决VBA中Variant数组下标越界问题
你的代码把单元格区域赋值给stat变量后,stat是二维数组(即使区域是单列/单行),而且Excel的Range.Value返回的数组默认是1基索引(行和列都从1开始),不是你期望的0基一维数组,所以直接用stat(2)会触发下标越界错误。
错误原因拆解
- 执行
stat = Selection.Value后,若选中的是多行多列区域,stat的结构为stat(行索引, 列索引);哪怕是单列区域,它依然是二维数组(比如stat(2,1))。 - Excel对象模型返回的数组默认是1基,不是0基,你想访问的0基索引2对应的是1基的第3行。
解决方案
方案1:直接使用二维数组的正确下标访问
如果目标区域是单列,把MsgBox stat(2)改成:
MsgBox stat(3, 1) ' 对应0基的索引2,1基的第3行就是0基的第2个元素
方案2:将二维数组转换为0基一维数组
如果需要用0基一维数组访问,可把单列的二维数组转成一维:
Dim LR As Long, stat() As Variant, arr() As Variant ' 去掉不必要的Select,直接操作Range With Range("BodyStart") stat = Range(.Cells, .End(xlDown).End(xlToRight)).Value End With ' 仅当区域是单列时转换 If UBound(stat, 2) = 1 Then ReDim arr(0 To UBound(stat) - 1) Dim i As Long For i = 1 To UBound(stat) arr(i - 1) = stat(i, 1) Next i MsgBox arr(2) ' 这里可获取目标值5 End If
方案3:直接获取单列区域为0基一维数组(简洁版)
如果确定目标区域是单列,用Application.Transpose直接转换:
Dim stat As Variant ' 先转成1基一维数组,再转一次得到0基 stat = Application.Transpose(Application.Transpose(Range("BodyStart", Range("BodyStart").End(xlDown)).Value)) MsgBox stat(2)
优化原代码(移除冗余Select)
原代码中的Select是不必要的,直接操作Range更高效:
Dim stat() As Variant With Range("BodyStart") stat = Range(.Cells, .End(xlDown).End(xlToRight)).Value End With ' 之后按上述方案访问数组
内容的提问来源于stack exchange,提问作者anotherSTACKmember
相关产品推荐
相关产品推荐

