2016-06-03 3 views
0

У меня есть модуль, который хранит массив объектов Range, который вызывается в других модулях. Хотя этот модуль функциональный, он неаккуратный, и я хотел бы, чтобы код был легко читаем/редактируем для будущих разработчиков. В идеале это было бы не только легко читать/редактировать, но и быть массивом диапазона (в отличие от варианта массива).VBA Excel Недопустимый ReDim/ожидаемый массив с массивом диапазонов Модуль

Как модуль называется (в идеале было бы «Как Range»):

Sub CallModule() 
    '... 
    Dim rangeArray As Variant 
    '... 
    rangeArray = RngArr() 
    '... 
    Call AnotherModule(rangeArray(count)) 
End Sub 

Текущий модуль:

Public Function RngArr() As Variant 
    RngArr = Array(Range("'ActivityTracker'!B12"), Range("'ActivityTracker'!H12"), Range("'ActivityTracker'!B26"), Range("'ActivityTracker'!H26"), Range("'ActivityTracker'!B39"), Range("'ActivityTracker'!H39"), Range("'ActivityTracker'!B53")) 
End Function 

Я получаю пару ошибок при попытке поставить его вместе ,

возвращает 'ожидается массив':

Public Function RngArr() As Range 
    ReDim RngArr(0 To 6) '<---Expected Array 
    Set RngArr(0) = Range("'ActivityTracker'!B12") 
    Set RngArr(1) = Range("'ActivityTracker'!H12") 
    Set RngArr(2) = Range("'ActivityTracker'!B26") 
    Set RngArr(3) = Range("'ActivityTracker'!H26") 
    Set RngArr(4) = Range("'ActivityTracker'!B39") 
    Set RngArr(5) = Range("'ActivityTracker'!H39") 
    Set RngArr(6) = Range("'ActivityTracker'!B53") 
End Function 

возвращает «Invalid ReDim»:

Public Function RngArr() As Variant 
    ReDim RngArr(0 To 6) As Range '<---Invalid ReDim 
    Set RngArr(0) = Range("'ActivityTracker'!B12") 
    Set RngArr(1) = Range("'ActivityTracker'!H12") 
    Set RngArr(2) = Range("'ActivityTracker'!B26") 
    Set RngArr(3) = Range("'ActivityTracker'!H26") 
    Set RngArr(4) = Range("'ActivityTracker'!B39") 
    Set RngArr(5) = Range("'ActivityTracker'!H39") 
    Set RngArr(6) = Range("'ActivityTracker'!B53") 
End Function 

Я не знаю VBA достаточно хорошо, чтобы точно знать, что происходит с этими ошибками, и у меня есть несколько таких модулей, которые должны быть исправлены. Поэтому, если кто-то может дать быстрое объяснение, почему я получаю эти ошибки и как их исправить, я бы очень признателен!

EDIT: Цель этого модуля - предоставить глобальный доступ к местоположениям различных таблиц на листе, поэтому сами места являются важными, а не значениями в ячейках. Но этот массив используется несколько раз в рабочей книге, потому что другие модули нуждаются в доступе к таблицам, чтобы иметь возможность работать правильно. Кроме того, я знаю, что вы можете напрямую ссылаться на таблицы, но в этой конкретной программе есть много случаев, которые сделают ссылку на таблицы по отдельности намного сложнее, чем нужно.

+0

* Это неряшливо, и я хотел бы, чтобы код был легко читаемым/редактируемым для будущих разработчиков. * - заставить его работать по назначению, а затем опубликовать модуль на [codereview.se]. Удачи! –

+0

Вы в конечном итоге пытаетесь иметь дело с объектом [Range object] (https://msdn.microsoft.com/en-us/library/office/ff838238.aspx) или значениями из объекта [Range object] (https://msdn.microsoft.com/en-us/library/office/ff838238.aspx)s? – Jeeped

ответ

4
Public Function RngArr() As Range() 
    Dim rv(0 To 6) As Range 
    Set rv(0) = Range("'ActivityTracker'!B12") 
    Set rv(1) = Range("'ActivityTracker'!H12") 
    Set rv(2) = Range("'ActivityTracker'!B26") 
    Set rv(3) = Range("'ActivityTracker'!H26") 
    Set rv(4) = Range("'ActivityTracker'!B39") 
    Set rv(5) = Range("'ActivityTracker'!H39") 
    Set rv(6) = Range("'ActivityTracker'!B53") 
    RngArr = rv 
End Function 

Sub Tester() 
    Debug.Print RngArr()(2).Address() 
End Sub 
0

Непонятно, что вы пытаетесь сделать здесь.

Следующий код работает, хотя:

Public Function testArr() As Variant 
    Dim newArr() As Range 
    ReDim newArr(1 To 5) As Range 
    Set newArr(1) = Sheets("Sheet1").Range("A1") 
    testArr = newArr 
End Function 

Public Sub test() 
    Dim myArr As Variant 
    myArr = testArr() 

End Sub 

myArr еще будет вариант, когда он получает вернулись, а не массив диапазона, если вы делаете это так, но это, кажется, соответствует вашим намерениям.

Смежные вопросы