首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将VBA集合写入Excel表

如何将VBA集合写入Excel表
EN

Stack Overflow用户
提问于 2013-08-14 09:29:09
回答 2查看 39.6K关注 0票数 9

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

代码将二维集合依次循环遍历到新的工作表中。我以前从未使用过集合,并且希望将集合一次写到工作表上。当表有很多记录时,当前的代码需要相当长的时间。

有没有办法把整个集合转换成二维数组,或者这样我就可以一次写二维数组了?或者是否有一种方法可以将整个集合写入工作表,就像使用二维数组一样?我一直试图寻找这一点,但至今没有成功。任何一般性意见都将不胜感激!

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

定义了类模块,命名为TableEntry

代码语言:javascript
复制
Public Item1 As String
Public Item2 As String
Public Item3 As String
Public Item4 As Integer
Public Item5 As Integer

主例程-创建集合,填充集合,将集合写入工作表

代码语言:javascript
复制
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-填充集合

代码语言:javascript
复制
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-将集合写到工作表

EN

Stack Overflow用户

回答已采纳

发布于 2013-08-14 11:04:40

我认为将字典打印到Excel电子表格中最简单的方法是使用WorksheetFunction.Transpose(Variant类型的Array)

以下代码

  • 创建包含键和项的示例字典
  • 创建两个数组(键、项),一次用字典中的元素填充它们
  • 使用WorksheetFunction.Transpose(VariantArray)一次打印数组

代码语言:javascript
复制
Option Explicit

“添加对的引用”>> Tools >> Reference >> Microsoft脚本运行时

代码语言:javascript
复制
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是一个集合)

代码语言:javascript
复制
Range("A1:A" & table.Count) = WorksheetFunction.Transpose(table)

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

如果不对集合进行迭代,就不能将集合转到电子表格。

要加快这一进程,你可以做的是:

  • 关闭Application.ScreenUpdating
  • 遍历集合并将值复制到数组中,然后使用WorksheetFunction.Transpose()一次性将所有内容打印到工作表(使用答案的第一部分中的逻辑)

后续行动:

在您的例子中,您可以这样重写Sub WriteCollectionToSheet(ByRef table As Collection) (代码看起来有点难看,但效率应该可以)

代码语言:javascript
复制
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的更多详细信息

票数 10
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18227942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档