VBA Excel无效的ReDim /预期数组,其中包含范围数组模块

时间:2016-06-03 17:28:15

标签: excel vba excel-vba

我有一个模块,用于存储在其他模块中调用的Range对象数组。虽然这个模块很实用,但它很邋and,我希望这些代码能够为未来的开发人员轻松阅读/编辑。理想情况下,这不仅易于读取/编辑,而且还是范围数组(与变体数组相对)。

如何调用模块(理想情况下是'As 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

返回'无效的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以确切知道这些错误究竟发生了什么,我有许多需要修复的模块。因此,如果有人可以快速解释我为什么会收到这些错误以及如何修复它们,我会非常感激!

编辑:此模块的目的是为工作表中的各个表的位置提供全局访问权限,以便位置本身是重要的,而不是单元格中的值。但是这个数组在工作簿中使用了几次,因为其他模块需要访问表才能正常工作。我也知道你可以直接引用这些表,但是在这个特定的程序中有很多情况会使得单独引用表比它需要的更难。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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在返回时仍然是一个变体,如果你这样做的话,它不是一个范围数组,但这似乎符合你的意图。