Способ, которым вы создаете siArr
, гарантирует, что метод siArr(0) will always be empty. Hence the
Consolidate` завершится ошибкой для пустого элемента.
Редактировать: Если вы посмотрите на другую проблему, вы делаете, действительно, для этого топика нужно использовать справочный стиль R1C1
, как указано в HELP
, c.
Если вы собираетесь использовать метод ReDim Preserve
, попробуйте:
'--- Run through all sheets in workbook
For Each ws In Worksheets
For Each wArr In Array("A", "B", "C", "D")
'--- Check if worksheet name is in matching the list
If ws.Name = wArr Then
If Not IsEmpty(siArr(UBound(siArr))) Then _
ReDim Preserve siArr(UBound(siArr) + 1)
'--- Write address to array
siArr(UBound(siArr)) = ws.Range("A10:C300").Address(ReferenceStyle:=XlReferenceStyle.xlR1C1, external:=True)
End If
Next wArr
Next ws
Я обычно использую объект Dictionary или Collection для сбора списка объектов / переменных неизвестного размера; а затем повторно удалите мой массив только один раз, полностью исключив ReDim Preserve
. Ваш указанный метод оставит пустой элемент в конце массива. Ваш метод оставляет пустой элемент в начале массива. И того, и другого избегают, используя объект Dictionary или Collection
, поэтому вы можете использовать вместо:
Dim ws As Worksheet
Dim wArr, siArr As Variant
Dim cWS As Collection
Set cWS = New Collection
'--- Run through all sheets in workbook
For Each ws In Worksheets
For Each wArr In Array("A", "B", "C", "D")
'--- Check if worksheet name is in matching the list
If ws.Name = wArr Then
'--- Add address to collection
cWS.Add ws.Range("A10:C300").Address(ReferenceStyle:=XlReferenceStyle.xlR1C1, external:=True)
End If
Next wArr
Next ws
'--- write addresses to array
Dim I As Long
ReDim siArr(0 To cWS.Count - 1)
For Each wArr In cWS
siArr(I) = wArr
I = I + 1
Next wArr