Использование массивов с циклами

Добрый день всем, У меня есть несколько страниц, и я хочу объединить их все в отдельные массивы, но не смог. Заранее спасибо тем, кто поможет.


Option Explicit
Dim d1() As Variant, d2() As Variant, d3() As Variant, d4() As Variant, d5() As Variant, d6() As Variant
Dim d7() As Variant, d8() As Variant, d9() As Variant, d10() As Variant, d11() As Variant, d12() As Variant
Dim personel As Collection, sonuc() As Variant

Sub examples()
Dim i As Integer
d1 = Sheet1.Range("A4:AX34")
d2 = Sheet2.Range("A4:AX34")
d3 = Sheet3.Range("A4:AX34")
d4 = Sheet4.Range("A4:AX34")
d5 = Sheet5.Range("A4:AX34")
d6 = Sheet6.Range("A4:AX34")
d7 = Sheet7.Range("A4:AX34")
d8 = Sheet8.Range("A4:AX34")
d9 = Sheet9.Range("A4:AX34")
d10 = Sheet10.Range("A4:AX34")
d11 = Sheet11.Range("A4:AX34")
d12 = Sheet12.Range("A4:AX34")
End Sub

Есть ли ошибка? Есть вопрос? Это может быть проблема XY, когда вы пытаетесь решить что-то одним способом, в то время как есть гораздо более простой способ, который в настоящее время не может быть определен из-за отсутствия контекста (информации). Также нам, скорее всего, потребуется объяснение того, что вы планируете с этим делать (продолжение кода или код другой процедуры, в которой вы используете заполняемые переменные). Вы можете отредактируй свой пост в любое время.

VBasic2008 20.03.2022 08:40

Пожалуйста, уточните вашу конкретную проблему или предоставьте дополнительную информацию, чтобы выделить именно то, что вам нужно. Как сейчас написано, трудно точно сказать, о чем вы спрашиваете.

Community 20.03.2022 13:11
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
2
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Option Explicit
Dim d(12) As Variant

Sub example1()
    d(1) = Sheet1.Range("A4:AX34")
    d(2) = Sheet2.Range("A4:AX34")
    d(3) = Sheet3.Range("A4:AX34")
    d(4) = Sheet4.Range("A4:AX34")
    d(5) = Sheet5.Range("A4:AX34")
    d(6) = Sheet6.Range("A4:AX34")
    d(7) = Sheet7.Range("A4:AX34")
    d(8) = Sheet8.Range("A4:AX34")
    d(9) = Sheet9.Range("A4:AX34")
    d(10) = Sheet10.Range("A4:AX34")
    d(11) = Sheet11.Range("A4:AX34")
    d(12) = Sheet12.Range("A4:AX34")
End Sub

Однако неясно, чего вы пытаетесь достичь. Я не уверен, что значит просто присвоить вариант диапазону. Если вы пытаетесь, чтобы каждая переменная (или элемент массива) ссылалась на диапазон на каждом листе, вам нужно будет использовать ключевое слово set для привязки переменной (или элемента массива) к объекту. В этом случае несколько эффективнее объявить массив типа range вместо variant следующим образом. Я добавил цикл для печати значения из первой строки, третьего столбца в диапазоне на каждом листе (это ячейка C4 на листе) в демонстрационных целях.

Option Explicit
Dim d(12) As Range

Sub example1()
    Dim i As Integer
    Set d(1) = Sheet1.Range("A4:AX34")
    Set d(2) = Sheet2.Range("A4:AX34")
    Set d(3) = Sheet3.Range("A4:AX34")
    Set d(4) = Sheet4.Range("A4:AX34")
    Set d(5) = Sheet5.Range("A4:AX34")
    Set d(6) = Sheet6.Range("A4:AX34")
    Set d(7) = Sheet7.Range("A4:AX34")
    Set d(8) = Sheet8.Range("A4:AX34")
    Set d(9) = Sheet9.Range("A4:AX34")
    Set d(10) = Sheet10.Range("A4:AX34")
    Set d(11) = Sheet11.Range("A4:AX34")
    Set d(12) = Sheet12.Range("A4:AX34")

    For i = 1 To 12
        Debug.Print d(i).Cells(1, 3).Address, d(i).Cells(1, 3).Value
    Next
End Sub

Этот код немного длиннее, чем мне хотелось бы, но мы должны обращаться к каждому листу по имени его объекта. Если имена листов имеют шаблон, похожий на кодовые имена, мы можем значительно сократить код:

