Excel中的VBA函数可以返回一个范围吗?
我试图做这样的事情似乎是得到一个types不匹配的错误:
在新的工作簿中:
A1 B1 5 4 Function Test1() As Integer Dim rg As Range Set rg = Test2() Test1 = rg.Cells(1, 1).Value End Function Function Test2() As Range Dim rg As Range Set rg = Range("A1:B1") Test2 = rg End Function
Adding = Test1()应该返回5,但是代码似乎在从test2()返回范围时终止。 是否有可能返回一个范围?
范围是一个对象。 分配对象需要使用SET关键字,而且看起来像在Test2函数中忘记了一个关键字:
Function Test1() As Integer Dim rg As Range Set rg = Test2() Test1 = rg.Cells(1, 1).Value End Function Function Test2() As Range Dim rg As Range Set rg = Range("A1:B1") Set Test2 = rg '<-- Don't forget the SET here' End Function
你也可以返回一个表示数组值的Variant()
。 下面是一个将范围内的值反转为新范围的函数示例:
Public Function ReverseValues(ByRef r_values As Range) As Variant() Dim i As Integer, j As Integer, N As Integer, M As Integer Dim y() As Variant N = r_values.Rows.Count M = r_values.Columns.Count y = r_values.value 'copy values from sheet into an array 'y now is a Variant(1 to N, 1 to M) Dim t as Variant For i = 1 To N / 2 For j = 1 To M t = y(i, j) y(i, j) = y(N - i + 1, j) y(N - i + 1, j) = t Next j Next i ReverseValues = y End Function
在工作表中,您必须将该函数作为数组公式(使用Ctrl
– Shift
– Enter
)应用到适当数目的单元格中。 Swap()函数的细节在这里并不重要。
请注意 ,对于许多行,这是非常有效的。 做x = Range.Value
和Range.Value = x
操作,当x
是一个数组并且该范围包含多行时,列的速度比直接在单元格上逐个进行操作要快很多倍。
将Test2中的最后一行更改为:
Set Test2 = rg
这也适用
Function Test2(Rng As Range) As Range Set Test2 = Rng End Function