无论如何要写一个集合直接进入工作表?

有没有办法使用VBA直接写入一个工作表? 就像是

Worksheets("Sheet3").Range("C2") = MyCollection 

找不到任何可行的东西

编辑为“Class”方法添加代码,而不是已经发布的“Sub”方法

Jake答案的最接近的解决scheme将是Range类的扩展方法(可能命名为“WriteCollection”)。

不幸的是,VBA不允许这样(还有许多其他的)function,但是它可以通过类模块方法在一定程度上模仿


“class级”办法

  1. 插入类模块

    通过单击主菜单中的“插入 – >类模块”,将类模块插入到项目中

    您会在“项目pipe理器”窗口中的“类模块”节点下看到一个“Class1”子节点

  2. 重命名它

    将其起始名称更改为有意义的名称

    您可以通过在“项目pipe理器”窗口中单击类子节点并在“属性”窗口中编辑“(名称)”属性值(如果在VBE中没有此窗口,请按F4)

    让我们将其重命名为“MyRange”,但是您可以在随后的步骤中select提供的与其一致的任何名称

  3. 键入课程代码

    input类代码窗格(双击“项目pipe理器”窗口中的子节点类)并添加以下代码:

`

 Option Explicit '--------------------------------------------------------------------- 'Properties '--------------------------------------------------------------------- ' all 'Public' properties will be shown by Intellisense for every variable declared of this class Public Range As Range '<~~ declare a property of the "Range" class. it therefore will have all methods and property of a "Range" object '--------------------------------------------------------------------- '--------------------------------------------------------------------- 'Methods '--------------------------------------------------------------------- ' all 'Public' methods will be shown by Intellisense for every variable declared of this class Public Sub WriteCollection(myColl As Collection, Optional direction As Variant) '<~~ this will be the method to call and have a Collection written down into a range If IsMissing(direction) Then direction = "V" If direction = "V" Then Range.Resize(myColl.Count).Value = CollToRangeVertical(myColl) Else Range.Resize(, myColl.Count).Value = CollToRangeHorizontal(myColl) End If End Sub '--------------------------------------------------------------------- '--------------------------------------------------------------------- 'helpers '--------------------------------------------------------------------- ' these are subs/function needed for the inner functioning of the class, so they are declared as 'Private' to prevent their use from outside it Private Function CollToRangeVertical(myColl As Collection) As Variant CollToRangeVertical = Application.Transpose(CollToStrng(myColl)) End Function Private Function CollToRangeHorizontal(myColl As Collection) As Variant CollToRangeHorizontal = CollToStrng(myColl) End Function Private Function CollToStrng(myColl As Collection) As Variant Dim i As Long For i = 1 To myColl.Count CollToStrng = CollToStrng & CStr(myColl(i)) & "|" Next i If CollToStrng <> "" Then CollToStrng = Split(Left(CollToStrng, Len(CollToStrng) - 1), "|") End Function '--------------------------------------------------------------------- '--------------------------------------------------------------------- 
  1. 利用你的课

    将任何模块添加到您的类所在的同一个项目,然后键入以下示例

`

 Option Explicit Sub main() Dim MyCollection As New Collection Dim mRange As New MyRange '<~~ declare a variable of the MyRange class and set a new instance of it ' fill Collection MyCollection.Add "C" MyCollection.Add "B" MyCollection.Add "A" 'set the "Range" property of your "mRange" object of the "MyRange" class Set mRange.Range = Worksheets("Sheet3").Range("C2") '<~~ it can be set to any range in any open workbook and worksheet 'exploit "MyRange" class method(s) mRange.WriteCollection MyCollection '<~~ write down a collection "vertically" mRange.WriteCollection MyCollection, "H" '<~~ write down a collection "horizontally" 'exploit Excel "Range" class methods through the "Range" property of "MyRange" class object With mRange.Range .Offset(10, 1).Value = .Value & "- offsetted" '<~~ copy/paste values .Resize(.Rows.Count, 1).Sort Key1:=.Range("A1") '<~~ sort the collection you just wrote down End With End Sub 

“子”方法

你需要继续collections

不,对于Range对象没有这样简单的“方法”

无论如何,它的调用应该更加清楚地expression出你所希望的那个,因为你至less必须指定从初始单元格扩展收集项目的“方向”

但它也应该处理每个收集项目的实际types

只是为了一个练习,我放下了一个具有以下“签名”的“WriteColl”Sub:

 WriteColl, Range, Collection [, direction] 

方向是可选参数,用于指定从给定范围扩展粘贴收集项目的方向

因此可以如下使用:

 WriteColl Worksheets("Sheet3").Range("C2"), MyCollection 

要做到这一点,你必须在任何模块中包含以下代码:

 Option Explicit Sub main() Dim MyCollection As New Collection MyCollection.Add "A" MyCollection.Add "B" MyCollection.Add "C" WriteColl Worksheets("Sheet3").Range("C2"), MyCollection WriteColl Worksheets("Sheet3").Range("D2"), MyCollection, "H" End Sub 'method Sub WriteColl(myRng As Range, myColl As Collection, Optional direction As Variant) If IsMissing(direction) Then direction = "V" If direction = "V" Then myRng.Resize(myColl.Count).Value = CollToRangeVertical(myColl) Else myRng.Resize(, myColl.Count).Value = CollToRangeHorizontal(myColl) End If End Sub 'helpers Function CollToRangeVertical(myColl As Collection) As Variant CollToRangeVertical = Application.Transpose(CollToStrng(myColl)) End Function Function CollToRangeHorizontal(myColl As Collection) As Variant CollToRangeHorizontal = CollToStrng(myColl) End Function Function CollToStrng(myColl As Collection) As Variant Dim i As Long For i = 1 To myColl.Count CollToStrng = CollToStrng & CStr(myColl(i)) & "|" Next i If CollToStrng <> "" Then CollToStrng = Split(Left(CollToStrng, Len(CollToStrng) - 1), "|") End Function