vba - Excel VBA中的公共(public)与私有(private)/昏暗

标签 vba excel excel-2013

我可以使用一些帮助来理解在 Excel 2013 VBA 的模块中使用 Public vs Dim。

首先,我想说我确实找到了这篇具有出色定义的好文章(请参阅下面的链接),但没有示例,我可以使用一些示例来说明如何将公共(public)变量应用于我的项目。另外,我对何时需要使用 Option Private Module 感到有些困惑;我需要在我拥有的每个模块上使用它还是只在包含以下代码的模块上使用它?

stackoverflow descriptions difference between Public/Private

我想要做的是在标准 Mod 中设置它,这样我就不必继续通过我的所有用户窗体为工作表设置变量,这些用户窗体对它们引用的工作表使用相同的命名约定。

Sub PubVar()
Public wb As Workbook
Public wsSI As Worksheet
Public wsRR As Worksheet
Public wsCalcs As Worksheet
Public wsNarr As Worksheet
Public wsEval As Worksheet
Public wsUW As Worksheet
Public wsLVBA As Worksheet

Set wb = Application.ThisWorkbook
Set wsSI = wb.Sheets("SavedInfo")
Set wsCalcs = wb.Sheets("Calcs")
Set wsNarr = wb.Sheets("Narrative")
Set wsEval = wb.Sheets("EvalCL")
Set wsUW = wb.Sheets("UWCL")
Set wsLVBA = wb.Sheets("ListsForVBA")
End Sub

谢谢您的帮助。

最佳答案

如果您正在制作自己的 Excel 加载项(*.XLAM 文件),您真的应该只需要 Option Private Module。它允许模块的 Public 变量对插件自己的项目中的其他模块可见,但防止它们被使用您的插件的其他工作表可见/调用。

至于其余的,不清楚你在问什么。您链接的问题对 Public vs Dim/Private 有很好的解释。 Private/Dim 变量不能被同一 VBA 项目中不同模块、表单或类中的 VBA 代码看到。如果您希望所有 VBA 代码都能够看到/调用它,则可以使用 public。如果您希望它仅在它自己的模块中可见/可调用,则可以使用 private/dim。

但一般来说,您希望对公开的内容保持谨慎,因为它会给您提供太多的全局名称(令人困惑),可能会导致重复名称的问题(有问题,可以通过命名标准解决),最重要的是因为它可以导致令人困惑/模糊的错误和可怕的调试问题(因为任何公共(public)变量更改都可能导致任何其他可以看到其行为不同的代码)。有些事情比其他事情更糟:

Public Subs        OK in a module, but better in a Class
Public Function    Usually fine, especially if its a true function
Public Const       No problem, belongs in modules
Public Variables   Very Bad.  *UNLESS ...*

公共(public)变量是优秀编码人员担心的变量。应避免使用它们,除非它们是我们所说的“只读变量”。这些是您只设置一次且永远不会再更改的变量。只要您遵循该规则,它们实际上就是常量并且没问题(虽然只读静态属性会更好,但 VBA 在这方面有太多限制)。

最后,如果您想为所有代码可见/可用的所有工作表使用命名变量,但您只需设置一次,这就是 Public 的用途,但声明(“公共(public)”)需要在“模块级别”,这意味着在模块中,但在任何子程序或函数之外。像这样:
Public wb As Workbook
Public wsSI As Worksheet
Public wsRR As Worksheet
Public wsCalcs As Worksheet
Public wsNarr As Worksheet
Public wsEval As Worksheet
Public wsUW As Worksheet
Public wsLVBA As Worksheet

' sets all of the Worksheet variables
Sub PubVar()

    Set wb = Application.ThisWorkbook
    Set wsSI = wb.Sheets("SavedInfo")
    Set wsCalcs = wb.Sheets("Calcs")
    Set wsNarr = wb.Sheets("Narrative")
    Set wsEval = wb.Sheets("EvalCL")
    Set wsUW = wb.Sheets("UWCL")
    Set wsLVBA = wb.Sheets("ListsForVBA")

End Sub

关于vba - Excel VBA中的公共(public)与私有(private)/昏暗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51864001/

相关文章:

Word 2010 中的 VBA 不会迭代所有打开的文档

vba - Excel VBA - 出现运行时错误 1004 - 无法访问文件

excel - 密码保护目录中的多个文件

excel - Excel 2013停止在子工作

vba - 选择范围时对象 ' _Global' 的“范围”失败错误

vba - 将参数传递给事件处理程序

c++ - 从 Excel VBA 使用 C++ dll 时出现 "Bad DLL calling convention"- 如何解决?

loops - 尝试了解如何使用某些参数编写 if then elseif 语句

excel - VBA检查整个范围是否具有有效日期并且不为空?

excel - 事件屏幕上的 VBA 中心用户表单