代码之家  ›  专栏  ›  技术社区  ›  ThomasRones

是否可以根据VBA中预先存在的变量值声明常量?

  •  1
  • ThomasRones  · 技术社区  · 7 年前

    我需要创建一个多维数组,但我不知道数组的高度。 我得到这个值并将其存储在变量中。不幸的是,我不能在声明数组时使用变量,我需要使用常量。所以我想我可以从变量中声明一个常数,但在前面的一行中,我得到了相同的错误“需要常数表达式”。

    lr = Tables.Cells(Rows.Count, 1).End(xlUp).Row
    
    Const constlr As Integer = lr
    
    Dim TableNamesArr(2 To constlr, 1 To 4) As String
    Dim i As Integer, j As Integer
    
    For i = 2 To lr
        For j = 1 To 4
            TableNamesArr(i, j) = Tables.Cells(i, j).Value
        Next j
    Next i
    

    目前,3号线是问题所在- Const constlr As Integer=lr

    但是如果我去掉那一行,把所有constlr都改成lr,那么它就是第5行- Dim TableNamesArr(2 To lr, 1 To 4) As String .

    lr就是问题所在,它需要是整数或常量,但不是包含整数的变量

    如果我更改以下内容,代码可以正常工作:

    Const constlr As Integer = lr     
    

    Const constlr As Integer = 102
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   itsLex    7 年前

    您可以在Redim中使用变量,而不是在Dim中。实际上你不需要常数。

    lr = Tables.Cells(Rows.Count, 1).End(xlUp).Row
    Const constlr As Integer = lr
    Dim TableNamesArr() As String
    Redim TableNamesArr(2 To constlr, 1 To 4)
    Dim i As Integer, j As Integer
    For i = 2 To lr
        For j = 1 To 4
            TableNamesArr(i, j) = Tables.Cells(i, j).Value
        Next j
    Next i
    
        2
  •  1
  •   Przemyslaw Remin    7 年前

    您可以通过一种简单的方式从范围中读取值,而无需循环:

    Dim DirArray As Variant
    DirArray = Range("a1:a5").Value
    

    您可以通过选择或其他方法参考您的范围,而不是范围(“a1:a5”) Selection.Value Activesheet.UsedRange.Value .

    如果您的范围在表中,您可以尝试从 here :

    Sub MultiColumnTable_To_Array()
    
    Dim myTable As ListObject
    Dim myArray As Variant
    Dim x As Long
    
    'Set path for Table variable
      Set myTable = ActiveSheet.ListObjects("Table1")
    
    'Create Array List from Table
      myArray = myTable.DataBodyRange
    
    'Loop through each item in Third Column of Table (displayed in Immediate Window [ctrl + g])
      For x = LBound(myArray) To UBound(myArray)
        Debug.Print myArray(x, 3)
      Next x
    
    End Sub