【发布时间】: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) 中制作二维数组,但不是二维数组的数组。
这是我编写的用于制作二维数组的代码 - Dim 和 ReDim 行会引发语法错误。
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
其中sheetsArr 是Worksheets 的数组,我将引用的工作表复制到其中以避免另一个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 的评论中的建议,使用(行、列)将其重新调整到正确的尺寸)不起作用——你能给我正确的语法吗?
标签: arrays excel vba multidimensional-array outlook