Excel vba:for循环中需要的常量expression式
我有一个函数返回一个Dictionary
与双键值。 然后我继续使用这样的对来创build一个数组:我得到一个键“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
Dim
语句不可执行; 你不能把一个断点放在一个Dim
语句上,只要进入本地范围,它就会“运行”,在“静态上下文”中,也就是说它不能(也不能)知道任何存在于“执行上下文“,像其他本地variables的值。
因此, Dim foo(1 To SomeVariable)
是非法的,因为SomeVariable
不是一个在编译时已知的常量expression式 :没有执行上下文 , SomeVariable
没有值,数组也不能被静态resize。
如果你想要一个dynamic大小的数组,你需要声明一个dynamic数组ReDim
语句是可执行的:
ReDim resultArray(1 To DATA_ITEMS_NUMBER) As String
请注意, Dim resultArray()
语句不是必需的,因为ReDim
将会执行分配:您将不会得到一个“未声明的variables”编译时错误与ReDim foo(...)
Dim foo
和Option Explicit
指定。
对于良好的表单, Function
过程应该有一个明确的返回types:
'returns a Scripting.Dictionary instance Function getGlobalVariables() As Object
和
'returns a Variant array Function getBudgetItemInfos(infoType As String, year As Integer) As Variant
否则(特别是Object
返回函数),你将函数的返回值包装在一个Variant
,VBA需要在呼叫站点比它应该更努力地工作。