VBA创建编译时未知大小二维数组遇'Constant expression required'错误
VBA中创建编译时大小未知的二维数组
为什么只有entries报错?
symbols是Object类型变量,编译阶段VBA无法解析symbols.Count的具体属性和值,只会将其视为一个未明确的表达式,因此不会在编译时触发错误(但运行时若symbols未正确初始化,仍会抛出异常)。entries是明确的Integer变量,VBA编译时能识别出这是变量而非常量表达式(编译时可确定的值),而固定大小数组的下标必须是常量,因此直接报错“Constant expression required”。
创建动态二维数组的正确方式
VBA中要创建运行时才能确定大小的数组,必须使用动态数组,具体步骤如下:
1. 声明无大小的数组
先用Dim声明数组,不指定任何下标:
Dim sheet() As String
2. 运行时用ReDim指定维度
在获取到symbols.Count和dictionary.Count的实际值后,通过ReDim设置数组的具体大小:
Dim symbols As Object Set symbols = CreateObject("System.Collections.ArrayList") ' 先向symbols添加元素,例如:symbols.Add "Symbol1" Dim dictionary As Object Set dictionary = CreateObject("Scripting.Dictionary") ' 先向dictionary添加键值对,例如:dictionary.Add "Key1", "Value1" Dim entries As Integer entries = dictionary.Count ' 运行时指定数组大小,这里默认下标从0开始 ReDim sheet(symbols.Count - 1, entries - 1) As String ' 若需要下标从1开始,可写成: ' ReDim sheet(1 To symbols.Count, 1 To entries) As String
3. 保留数据修改数组大小(可选)
如果后续需要调整数组大小同时保留已有数据,使用ReDim Preserve,但注意Preserve仅支持修改数组的最后一维:
' 示例:扩展第二维的大小并保留原有数据 ReDim Preserve sheet(LBound(sheet, 1) To UBound(sheet, 1), 1 To entries + 3) As String
内容的提问来源于stack exchange,提问作者Nocxy
相关产品推荐
相关产品推荐