Option Explicit
Dim d(12) As Range

Sub example1()
    Dim i As Integer
    
    For i = 1 To 12
       Set d(i) = ThisWorkbook.Worksheets("Sheet" & i).Range("A4:AX34")
       Debug.Print d(i).Cells(1, 3).Address, d(i).Cells(1, 3).Value
    Next
    
End Sub

Важной особенностью массивов в VBA является то, что они начинают считать с 0, а не с 1. Таким образом, во всех приведенных выше примерах у нас есть неиспользуемый элемент массива в самом начале. Мы можем ввести директиву компилятора (Option Base 1) поверх кода, чтобы указать интерпретатору VBA начинать подсчет массивов с 1 следующим образом:

Option Base 1
Option Explicit
Dim d(12) As Range

Sub example1()
    Dim i As Integer
    
    For i = 1 To 12
       Set d(i) = ThisWorkbook.Worksheets("Sheet" & i).Range("A4:AX34")
       Debug.Print d(i).Cells(1, 3).Address, d(i).Cells(1, 3).Value
    Next
    
End Sub

Однако я думаю, что чаще всего это делается для того, чтобы массивы считались с нуля и просто смещали индекс массива по мере необходимости следующим образом:

Option Explicit
Dim d(11) As Range

Sub example1()
    Dim i As Integer
    
    For i = 0 To 11
       Set d(i) = ThisWorkbook.Worksheets("Sheet" & i + 1).Range("A4:AX34")
       Debug.Print d(i).Cells(1, 3).Address, d(i).Cells(1, 3).Value
    Next
    
End Sub

Это все хорошо, но мы часто не знаем, сколько элементов нам нужно в массиве до запуска кода. Чтобы сделать размер массива динамическим, мы объявляем массив без указания размера и используем оператор ReDim для установки его размера во время выполнения (обратите внимание на пустые круглые скобки при объявлении массива и использование оператора «Ubound» в операторе «Ubound»). Для цикла, чтобы найти верхнюю границу массива):

Option Explicit
Dim d() As Range

Sub example1()
    Dim i As Integer
    ReDim d(ThisWorkbook.Worksheets.Count - 1)
    For i = 0 To UBound(d)
       Set d(i) = ThisWorkbook.Worksheets("Sheet" & i + 1).Range("A4:AX34")
       Debug.Print d(i).Cells(1, 3).Address, d(i).Cells(1, 3).Value
    Next
    
End Sub

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

Option Explicit
Dim d As New Collection

Sub example1()
    Dim i As Integer
    
    For i = 1 To ThisWorkbook.Worksheets.Count
       d.Add ThisWorkbook.Worksheets("Sheet" & i).Range("A4:AX34")
       Debug.Print d(i).Cells(1, 3).Address, d(i).Cells(1, 3).Value
    Next
    
End Sub

Обратите внимание, что коллекции начинают считаться с 1.

К вашему сведению, вы можете указать нижнюю границу, когда вы затемняете массив Dim d(1 To 12) As Range

chris neilsen 20.03.2022 15:33

Дорогой Гоув, Каждая страница представляет месяц в году. Заработная плата персонала доступна на каждой странице (т.е. каждый месяц). Я хочу видеть кадровые данные на этих страницах в сумме на одной странице. Но персонал не стабилен в течение месяцев. По этой причине мне нужно сделать некоторые операции. Поскольку это было бы медленно с точки зрения скорости, я хотел выполнять операции внутри массивов вместо того, чтобы копировать эти данные на страницу и выполнять операции там. Что я на самом деле хочу сделать и узнать. Мы можем перемещаться по страницам в цикле. Сделайте то же самое с массивами.

MurtiCom 20.03.2022 15:47

@MurtiCom, это имеет больше смысла. давайте сделаем это: примите этот ответ и напишите новый вопрос с более подробной информацией. Нам нужно знать, как называются листы (например, январь, февраль и т. д.). Также покажите структуру данных в табелях по месяцам, обязательно укажите, как определить, когда сотрудник один и тот же от листа к листу и что нужно агрегировать по месяцам. Как только это будет опубликовано, укажите это в комментарии здесь, и я посмотрю. Это звучит как довольно простая проблема, как только она подробно объяснена.

Gove 20.03.2022 16:14

Другие вопросы по теме