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

时间:2014-11-21 04:30:31

标签: 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

2 个答案:

答案 0 :(得分:6)

您的代码中存在严重错误

  1. 不合格的范围引用是指ActiveSheet。所以

    Set r = Sheets("Sheet1").Range(Cells(1, 1), Cells(27, 27))
    
    如果Sheet1未激活,

    将会出错。

  2. 如果r.Select未激活,则
  3. Sheet1会出错。

  4. 带有括号的
  5. select_cells (r)不正确。使用

    select_cells r
    
  6. 如果a.Select未激活,则私人潜在客户中的
  7. Sheet1会出错。

  8. 这是修改后的版本

    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 / {{ 1}}。对于OP,这是Function,这会导致类型不匹配。

答案 1 :(得分:5)

select_cells (r) 'this doesn't work

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

select_cells r

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