首页 > 解决方案 > 我可以在 with 语句中隐式地采用工作表参数吗?

问题描述

我有一个看起来像这样的子:

Public Sub CategoryChange(ChangeWS As Worksheet, NewCategory As String, StartDate As String, EndDate As String)
    ...
End Sub

我想知道为什么会这样:

Sub Test()

    Call CategoryChange(ActiveSheet, Range("A1"), Range("A2"), Range("A3"))

End Sub

这不起作用(编译错误,参数不是可选的):

Sub Test2()

    With ActiveSheet

        Call CategoryChange(, Range("A1"), Range("A2"), Range("A3"))

    End With

End Sub

如果我的 sub 期待一个工作表变量并且我在一个With语句中编写,为什么它不会隐式地获取我的工作表?

标签: excelvba

解决方案


你不能这样做,因为语法不是那样工作的。With仅提供引用对象成员的快捷方式,而不是对象本身。它不会“神奇地”将对象注入到对变量的缺失引用中。它只查找以句点 ( .) 开头且前面没有引用的表达式并注入对象引用。

如果您的示例实际编译,则Range必须引用其他参考,而不是ActiveSheet.Range. 否则,你会这样做:

With ActiveSheet

    Call CategoryChange(ActiveSheet, .Range("A1"), .Range("A2"), .Range("A3"))

End With

推荐阅读