2014-11-21 66 views
5

如何在Excel VBA中將對象傳遞給私有子作爲參考?下面是我想做的事:在Excel中傳遞對象作爲參數VBA

Sub main() 
    Dim r As Range 
    Set r = Sheets("Sheet1").Range(Cells(1, 1), Cells(27, 27)) 
    r.Select 'this works 
    select_cells (r) 'this doesn't work 
End Sub 

Private Sub select_cells(a As Range) 
    a.Select 'prompts Object Required error 
End Sub 
+2

嘗試在'select_cells'前面調用'''調用select_cells(r)'在我的本地測試中工作 – tospig 2014-11-21 04:37:54

回答

5
select_cells (r) 'this doesn't work 

不能使用括號來傳遞對象參數的過程。只是這樣做:

select_cells r 

的陳舊,過時的Call關鍵字可以使用,如果你真的保持括號。

7

有在你的代碼

  1. 不合格範圍引用參考ActiveSheet severla錯誤。所以

    Set r = Sheets("Sheet1").Range(Cells(1, 1), Cells(27, 27)) 
    

    如果Sheet1未處於活動狀態,將會報錯。

  2. r.Select如果Sheet1未處於活動狀態,將會報錯。

  3. select_cells (r)括號內的內容有誤。使用

    select_cells r 
    
  4. a.Select在私人小組如果Sheet1不活躍就會報錯。

下面是一個修改的版本

Sub main() 
    Dim r As Range 
    With Sheets("Sheet1") 
     Set r = .Range(.Cells(1, 1), .Cells(27, 27)) 
    End With 
    Debug.Print r.Address ' for diagnostic purposes 
    select_cells r 
End Sub 

Private Sub select_cells(a As Range) 
    ' Activate the worksheet first, so you can select a range on it 
    a.Worksheet.Select 
    a.Select 
End Sub 

註上括號參數

SubFunction參數是一個非對象變量,包圍該參數將覆蓋ByRef/ByVal清晰度並通過參數ByVal

SubFunction參數一個對象變量,包圍所述參數將導致一個缺省的屬性來被傳遞到Sub/Function。在OP的情況下,這是r.Value,這導致類型錯配。

+1

「通過值傳遞一個對象沒有意義」事實並非如此 - 大多數事件傳遞對象ByVal,例如。它只是意味着你傳遞了指針的*副本,而不是原始指針。使用parens強制編譯器嘗試評估對象的默認屬性並傳遞該結果(可能是對象或數據類型)。 – Rory 2014-11-21 08:09:09