在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错误
-
非限定范围引用是指
ActiveSheet
。 所以Set r = Sheets("Sheet1").Range(Cells(1, 1), Cells(27, 27))
如果
Sheet1
不活动,将会出错。 -
如果
Sheet1
不活动,r.Select
将会出错。 -
带括号的
select_cells (r)
不正确。 使用select_cells r
-
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
注意括号内的参数
当Sub
或Function
参数是一个非对象variables时,包含该参数将覆盖ByRef
/ ByVal
定义并传递参数ByVal
当一个Sub
或Function
参数是一个对象variables时,包含这个参数会导致一个默认属性被传递给Sub
/ Function
。 在OP的情况下,这是r.Value
,这导致types错配。
select_cells (r) 'this doesn't work
您不能使用括号将对象parameter passing给过程。 只要这样做:
select_cells r
如果您确实想要保留圆括号,可以使用过时的,过时的Call
关键字。