【问题标题】:Intellisense in private modules私有模块中的智能感知
【发布时间】:2014-06-24 23:13:58
【问题描述】:

假设我有一个名为 Module1 的模块,代码如下:

Private Sub MyPrivateSub()
    'do something
End Sub

Public Sub MyPublicSub()
    'do something
End Sub

Public Sub test()

End Sub

如果我将光标放在Test() 中并开始输入“MyPrivateSub”或“MyPublicSub”,我不会得到任何智能感知。我可以输入“Module1”。 (或“我”,如果Module1 是一个类模块)来获取智能感知菜单,但这仅包含公共方法MyPublicSub,如下所示:

有没有办法为所有成员(公共和私人)获取智能菜单?我正在开发一个包含许多方法的模块的项目,并且不断地上下复制/粘贴成员名称非常耗时。

【问题讨论】:

  • 我如何正确,但是如果您从头开始,可能还有其他选择
  • 让我问你一个问题@roryap,你会用Module1.MyPrivateSub() 做什么或者你从Module1.MyPublicSub() 中得到什么功能?为什么首先需要参考它?
  • @mehow -- 我在模块内部调用私有方法,从其他模块外部调用公共方法。这些方法包含多个地方需要的代码(请参阅en.wikipedia.org/wiki/Don%27t_repeat_yourself)。
  • @Alex -- 你能详细说明一下吗?
  • @roryap 你怎么称呼它? DRY 与这一切有什么关系我不知道 ;) 似乎你没有提出现实生活中的问题,你的 SSCCE 并没有真正表达你所追求的

标签: vba intellisense


【解决方案1】:

简答

点击组合

CTRL+空格

然后开始输入子名称,如下所示

长答案

您在编程中所做的一切都很重要。当您决定将子/函数/变量设为私有时,您这样做是有原因的,您需要了解这将如何影响访问级别和“范围”。

成员的范围由它的访问级别决定,在 VBE 中,任何私有的和符合其父成员资格的东西都不会得到智能感知。很简单,因为你不能(不应该能够访问它)从外部

因为您的MyPrivateSub 访问级别是Private,所以您无法通过使用Module1. 限定模块来使用智能感知访问它。

【讨论】:

  • 令人困惑的是,Module1.MyPrivateSubModule1 中被 VBA 允许,但没有显示在列表中,好像 Intellisense 不知道当前模块名称是什么
  • @z̫͋ 抱歉,这有什么令人困惑的地方?是Private的访问级别吗?如果某个东西在 VBA 中是 private,它可以从同一个模块访问,但使用 Module1. 限定它不允许您调用它的私有方法,并且从哪里调用它并不重要。
  • 是的,如果从同一个模块调用的话
  • @z̫͋ 对不起,我现在很困惑。 ctrl+space 允许您呼叫所有成员,而不管他们的访问级别。当您通过Module1. 限定私有MyPrivateSub 时,就像尝试全局访问它一样 - 点语法。由于您已将其设为私有,因此对我来说允许智能感知中的私有成员非常有意义。
  • 我同意函数调用的模块前缀应该限制为公共调用,但是由于如果函数在同一个模块中,VBA 允许私有调用(带有模块前缀),为什么不显示在名单?
【解决方案2】:

如果您是从头开始,您可以执行以下操作: 对于您的所有私有子函数,将它们命名为标准格式,但目前为公共函数,例如:

公共子 iamprivate_calDate ()
公共子 iamprivate_getsetfunction()
...

完成宏后,只需在编辑器中找到所有“Public sub iamprivate”并将其替换为“Private sub”即可。

【讨论】:

  • 无意冒犯,但我认为这是矫枉过正。您需要做的就是将Private 更改为Public -> 编写您的代码-> 然后将其换回Private
  • @mehow 我认为如果有很多功能会更好,但我想你是对的~
猜你喜欢
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 2010-12-14
  • 2019-12-25
  • 2011-02-17
相关资源
最近更新 更多