Это как раз то, для чего были созданы массивы и другие коллекции, но они лучше всего в том, что вам не нужно иметь более одной переменной.
Массивы
Массивы в VB обычно объявляются следующим образом:
Dim sheetName(1 to 10) As String
В приведенном выше примере мы указали, что нам нужны индексы от 1 до 10, поэтому мы можем получить к ним доступ, указав что-то вроде:
Debug.Print sheetName[5]
для вывода пятого элемента.Если вы не знаете, сколько элементов вы можете ожидать в массиве, вы должны объявить его следующим образом:
Dim sheetName() As String
А затем вам нужно будет объявить, насколько большим используется элемент:
ReDim sheetName(1 to 10)
Обратите внимание, что если у вас есть массив и вы хотите добавить в него больше элементов, вам нужно будет самостоятельно изменить его размер.
Скажем, у нас есть от 1 до 10 единиц, изатем позже вы захотите увеличить его:
ReDim Preserve sheetName(1 to 20)
Где ключевое слово preserve используется, чтобы убедиться, что мы не потеряем существующие данные.
К счастью, были включены некоторые другие опции дляуправлять ими, не беспокоясь об увеличении размера вручную.
Затем вы можете получить данные массива, выполнив что-то вроде следующего:
Dim sheetName(1 To 10) As String
sheetName(1) = "One"
sheetName(2) = "Two"
Dim i As Integer
For i = 1 To 10
Debug.Print sheetName(i)
Next i
Обратите внимание, что в этой ситуации мыобъявлено, что будет 10 листов, несмотря на то, что мы объявили только два из них, так что это будет довольно глупо пройти и распечатывать каждое из 10 имен листов, 8 из которых будут пустыми.
Anoздесь можно использовать For Each
, поэтому нам не нужно беспокоиться о счетчике.
Dim sheetName(1 To 10) As String
sheetName(1) = "One"
sheetName(2) = "Two"
Dim sheet As Variant
For Each sheet In sheetName
Debug.Print sheet
Next sheet
У этого, к сожалению, будет та же проблема, что он будет распечатывать каждый из10 имен листов.
К счастью, в VB есть некоторые встроенные коллекции, которые устраняют некоторые из этих проблем.
Коллекции
В Visual Basic есть встроенные коллекции.Вы можете объявить коллекцию следующим образом:
Dim sheetName As Collection
Set sheetname = New Collection
Обратите внимание, что здесь нам нужно использовать ключевые слова Set и New для создания коллекции, потому что это сложный тип.
Теперь у вас есть коллекция, котораяВы можете добавить к этому, выполнив следующее:
sheetName.Add "Your Sheet Name"
Продвинув вышеприведенные примеры кода на шаг вперед, мы могли бы сделать следующее:
Dim sheetName As Collection
Set sheetName = New Collection
sheetName.Add "One"
sheetName.Add "Two"
Dim sheet As Variant
For Each sheet In sheetName
Debug.Print sheet
Next sheet
И теперь, обратите внимание, что мы неНе нужно беспокоиться о количестве элементов в Коллекции.Мы можем добавить к нему столько, сколько захотим, и изменение размера будет обработано.
Доступ к коллекциям также можно получить с помощью индексов, таких как массивы, поэтому мы можем сделать следующее, если вы хотите:
Dim i As Integer
For i = 1 To 2
Debug.Print sheetName(i) ' where this is the sheetName Collection
Next i
Коллекции также позволяют определить ключ для ссылки на элементы sheetName.Скажем, мы все еще хотим использовать другую переменную для отслеживания листов, и это то, что поможет вам приблизиться к тому, о чем вы изначально просили в своем вопросе, хотя, надеюсь, вы уже поняли, что в действительности нет никакой необходимостичтобы сделать это:
Dim sheetName As Collection
Set sheetName = New Collection
sheetName.Add "One", "Sheet" & "1" ' Note that I have only separated the
sheetName.Add "Two", "Sheet" & "2" ' Sheet & the 1 for illustrative purposes.
Dim i As Integer
For i = 1 To 2
Debug.Print sheetName("Sheet" & i)
Next i
И, наконец, для полноты, CaBieberach упомянул Scripting.Dictionary в своем ответе .
Словарь
Словарь на самом деле не является частью стандартного VB, но может быть легко включен.Чтобы сделать это, нужно включить ссылку на «Среду выполнения сценариев Microsoft», перейдя в Инструменты, Ссылки и Добавление отметки в «Среда выполнения сценариев Microsoft».
Как только вы это сделаете, вы можете создать словарь какследует:
Dim sheetName As Scripting.Dictionary
Set sheetName = New Scripting.Dictionary
sheetName.Add "Sheet" & "1", "One" ' Note that these are reversed. The Key is first,
sheetName.Add "Sheet" & "2", "Two" ' the Item is second.
Dim sheet As Variant
For Each sheet In sheetName
Debug.Print sheet
Next sheet
Словари можно использовать почти одинаково для коллекции, но должен иметь ключ для каждого элемента, и это можно использовать для очень быстро при поиске, поэтому в приведенном выше примере, где у нас есть Элемент, указанный как Один, мы можем:
Debug.Print sheetName("Sheet1")
И получить вывод «One»
Рекомендации
Если вы просто храните несколько имен листов и не требуете очень быстрого поиска, я бы не стал использовать Scripting.Dictionary, на мой взгляд, Коллекции будет достаточно, а вы не будетенужно помнить, чтобы включены нестандартные ссылки.
Используйте For Each
для итерации по элементам - таким образом, вам не нужно отслеживать лишнее целое число без всякой причины.