在Excel VBA中将对象作为parameter passing

如何在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 

你的代码中有severla错误

  1. 非限定范围引用是指ActiveSheet 。 所以

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

    如果Sheet1不活动,将会出错。

  2. 如果Sheet1不活动, r.Select将会出错。

  3. 带括号的select_cells (r)不正确。 使用

     select_cells r 
  4. a.Select 。如果Sheet1未处于活动状态,则在Private Sub中select将出错。

这是一个修改的版本

 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参数是一个非对象variables时,包含该参数将覆盖ByRef / ByVal定义并传递参数ByVal

当一个SubFunction参数一个对象variables时,包含这个参数会导致一个默认属性被传递给Sub / Function 。 在OP的情况下,这是r.Value ,这导致types错配。

 select_cells (r) 'this doesn't work 

您不能使用括号将对象parameter passing给过程。 只要这样做:

 select_cells r 

如果您确实想要保留圆括号,可以使用过时的,过时的Call关键字。