【问题标题】:User Sub with Optional parameters - not visible in Macro window具有可选参数的用户子 - 在宏窗口中不可见
【发布时间】:2016-05-02 05:54:07
【问题描述】:

我有一个宏,它遍历列并从范围内的所有单元格中删除数字。我想添加一个可选参数,这样我就可以调用 sub 同时告诉它要在哪些列上运行。这是我所拥有的:

Sub GEN_USE_Remove_Numbers_from_Columns(Optional myColumns as String)

这个想法是我可以从另一个 sub 调用它,就像这样 GEN_USE_...Columns("A B C")

但是,我无法从 VB 编辑器运行它,也无法在宏窗口中看到该宏(单击查看 --> 宏时)。为什么不?为什么我必须用参数调用它(甚至GEN_USE_...Columns(""))我不能再调用GEN_USE_...Columns()了。

我有seen that,你可以在末尾添加= Nothing,如果没有给出,则设置默认值。我已经尝试过 () 但它没有做任何事情。

我想我的问题是 A) 为什么我在宏窗口中看不到具有可选参数的宏? B) 为什么我不能直接从 VB 编辑器调用带有参数的宏?我必须实际创建一个子程序,然后我可以在该子程序中调用宏。不再只是突出显示一些文本并点击“播放”。

我知道这两个问题可能是相关的,所以任何见解都将不胜感激!

(PS:我知道我们应该发布代码,但我认为这不是很相关。当然,如果您想看到它,请告诉我,我会更新)。

【问题讨论】:

  • 使用 Optional myColumns as Variant 在运行宏 ([alt]+[F8]) 对话框中显示它。或者,将其隐藏;您可以键入名称并单击运行。变体类型也是唯一能正确响应IsMissing 的类型。
  • 您可以从 VBE 的即时窗口 ([ctrl]+G) 中使用参数调用 sub。

标签: vba excel udf


【解决方案1】:

使用Optional myColumns as Variant 在运行宏 ([alt]+[F8]) 对话框中显示它。或者,将其隐藏;您可以键入名称并单击运行。变体类型也是唯一正确响应IsMissing function 的类型。

Sub GEN_USE_Remove_Numbers_from_Columns(Optional myColumns As Variant)
    If IsMissing(myColumns) Then
        myColumns = Intersect(Selection.Parent.UsedRange, Selection).Address '.address 'cause you were using a string
    End If
    Debug.Print Range(myColumns).Address(external:=True)
End Sub

        

您可以使用 VBE 的即时窗口 ([ctrl]+G) 中的参数调用 sub。

【讨论】:

  • 啊哈!这是一个非常巧妙的“技巧”。我喜欢这个,因为我使用F8 大量演练,这使我可以像“正常”一样使用宏,而不会更复杂。切线,但我注意到如果我在不提供任何myColumns 数据的情况下运行子程序,使用If IsEmpty(myColumns) 将返回FALSE...尽管myColumns 具有Nothing。 (然后我注意到它实际上是IsMissing,所以换了它。我认为IsEmpty 只是一个违反直觉的怪癖)。
  • 是的,针对Is NothingIsEmpty function 测试可选参数的存在不会产生正确的结果。带有IsMissing function 的变体类型参数是最好的测试。或者,将不可能的值(常量)硬编码为默认值,并测试参数是否等于这些常量。
【解决方案2】:

带有任何参数的Sub,无论是否可选,都不能直接运行,只能从另一个Sub或Function调用

最好的选择是编写一个将出现在宏窗口中的包装器 Sub

Sub USER_Remove_Numbers_from_Columns()
    GEN_USE_Remove_Numbers_from_Columns
End Sub

【讨论】:

  • 感谢这个!将来我会为宏记住这一点。对于这个特定的问题,Jeeped 的回答效果更好一些,但非常感谢您的回答和评论!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多