【问题标题】:Which arguments should be used when calling a sub with parameters (ByVal Target As Range)调用带参数的子时应使用哪些参数(ByVal Target As Range)
【发布时间】:2018-03-08 16:47:10
【问题描述】:

我正在 VBA 上制作一个宏,该宏附加到 Excel 中的数据验证列表。当从列表中选择某个选项时,我希望它运行分配给该选择的宏。但是我反复收到错误“编译错误。参数不是可选的。我知道我需要在调用宏后添加参数,但我输入的任何内容都会导致“需要对象”或“预期)”

此代码在我的工作表中。 'Case "Fifteen": Macro1' 行是有错误的行。

Private Sub Worksheet_change(ByVal Target As Range)
If Not Intersect(Target, Range("P4")) Is Nothing Then
    Select Case Range("P4")
    Case "Fifteen": Macro1
    End Select
End If
End Sub

以下代码位于一个模块中 - 它用于将值从一个工作表中的单元格复制到另一个工作表。

Sub Macro1(ByVal Target As Range)

Dim r1 As Range, r2 As Range
Set r1 = Sheets("Calculator").Range("C18:D19")
Set r2 = Sheets("Answers").Range("I14:J15")
If Intersect(Target, r1) Is Nothing Then Exit Sub
    Application.EnableEvents = False
         r2.Value = r1.Value
    Application.EnableEvents = True

End Sub

知道 Argument 参数应该是什么吗?我认为它会按照案例“十五”:Macro1(“C18:D19”)或案例“十五”:Macro1(r1),但没有运气。

模块中的代码独立运行,所以我认为它不会有任何问题。

非常感谢任何帮助。我环顾四周,找不到答案。

【问题讨论】:

  • 您需要将 Range 传递给函数。试试Case "Fifteen": Macro1(Range("P4"))
  • 单元格P4 永远不会在Macro1 代码中的r1 范围内,除此之外,Target 永远不会在Macro1 中使用。所以不要有那个论点,因为它没有被使用。将 Sub 更改为 Sub Macro1() 并删除 If Intersect...
  • 你没有传递Target,再次传递Target,明白它是对sub的本地副本但是:Macro1(Target)

标签: excel vba object arguments subroutine


【解决方案1】:

感谢您的帮助。通过删除 intersect 行,它现在可以按预期工作。最终代码如下。

Private Sub Worksheet_change(ByVal Target As Range)
        Select Case Range("P4")
        Case "Fifteen": Macro1
        End Select
    End If
    End Sub

Sub Macro1()

Dim r1 As Range, r2 As Range
Set r1 = Sheets("Calculator").Range("C18:D19")
Set r2 = Sheets("Answers").Range("I14:J15")
      Application.EnableEvents = False
         r2.Value = r1.Value
    Application.EnableEvents = True

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2021-09-25
    • 2021-08-15
    • 1970-01-01
    • 2019-04-04
    • 2012-12-25
    • 1970-01-01
    相关资源
    最近更新 更多