2009-01-13 78 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