如何将VBA集合写入Excel工作表

我有一些现有的代码,我正在修改。 此代码从预先存在的工作表中创build一个行集合。 它创build了一个大型的二维集合,每列都有独特的信息。 有一个单独的类模块为每个列声明数据types。

该代码通过循环遍历每个项目,将2D集合写入新的工作表。 我从来没有使用过一个集合,并希望一次性将集合写入表单。 当表有很多logging时,当前代码需要相当长的时间。

有没有办法将整个集合转换成二维数组,或者让我可以一次写入二维数组? 还是有办法将整个集合写入表单,就像使用二维数组一样? 我试图寻找这个,迄今为止不成功。 任何一般的观点,将不胜感激!

下面是一些示例代码,用粗体注释来说明如何使用集合。

定义类模块,命名为TableEntry

Public Item1 As String Public Item2 As String Public Item3 As String Public Item4 As Integer Public Item5 As Integer 

主要例程 – 创build集合,填充集合,将集合写入表单

 Sub MainRoutine() Dim table As Collection Set table = New Collection Call FillCollection(File As String, ByRef table As Collection) Call WriteCollectionToSheet(ByRef table As Collection) 

子例程1 – 填充集合

 Dim wb As Workbook Set wb = Workbooks.Open(File) Dim ws As Worksheet For Each ws In ActiveWorkbook.Worksheets Dim R As Range Set R = ws.Range("A2") Dim e As TableEntry For i = 1 To 20 Set e = New TableEntry e.Item1 = R.Offset(i + 1, 0).Offset(0, 0) e.Item2 = R.Offset(i + 1, 0).Offset(0, 1) e.Item3 = R.Offset(i + 1, 0).Offset(0, 2) e.Item4 = R.Offset(i + 1, 0).Offset(0, 3) e.Item5 = R.Offset(i + 1, 0).Offset(0, 4) table.Add e Next i Next ws 

子例程2 – 将集合写入表单

我想最简单的方法来打印到Excel电子表格字典是通过使用WorksheetFunction.Transpose( Variant types Array )

下面的代码

  • 用键和项创build示例词典
  • 创build两个数组(键,项目) ,并用“词典” 元素 一次性填充它们
  • 使用WorksheetFunction.Transpose(VariantArray)打印数组
 Option Explicit 

“添加引用到Microsoft脚本运行时”>>工具>>引用>> Microsoft脚本运行时

 Sub CollectionToArrayToSpreadSheet() Cells.ClearContents ' think of this collection as ' key = cell.row ' item = cell.value Dim dict As New Dictionary dict.Add Key:=1, Item:="value1" dict.Add Key:=2, Item:="value2" dict.Add Key:=3, Item:="value3" ' THIS WAY 'Range("A1:A" & UBound(dict.Keys) + 1) = WorksheetFunction.Transpose(dict.Keys) 'Range("B1:B" & UBound(dict.Items) + 1) = WorksheetFunction.Transpose(dict.Items) ' OR Range("A1").Resize(UBound(dict.Keys) + 1, 1) = WorksheetFunction.Transpose(dict.Keys) Range("B1").Resize(UBound(dict.Items) + 1, 1) = WorksheetFunction.Transpose(dict.Items) End Sub 

更新:

在你的情况下…

如果这是你想要做的( 注意 table 是一个集合

 Range("A1:A" & table.Count) = WorksheetFunction.Transpose(table) 

不幸的是,答案是否定的。

您无法将集合转换为电子表格,而无需迭代集合。

你可以做什么来加快这个过程是:

  • closuresApplication.ScreenUpdating
  • 迭代集合并将值复制到一个数组中,然后使用WorksheetFunction.Transpose()将所有内容一次打印出来( 使用答案第一部分的逻辑

跟进:

在你的情况下,你可以像这样重写Sub WriteCollectionToSheet(ByRef table As Collection)代码看起来有点丑陋,但效率应该可以

 Sub WriteCollectionToSheet(ByRef table As Collection) Dim dict1 As New Dictionary Dim dict2 As New Dictionary Dim dict3 As New Dictionary Dim dict4 As New Dictionary Dim dict5 As New Dictionary Dim i As Long For i = 1 To table.Count dict1.Add i, table.Item(i).Item1 dict2.Add i, table.Item(i).Item2 dict3.Add i, table.Item(i).Item3 dict4.Add i, table.Item(i).Item4 dict5.Add i, table.Item(i).Item5 Next i Range("A1:A" & UBound(dict1.Items) + 1) = WorksheetFunction.Transpose(dict1.Items) Range("B1:B" & UBound(dict2.Items) + 1) = WorksheetFunction.Transpose(dict2.Items) Range("C1:C" & UBound(dict3.Items) + 1) = WorksheetFunction.Transpose(dict3.Items) Range("D1:D" & UBound(dict4.Items) + 1) = WorksheetFunction.Transpose(dict4.Items) Range("E1:E" & UBound(dict5.Items) + 1) = WorksheetFunction.Transpose(dict5.Items) End Sub 

有关VBA集合迭代和打印到Sheet @ vba4all.com的更多详细信息

如果我想写一个二维数组,我已经在代码中填充到工作表中,我使用这个代码。 这是非常有效的,因为它只能“一次”地向工作表“讲话”

 Dim r as Range Dim var_out as Variant Set r = Range("OutputValues") r.clear var_out = r.value 'Then use code to appropriately fill the new 2D array var_out, such as your subroutine 1 above r.value = var_out 

首先确定要将数组打印到的工作簿中的范围。 在这个例子中,我假设我命名输出范围“OutputValues”。

r.value到var_out的第一个赋值(我想要填充的数组variables)根据范围的大小来设置数组variables的大小。 (它也读取范围内的任何现有值,所以如果你不想要的话,清除范围,因为我已经显示在这里)。

将数组variables的第二个赋值范围写回到表单中。