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 

在工作表中,您必须将该函数作为数组公式(使用CtrlShiftEnter )应用到适当数目的单元格中。 Swap()函数的细节在这里并不重要。

请注意 ,对于许多行,这是非常有效的。 做x = Range.ValueRange.Value = x操作,当x是一个数组并且该范围包含多行时,列的速度比直接在单元格上逐个进行操作要快很多倍。

将Test2中的最后一行更改为:

 Set Test2 = rg 

这也适用

 Function Test2(Rng As Range) As Range Set Test2 = Rng End Function