VBA宏动态数组报Subscript Out of Range下标越界错误求助
错误原因与修复方案
核心问题1:变量隐式声明且未初始化
你代码中的变量x没有显式声明也没有初始化,VBA默认将其作为变体类型处理。如果上一次宏运行(包括异常退出的场景)后x残留了大于UBound(arrTemp)的数值,第一次运行时累加后的x会超出arrPBIs的下标范围,触发下标越界错误。
报错后VBA会清空所有运行时变量的残留值,x回到默认初始值0,因此第二次运行不会报错。
核心问题2:数组下标基准不明确
VBA默认数组下标从0开始,除非模块开头声明了Option Base 1。你从工作表Range读取的arrTemp是固定1基的二维数组,直接用UBound(arrTemp)重定义arrPBIs会出现下标基准不匹配的隐患,极端场景下也会触发越界。
修复后的代码参考
' 所有模块顶部首先添加Option Explicit,强制变量声明 Option Explicit ' 数组声明保持不变 Public arrPBIs() As Variant Public arrTemp() As Variant ' 过程内的代码修改如下 Sub 你的过程名() Dim iRw As Long, x As Long ' 显式声明所有变量 x = 0 ' 每次运行前显式初始化计数器 arrTemp = Worksheets("Prioritized PBIs Only").Range("B2:B6").Value ' 明确指定数组为1基,和Range读取的数组基准统一,指定第一维上界更稳妥 ReDim arrPBIs(1 To UBound(arrTemp, 1)) For iRw = 1 To UBound(arrTemp, 1) If arrTemp(iRw, 1) <> "" Then x = x + 1 arrPBIs(x) = arrTemp(iRw, 1) End If Next iRw ' 增加空值判断,避免所有单元格为空时x=0导致重定义出错 If x > 0 Then ReDim Preserve arrPBIs(1 To x) Else Erase arrPBIs ' 无有效数据时清空数组 End If End Sub
内容的提问来源于stack exchange,提问作者Jrules80
相关产品推荐
相关产品推荐

