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 fooOption 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需要在呼叫站点比它应该更努力地工作。