Как я могу получить доступ к отдельному элементу в массиве листов и избежать ошибки времени выполнения 9 - Excel VBA - PullRequest
1 голос
/ 09 марта 2019

У меня есть вариант массива листов, основанный на именах листов, перечисленных в столбце (диапазон имен "SheetRange") с использованием метода Application.Transpose. Этот массив действителен и работает с методом Sheets (). Select, но когда я пытаюсь присвоить значение элемента (как описано здесь ), он выдает Runtime Error 9 - Subscript out of Range.

Есть что-то фундаментальное, что я здесь упускаю? Меняет ли присвоение через метод Application.Transpose тип массива так, чтобы с ним нельзя было работать как обычно?

Вот мой код:

Sub SheetArrayTest()
Dim SheetArray As Variant
Dim IndividualSheet As String
SheetArray = Application.Transpose(ActiveWorkbook.Names("SheetRange").RefersToRange.Value)
ThisWorkbook.Sheets(SheetArray).Select 'This function works!
IndividualSheet = SheetArray(0) 'This function throws Runtime error 9 Subscript out of range
End Sub

Ответы [ 3 ]

2 голосов
/ 10 марта 2019

Коллекции диапазонов (и коллекции VB в целом) основаны на одном. (Это не связано с функцией Transpose).

Dim coll As New Microsoft.VisualBasic.Collection()

  • Этот объект Collection является единичным, что означает, что значения индекса элементов варьируются от 1 до значения свойства Count.Коллекции Visual Basic содержат элементы типа Object. docs.microsoft.com: Конструктор коллекций

В VBA доступно 3 основных типа группирующих конструкций с различиями между индексами.
Superuser - превосходныйобъекты основаны на нуле и основаны на одном

  1. Коллекции - индекс на основе 1
  2. Массивы - по умолчанию на основе 0, но первый индекс можно изменить на любойчисло
  3. Словари - не индексируются, но индексы можно моделировать с помощью клавиш
1 голос
/ 10 марта 2019

SheetArray(0) не существует, потому что в VBA первое значение массива имеет индекс 1 (не 0). Вызов IndividualSheet = SheetArray(1) должен работать просто отлично.

Чтобы увидеть, какие значения у вас есть в вашем массиве, в VBA Editor нажмите View -> Locals window. В режиме отладки вы можете легко щелкнуть мышью и увидеть значения для всех ваших переменных, включая массивы.

0 голосов
/ 09 марта 2019

Я думаю, Application.Transpose возвращает массив на основе 1.

Так что SheetArray(1) для доступа к первому элементу массива должно работать (при условии, что SheetArray - это одномерный массив).

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