Макрос загрузки массивов Excel - PullRequest
3 голосов
/ 04 января 2012

Я не уверен, как сформулировать вопрос, но я столкнулся с проблемой, когда мне нужно загрузить список имен из группы листов в отдельные массивы.

Например, Sheet 1, Column A имеет 10 имен для загрузки в array1, Sheet 2, Column A имеет 14 имен для загрузки в array2.

Я знаю, что это может быть жестко запрограммировано в макрос для загрузки их всех, но список имен не является фиксированной длиной и стесняется большого количества кода, мне было интересно, можно ли это сократить.

Способ, которым мой разум сказал бы мне сделать это, ниже.

Dim tarray1 As Variant
Dim tarray2 As Variant
Dim tarray3 As Variant

For f = 1 To 3

    Sheets("Region " & f).Select
    With ActiveSheet
        lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row
        tarray& f = ActiveSheet.Range("A2:A" & lastrow)
    End With


Next

На самом листе, о котором идет речь, имеется 10 отдельных листов для чтения имен при переходе из Региона 1 в 10. Таким образом, будет 10 отдельных таблиц. Это сделано для целей отчетности и будет передаваться взад и вперед по листам.

Однако tarray & f явно недействителен и выдает ошибки компиляции.

Кто-нибудь может придумать, как обойти это?

Надеюсь, кто-то может помочь.

Ответы [ 2 ]

5 голосов
/ 04 января 2012

Следующая процедура показывает вам, как использовать зубчатый массив вариантов, который, как я считаю, является необходимой вам техникой.

Я загрузил разное количество ячеек из первых десяти строк рабочего листа в TArray. Я использую Debug.Print, чтобы показать, как получить доступ к элементам.

Sub Test()

  Dim InxCol As Integer
  Dim InxRow As Integer
  Dim InxTA As Integer
  Dim TArray() As Variant

  ReDim TArray(1 To 10)

  With Sheets("xxxxx")

  For InxTA = 1 To 10
    ' There must be at least two cells in each range if the result is to be an
    ' array.  The access code relies on TArray being a true array of arrays.
    ' If this is not possible, you can test for TArray(N) being an array
    ' or a variable using VarType
    TArray(InxTA) = .Range(.Cells(InxTA, 1), .Cells(InxTA, 12 - InxTA)).Value
  Next

  End With

  For InxTA = 1 To 10
    For InxRow = LBound(TArray(InxTA), 1) To UBound(TArray(InxTA), 1)
      For InxCol = LBound(TArray(InxTA), 2) To UBound(TArray(InxTA), 2)
        Debug.Print TArray(InxTA)(InxRow, InxCol) & " ";
      Next
    Next
    Debug.Print
  Next

End Sub

Новый материал

Я решил добавить объяснение, чтобы мой ответ был полным.

Вы можете установить вариант на что угодно, а затем установить его на что-то другое. Следующее может быть глупо, но это работает:

Dim V As Variant

V = 5
Debug.Print V
V = "Today"
Debug.Print V
V = Array(1, 2, 3)
Debug.Print V(0) & " " & V(1) & " " & V(2)

Рассмотрим: Range( xxx ).Value

Если xxx - одна ячейка, она возвращает одну переменную. Во всех остальных случаях он возвращает двумерный массив. Первое измерение для строк, а второе для столбцов. Это противоположно обычной практике, но соответствует Cells(R, C).Value.

Я объявил:

Dim TArray() As Variant
Redim TArray(1 to 10)

Итак, TArray - массив вариантов

Я тогда установил TArray(N) = Range( xxx ).Value

Если xxx представляет собой одну ячейку, TArray (N) будет одним значением.

Но если xxx - это две или более ячеек, TArray (N) - это двумерный массив. Чтобы получить доступ к отдельной ячейке в TArray, я должен указать элемент TArray, а затем строку и столбец диапазона. Таким образом:

TArray(Element)(Row, Column)

Каждый элемент TArray может иметь размер, отличный от любого другого элемента. Один может быть одной переменной, другой - диапазоном строк, другой - диапазоном столбцов и еще одним прямоугольником.

Поначалу это трудно обдумать. Нет - удалить "сначала". Играйте с этим функционалом. Делайте то, что я сделал, и загружайте строки, столбцы и прямоугольники из одной из ваших таблиц.

2 голосов
/ 05 января 2012

Все благодарности @Tony Dallimore за идею Array or Array.Это предлагается только в качестве дополнения к его ответу.

Для загрузки всех данных листов в массив используйте

Dim TArray() as Variant
Dim sh as Worksheet

ReDim TArray(1 To ActiveWorkbook.Worksheets.Count)

For each sh in ActiveWorkbook.Worksheets
    TArray(sh.Index) = sh.UsedRange ' or to get just Column A: sh.UsedRange.Columns(1)
Next

Или для загрузки подмножества листов, имена которых соответствуют шаблону

i = 1
For each sh in ActiveWorkbook.Worksheets
    If sh.Name Like "Region *" Then
         TArray(i) = sh.UsedRange ' or to get just Column A: sh.UsedRange.Columns(1)
         i = i + 1
    End If
Next

Опять же, спасибо Тони: если ОП склонен принять это, пожалуйста, примите ответ Тони вместо

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