【问题标题】:VBA- Create an Array of Multi-dimensional ArraysVBA-创建多维数组的数组
【发布时间】:2018-08-09 18:38:23
【问题描述】:

为了提高大型电子表格的 VBA 代码的性能,我将工作表转换为程序可以引用的 Strings 的二维数组,而不是打开并循环遍历内存密集型电子表格。这些工作表大大降低了我的计算机速度,目前宏比手动执行要慢(我已经删除了许多不必要的列并从这些工作表中删除了所有格式,并且似乎没有公式超出使用的范围 - 他们' re 也存储为 .xlsb。它们已经是原件大小的二分之一到三分之二,所以我认为不需要做任何其他事情来优化它们)。

请注意,我正在使用 Outlook 进行开发,但严重依赖 excel 表格中的数据 - 用例是一个电子邮件自动回复器,它在表格中搜索电子邮件中提供的 ID,然后使用电话号码。我有适当的参考,程序可以很好地打开床单,只是(痛苦地)慢慢地。

我想使用嵌套的For 循环以编程方式将电子表格加载到数组中,然后将这些数组存储在另一个数组中,以便依次循环它们。在我的研究中,我发现了在 VBA (How do I set up a "jagged array" in VBA?) 中制作锯齿状数组的代码,在 VBA (Multi-dimensional array in VBA for Microsoft Word on Mac) 中制作二维数组,但不是二维数组的数组。

这是我编写的用于制作二维数组的代码 - DimReDim 行会引发语法错误。

For k = LBound(sheetsArr) To UBound(sheetsArr)
        Dim myWbksArr(k)() As String
        ReDim myWbksArr(k)(sheetsArr(k).UsedRange.Rows.Count, sheetsArr(k).UsedRange.Columns.Count)
Next k

其中sheetsArrWorksheets 的数组,我将引用的工作表复制到其中以避免另一个for 循环也使用

Dim sheetsArr() As Worksheet, runningIndex As Long
runningIndex = 0
ReDim sheetsArr(1 To totalSheets) 'It would make sense to me to extend this syntax to an array as above, since an array is itself a type/object in other languages 
For j = LBound(myWbks) To UBound(myWbks) 'j iterates through the workbooks
    Set myWbks(j) = Workbooks.Open(FileName:=arr(j), UpdateLinks:=False)   'false should suppress update links msgbox
    For Each sh In myWbks(j).Worksheets 'iterates through the worksheets in each workbook
        sheetsArr(runningIndex) = sh  'add the worksheet to an array of worksheets so we don't have to use another for loop to get through the workbook layer too
        runningIndex = runningIndex + 1
    Next
Next j

使用 for 循环创建二维数组的正确语法是什么?

【问题讨论】:

  • "要设置多维数组,只需在数组名称的圆括号之间的第一个数字后添加一个逗号,然后添加另一个数字。像这样:Dim MyArray(5, 4) As Integer" homeandlearn.org/multidimensional_arrays.html
  • 这与设置一个锯齿状数组没有什么不同。 “锯齿状”部分只是 2D。
  • 或许,您需要Collection 的数组?
  • @Comintern 你是对的,但我认为Dim 存储在数组数组中的二维数组的语法 - Dim myWbksArr(k)() As String ReDim myWbksArr(k)(sheetsArr(k).UsedRange.Rows.Count, sheetsArr(k).UsedRange.Columns.Count) (将数组元素调暗为带 w/() 的数组,按照@Marcucciboy2 的评论中的建议,使用(行、列)将其重新调整到正确的尺寸)不起作用——你能给我正确的语法吗?
  • Excel VBA - How to Redim a 2D array查看这个答案。

标签: arrays excel vba multidimensional-array outlook


【解决方案1】:

也许这会有所帮助。 它将所有打开的工作簿的内容读入一个数组数组中。

您可能想要更改选择要存储的范围的方法,甚至可能想要更改决定要通过哪些工作簿的方法。但这应该给你一个想法:

Option Explicit
Sub wbtoArr()
    Dim wbsArr, wbArr
    Dim WB As Workbook, WS As Worksheet
    Dim I As Long, J As Long

ReDim wbsArr(1 To Workbooks.Count)
J = 0
For Each WB In Workbooks
    J = J + 1
    ReDim wbArr(1 To WB.Worksheets.Count)
    I = 0
    For Each WS In WB.Worksheets
        I = I + 1
        wbArr(I) = WS.UsedRange
    Next WS
    wbsArr(J) = wbArr
Next WB

End Sub

【讨论】:

    猜你喜欢
    • 2014-11-03
    • 2011-08-19
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    相关资源
    最近更新 更多