在Excel VBA中将对象作为参数传递

And*_*kin 5 excel vba 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
Run Code Online (Sandbox Code Playgroud)

Mat*_*don 5

select_cells (r) 'this doesn't work
Run Code Online (Sandbox Code Playgroud)

您不能使用括号将对象参数传递给过程.这样做:

select_cells r
Run Code Online (Sandbox Code Playgroud)

Call如果你真的想保留括号,可以使用过时的过时关键字.


chr*_*sen 5

您的代码中存在severla错误

  1. 不合格的范围参考指的是ActiveSheet.所以

    Set r = Sheets("Sheet1").Range(Cells(1, 1), Cells(27, 27))
    
    Run Code Online (Sandbox Code Playgroud)

    如果Sheet1不活动将会出错.

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

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

    select_cells r
    
    Run Code Online (Sandbox Code Playgroud)
  4. a.Select如果Sheet1未激活,则在Private Sub中将出错.

这是一个修改过的版本

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
Run Code Online (Sandbox Code Playgroud)

关于括号参数的注意事项

当a SubFunction参数是非对象变量时,将参数括起来会覆盖ByRef/ ByValdefinition并传递参数ByVal

当a SubFunction参数对象变量时,将参数括起会导致将默认属性传递给Sub/ Function.在OP的情况下,这是r.Value导致类型不匹配的原因.

  • “按值传递对象没有任何意义”这不是真的-例如,大多数事件都通过对象ByVal传递对象。这只是意味着您传递了指针的“副本”,而不是原始指针。使用括号会迫使编译器尝试评估对象的默认属性,然后传递该结果(可能是对象或数据类型)。 (2认同)