【问题标题】:Pre defining multi dimensional array in Excel VBA在 Excel VBA 中预定义多维数组
【发布时间】:2011-08-04 08:55:11
【问题描述】:

我知道我们可以使用以下方法在 excel VBA 中定义一维数组

 GroupCols = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L")

如何以同样的方式预定义多维数组?

我还想通过以下方式跟踪某些级别

 Level[16][0]
 Level[16][1]
 Level[16][2]

 Level[8][0]
 Level[8][1]
 Level[8][2]

 Level[7][0]
 Level[7][1]
 Level[7][2]

第一个索引定义了级别,因此可能不是连续的......就像 16 之后有直的 8 等等。对于每个我需要 3 个信息,即 0、1、2 秒索引。

谁能指导我如何在 excel VBA 中达到同样的效果?

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    有一种方法可以通过使用 evaluate() 来定义二维数组,就像使用 array() 来定义一维数组一样:

    Sub Array2DWithEvaluate()
    
    Dim Array2D As Variant
    
    '[] ist a shorthand for evaluate()
    'Arrays defined with evaluate start at 1 not 0
    
    Array2D = [{"1,1","1,2","1,3";"2,1","2,2","2,3"}]
    
    Debug.Print Array2D(2, 2) '=> 2,2
    
    End Sub
    

    如果你想使用字符串来定义数组,你必须像这样使用它

    Sub Array2DWithEvaluateFromString()
    
    Dim strValues As String
    Dim Array2D As Variant
    
    strValues = "{""1,1"",""1,2"",""1,3"";""2,1"",""2,2"",""2,3""}"
    
    Array2D = Evaluate(strValues)
    
    Debug.Print Array2D(2, 2) '=> 2,2
    
    End Sub
    

    如果您想了解更多关于函数 Evaluate() 其他用途的信息,请查看这篇精彩的帖子。

    http://www.ozgrid.com/forum/showthread.php?t=52372

    【讨论】:

      【解决方案2】:

      你不能在这样的数组中有不连续的索引。如果您只使用索引的非连续子集,那么所有其他元素将是空的,但仍会占用存储空间,这既低效又容易出错(LaunchMissile = Levels(17,1),哎呀!)。

      您正在寻找的是 Dictionary 对象。使用前,必须按如下方式设置参考:工具 > 参考 > 检查 Microsoft Scripting Runtime。

      例子:

      Dim Levels As Scripting.Dictionary
      Set Levels = New Scripting.Dictionary
      
      ' Fill up the dictionary
      Levels.Add Key:=16, Item:=Array("A", "B", "C")
      Levels.Add Key:=8, Item:=Array("FAI", "CNT", "YES")
      Levels.Add Key:=7, Item:=Array("Once", "Twice", "Thrice")
      
      ' Retrieve items from the dictionary
      Debug.Print Levels.Item(8)(0)
      Debug.Print Levels.Item(8)(1)
      Debug.Print Levels.Item(8)(2)
      

      请注意,Collection 对象也可以解决问题。优点:VBA原生,无需设置引用。缺点:密钥是只写的,这可能很尴尬。

      【讨论】:

        【解决方案3】:

        您可以使用Array(Array()) 表示例如

        data = Array(Array(1,2), Array(3,4))
        

        要引用第一个元素,请使用data(0)(0)

        (复制from here

        【讨论】:

        • 为什么要这样做而不是二维数组?这似乎过于复杂,但可能是有原因的......
        • 在某些情况下,它可以让您避免几乎为空的矩阵。
        • 怎么样?数组数组data(i)(j) 包含的元素总数与等效的二维数组data2D(i,j) 不一样?
        • 如果第一个维度只需要7、8和16,那么data(2)将为空。
        • 明白了。谢谢。这是一个很好的解决方案...但是您仍然在所有空白处存储 Variant Empty,即在这种特殊情况下仍然存储 1 个元素而不是 3 个元素。对于稀疏数据集而言效率不是很高。无论如何,+1
        【解决方案4】:

        无法像使用 array() 函数那样声明和填充二维数组。您可以使用 ReDim 定义数组维度,然后填充它。这是一个例子:

        ReDim myArray(0 To 16, 0 To 3)
        myArray(0, 0) = "A"
        myArray(0, 1) = "B"
        ...
        

        不幸的是,当您创建一个数组时,将为从下限到上限的每个条目创建一个元素。它们将是空的,但它们就在那里,所以你需要注意它,特别是如果你打算循环遍历它。

        【讨论】:

          猜你喜欢
          • 2014-11-15
          • 1970-01-01
          • 2021-08-24
          • 1970-01-01
          • 1970-01-01
          • 2020-09-23
          • 1970-01-01
          • 1970-01-01
          • 2014-09-25
          相关资源
          最近更新 更多