Excel vba:循环中所需的常量表达式

时间:2017-10-23 14:04:32

标签: excel vba excel-vba

我有一个函数返回带有键值的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

1 个答案:

答案 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需要在调用站点上更加努力地工作。