Добрый день всем, У меня есть несколько страниц, и я хочу объединить их все в отдельные массивы, но не смог. Заранее спасибо тем, кто поможет.
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
Пожалуйста, уточните вашу конкретную проблему или предоставьте дополнительную информацию, чтобы выделить именно то, что вам нужно. Как сейчас написано, трудно точно сказать, о чем вы спрашиваете.
Я не уверен, что понимаю, о чем вы спрашиваете, но, судя по вашему коду, похоже, вы могли бы использовать помощь в преобразовании того, что вы написали, используя 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
Дорогой Гоув, Каждая страница представляет месяц в году. Заработная плата персонала доступна на каждой странице (т.е. каждый месяц). Я хочу видеть кадровые данные на этих страницах в сумме на одной странице. Но персонал не стабилен в течение месяцев. По этой причине мне нужно сделать некоторые операции. Поскольку это было бы медленно с точки зрения скорости, я хотел выполнять операции внутри массивов вместо того, чтобы копировать эти данные на страницу и выполнять операции там. Что я на самом деле хочу сделать и узнать. Мы можем перемещаться по страницам в цикле. Сделайте то же самое с массивами.
@MurtiCom, это имеет больше смысла. давайте сделаем это: примите этот ответ и напишите новый вопрос с более подробной информацией. Нам нужно знать, как называются листы (например, январь, февраль и т. д.). Также покажите структуру данных в табелях по месяцам, обязательно укажите, как определить, когда сотрудник один и тот же от листа к листу и что нужно агрегировать по месяцам. Как только это будет опубликовано, укажите это в комментарии здесь, и я посмотрю. Это звучит как довольно простая проблема, как только она подробно объяснена.
Есть ли ошибка? Есть вопрос? Это может быть проблема XY, когда вы пытаетесь решить что-то одним способом, в то время как есть гораздо более простой способ, который в настоящее время не может быть определен из-за отсутствия контекста (информации). Также нам, скорее всего, потребуется объяснение того, что вы планируете с этим делать (продолжение кода или код другой процедуры, в которой вы используете заполняемые переменные). Вы можете отредактируй свой пост в любое время.