Можно ли хранить литеральные переменные VBA в массиве? - PullRequest
0 голосов
/ 25 сентября 2018

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

Dim myarray(1) as variant, I as long, cell as range
'Some code that predetermines the needed variables. Type Range
myarray(0) = Rng1
myarray(1) = Rng2
for i = 0 to 1
    for each cell in myarray(i)
        'code to loop through cells
    next cell
next i

Когда я добираюсь до for each cell in myarray(i), я получаю Run-time error '424': Object required.Возможно, я неправильно понимаю назначение / использование массива.Я могу сделать это с другими методами, но потребует повторного объявления в цикле.Поскольку этот фрагмент кода является частью гораздо большего набора кода и может привести к путанице, этот вариант не является предпочтительным.

При поиске на этом или других сайтах я нахожу фразу «Магазинпеременные в массив », но это относится к извлечению статических значений из источника переменных, такого как текстовый файл или некоторый тип ссылки на значения, хранящиеся в листе.Я хочу сохранить в нем буквальную переменную типа range и иметь возможность использовать ее в цикле.Я неправильно понимаю объявление массива, вызов или, возможно, его общее использование?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Вы можете сократить его до:

For Each cell in Union(Rng1, Rng2)
    'code to loop through cells
Next cell

Обновление : Отдельный метод часто используется для повторения кода:

Sub method1(Range rng)
    ' code to loop through rng.Cells
End Sub

и выборкаусловный вызов в отдельном методе:

If someCondition Then method1(Rng1)
0 голосов
/ 25 сентября 2018

Есть несколько способов преодолеть ошибку.Один из них корректирует коллекцию для каждого цикла, а другой - массив.Дайте нам знать, какой из них работает для вас.

Метод # 1 : Для каждого цикла требуется объект коллекции в отличие от передаваемой строки.Таким образом, мы будем использовать строку для получения коллекции диапазонов, а затем перебирать ячейки.Вместо этого используйте приведенный ниже код:

Dim myarray(1) as String, i as long, cell as range
'Some code that predetermines the needed variables. Type Range
myarray(0) = Rng1.Address
myarray(1) = Rng2.Address
For i = 0 to 1
    For Each cell in Range(myarray(i)).Cells
        'code to loop through cells
    next cell
Next i

Метод # 2 :

Dim myarray(1) as Variant, i as long, cell as range
'Some code that predetermines the needed variables. Type Range
Set myarray(0) = Rng1
Set myarray(1) = Rng2
For i = 0 to 1
    For Each cell in myarray(i).Cells
        'code to loop through cells
    next cell
Next i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...