Лучший способ скопировать диапазоны с разных листов и сохранить их в массиве - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь скопировать диапазоны с разных листов и сохранить их в массиве. какой самый лучший способ? Я знаю, что 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 голосов
/ 27 января 2019

Похоже, вы неправильно поняли намерение 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 .Enum предназначен для простой адресации всего массива 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)). Значение будет возвращать название города из шаблона 2 в соответствии с адресом этого поля, хранящегося в кэше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...