You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态截取VBA数组子集时出现Error 2023错误的解决方法

解决VBA动态截取数组子集并计算平均值的问题

问题根源

你用[ROW(c:d)]时,VBA会将c和d解析为工作表单元格引用,而非你定义的VBA变量,这导致Index函数无法获取正确的行号数组,从而抛出错误。

两种可行解决方案

方案1:用Evaluate动态拼接行号范围

通过字符串拼接将变量c和d的值代入ROW函数,再用Evaluate执行,生成正确的行号数组:

b = Application.Average(Application.Index(MyArray, Evaluate("ROW(" & c & ":" & d & ")"), 2))

方案2:手动生成行号数组

完全脱离Excel工作表函数,直接在VBA中创建包含目标行号的数组,避免Evaluate的解析问题:

' 生成c到d的行号数组
Dim rowNums() As Long
ReDim rowNums(c To d)
Dim i As Long
For i = c To d
    rowNums(i) = i
Next i

' 计算平均值
b = Application.Average(Application.Index(MyArray, rowNums, 2))

完整修正后的代码

Sub test2()
    Dim MyArray() As Double
    Dim c As Long ' 行号用Long类型更合理,避免浮点类型转换
    Dim d As Long
    Dim a As Double, b As Double, b2 As Double
    
    ' 数组索引匹配实际赋值范围(0基,第一维0-4,第二维0-1)
    ReDim MyArray(4, 1)
    
    c = 3
    d = 5
    
    ' 给数组赋值
    MyArray(0, 0) = 1
    MyArray(1, 0) = 2
    MyArray(2, 0) = 3
    MyArray(3, 0) = 4
    MyArray(4, 0) = 5
    MyArray(0, 1) = 10
    MyArray(1, 1) = 20
    MyArray(2, 1) = 30
    MyArray(3, 1) = 40
    MyArray(4, 1) = 50
    
    ' 固定范围写法(正确)
    a = Application.Average(Application.Index(MyArray, [ROW(3:5)], 2))
    
    ' 动态变量写法1:Evaluate拼接
    b = Application.Average(Application.Index(MyArray, Evaluate("ROW(" & c & ":" & d & ")"), 2))
    
    ' 动态变量写法2:手动生成行号数组
    Dim rowNums() As Long
    ReDim rowNums(c To d)
    Dim i As Long
    For i = c To d
        rowNums(i) = i
    Next i
    b2 = Application.Average(Application.Index(MyArray, rowNums, 2))
    
    ' 输出结果验证
    Debug.Print "固定范围结果:" & a ' 输出40
    Debug.Print "动态拼接结果:" & b ' 输出40
    Debug.Print "手动数组结果:" & b2 ' 输出40
End Sub

额外优化提示

  • 变量类型:行号是整数,将c、d定义为Long而非Double,避免不必要的类型转换。
  • 数组维度:根据实际赋值范围调整ReDim参数,避免创建冗余的数组空间。

内容的提问来源于stack exchange,提问作者caz68

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:50:19