如何在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
答案 0 :(得分:6)
您的代码中存在严重错误
不合格的范围引用是指ActiveSheet
。所以
Set r = Sheets("Sheet1").Range(Cells(1, 1), Cells(27, 27))
如果Sheet1
未激活,将会出错。
r.Select
未激活,则 Sheet1
会出错。
select_cells (r)
不正确。使用
select_cells r
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
关于括号参数的注释
当Sub
或Function
参数是非对象变量时,将参数括起来会覆盖ByRef
/ ByVal
定义并传递参数ByVal
当Sub
或Function
参数是对象变量时,将参数括起来会导致将默认属性传递给Sub
/ {{ 1}}。对于OP,这是Function
,这会导致类型不匹配。
答案 1 :(得分:5)
select_cells (r) 'this doesn't work
您不能使用括号将对象参数传递给过程。就这样做:
select_cells r
如果确实想要保留括号,可以使用陈旧的,过时的Call
关键字。