我有一个函数返回带有键值的Dictionary
。然后我继续使用这样的对来创建一个数组:我得到一个键值#34; DATA_ITEMS_NUMBER"确定阵列'最长长度。但是它会导致错误......
Function getGlobalVariables()
Dim resultDict As Object
Set resultDict = CreateObject("Scripting.Dictionary")
resultDict.Add "DATA_ITEMS_NUMBER", _
ThisWorkbook.Worksheets("setup").Cells(25, 5).value
Set getGlobalVariables = resultDict
End Function
Function getBudgetItemInfos(infoType As String, year As Integer)
Dim globals As Object
Set globals = getGlobalVariables()
Dim DATA_ITEMS_NUMBER As Integer
DATA_ITEMS_NUMBER = globals("DATA_ITEMS_NUMBER")
Dim resultArray(1 To DATA_ITEMS_NUMBER) As String
...
End Function
答案 0 :(得分:2)
Dim
语句不可执行;你不能在Dim
语句上放置断点,它在“静态上下文”中输入本地范围后“运行”,即它不会(也不能)知道任何与其他局部变量的值一样,它存在于“执行上下文”中。
因此,Dim foo(1 To SomeVariable)
是非法的,因为SomeVariable
不是在编译时已知的常量表达式:没有执行上下文, SomeVariable
没有值,数组不能是静态大小。
如果你想要一个动态大小的数组,你需要声明一个动态数组 - ReDim
语句是可执行的:
ReDim resultArray(1 To DATA_ITEMS_NUMBER) As String
请注意,Dim resultArray()
语句不是必需的,因为ReDim
无论如何都要执行分配:你不会得到一个带有{{变量未声明的“编译时错误1}}没有指定前面的ReDim foo(...)
和Dim foo
。
对于良好的表单,您的Option Explicit
过程应具有明确的返回类型:
Function
和
'returns a Scripting.Dictionary instance
Function getGlobalVariables() As Object
否则(特别是对于'returns a Variant array
Function getBudgetItemInfos(infoType As String, year As Integer) As Variant
- 返回函数),您将函数的返回值包装在Object
中,并且VBA需要在调用站点上更加努力地工作。