从不同工作表复制范围并将其存储到数组中的最佳方法

时间:2019-01-26 23:51:21

标签: excel vba

我正在尝试从不同的工作表中复制范围并将它们存储在数组中。什么是最好的方法 ? 我知道UNION不能在不同的工作表上工作,所以这是我正在做的事情,它正在工作,但是我想知道是否有更好的方法。 预先感谢

    Dim MyArray As Variant

Worksheets("Sheet1").Range("A1:A" & Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row).Copy Worksheets("main").Range("A1")
Worksheets("Sheet2").Range("B1:B" & Worksheets("Sheet2").Cells(Rows.Count, 2).End(xlUp).Row).Copy Worksheets("main").Range("A11")
Worksheets("Sheet3").Range("C1:C" & Worksheets("Sheet3").Cells(Rows.Count, 3).End(xlUp).Row).Copy Worksheets("main").Range("A15")

    MyArray = Worksheets("main").Range("A1:A20").Value

1 个答案:

答案 0 :(得分:0)

您似乎误解了PEH的意图。我正在对此进行解释和扩展。这是他建议您缓存的工作表的图片。

Worksheet layout

您要缓存范围B2:D7(或将来的E7)。这是执行缓存的代码。

Sub GetTemplateAddresses(AddList As Variant)
    ' loads AddList only if not already loaded

    Dim Rng As Range                ' Range of cached addresses table
    Dim Rl As Long                  ' last used row in Ws "Cache"

    If IsEmpty(AddList) Then                    ' skip if AddList is already set
        With Worksheets("Cache")                ' use your own name for this worksheet
            Rl = .Cells(.Rows.Count, "A").End(xlUp).Row
            ' start from B2 to (LastRow of Template3)
            Set Rng = .Range(.Cells(2, 2), .Cells(Rl, Ncc3 + 1))
            AddList = Rng.Value
        End With
    End If
End Sub

在调用此子程序之前,需要做一些准备。观察该子项具有参数 AddList 。这个想法(由@PEH提供)是,如果它已经被缓存,则不需要再次对其进行缓存。因此,您提供了数组变量,并且代码仅在其为空白时才加载它。

另一种准备是在上面的代码中引用枚举 Ncc3 。枚举旨在简化整个AddList数组的寻址。请注意,在该工作表上的任何步骤之前,它必须位于任何标准代码模块的顶部。这是完整的枚举。 显式选项

Enum Ncc                            ' Array of Cached addresses
    Ncc1 = 1                        ' Template 1
    Ncc2
    Ncc3
    NccFname = 1                    ' assign integers only
    NccMname                        ' if no value is assigned,
    NccLname                        ' VBA assigns previous + 1
    NccCity
    NccStreet
    NccZip
    NccTel
    NccEmail                        ' NccEmail = 8 (test with ? NccEmail in the Immediate window)
End Enum

我为您设计了一些测试程序。将其安装在标准代码模块中,为什么不在上面的枚举和其调用的子代码下方?

Private Sub TestGetAdd()
    Dim AddList As Variant
    Dim TemplateNumber As Ncc, FieldName As Ncc

    GetTemplateAddresses AddList
    TemplateNumber = Ncc2                   ' change the numbers for testing
    FieldName = NccStreet                   ' the press F5
    MsgBox "You have entered template No. " & TemplateNumber & vbCr & _
           "and specified field No. " & FieldName & String(2, vbCr) & _
           "The address is " & AddList(FieldName, TemplateNumber)
End Sub

已准备好运行。测试一下。

要使用整个设置,您现在可以在知道工作表的名称及其模板编号之后继续从任何模板定义单元格。 Ws.Range(AddList(NccCity,Ncc2))。Value将根据缓存中存储的字段的地址,从模板2返回城市名称。