2009-01-13 79 views
20

我似乎得到一个类型不匹配错误试图做这样的事情的时候:Excel中的VBA函数可以返回一个范围吗?

在新的工作簿:

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 

添加= Test1的()应该返回5,但代码似乎返回时终止范围从test2()。是否有可能返回一个范围?在test2将

回答

39

的范围是一个对象。分配对象需要使用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 
+1

这可以用作UDF吗? – ja72 2017-03-01 21:41:38

4

更改最后一行:

Set Test2 = rg 
+0

,你能否评价一下这个正在做详细点吗?我应该总是使用set?我看到很多例子,其中省略。感谢您的快速帮助。 – 2009-01-13 16:01:30

7

您也可以返回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.ValueRange.Value = x操作时x是一个数组和范围包含多个行的列是比做的操作一个一个地直接作用于细胞快许多次。

2

这也适用

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