是否将Excel VBA代码放入模块或工作表中?

是否将Excel VBA代码放入模块或工作表中?,vba,excel,Vba,Excel,什么是良好实践和良好规范卫生?将代码放入模块或工作表中 我有一个Excel工作簿,每个工作表中都有用户界面。工作簿中的每一张工作表都执行某项总体任务的不同部分。我应该将与每个工作表相关的代码放在工作表对象中还是放在模块中?分组为一个模块,还是单独的模块 我正在使用Excel2003 肯定是在模块中 可以删除、复制和移动图纸,结果令人惊讶 如果不完全限定引用,则不能从其他模块调用工作表“代码隐藏”中的代码。这将导致工作表与其他模块/工作表中的代码耦合 模块可以导出和导入到其他工作簿中,并置于版本

什么是良好实践和良好规范卫生?将代码放入模块或工作表中

我有一个Excel工作簿,每个工作表中都有用户界面。工作簿中的每一张工作表都执行某项总体任务的不同部分。我应该将与每个工作表相关的代码放在工作表对象中还是放在模块中?分组为一个模块,还是单独的模块

我正在使用Excel2003

肯定是在模块中

  • 可以删除、复制和移动图纸,结果令人惊讶
  • 如果不完全限定引用,则不能从其他模块调用工作表“代码隐藏”中的代码。这将导致工作表与其他模块/工作表中的代码耦合
  • 模块可以导出和导入到其他工作簿中,并置于版本控制之下
  • 逻辑上划分为模块(数据访问、实用程序、电子表格格式等)的代码可以作为单元重用,并且如果宏变大,则更易于管理
由于该工具在Excel VBA等原始系统中非常糟糕,因此最佳实践、严格的代码卫生和遵守约定非常重要,特别是当您试图使用它执行任何远程复杂的操作时

解释不同类型代码容器的预期用途。这并不能说明为什么应该做出这些区别,但我相信大多数试图在Excel平台上开发严肃应用程序的开发人员都会遵循这些区别


还有一个我发现很有用的列表,尽管它们与Excel VBA没有直接关系。请忽略该站点上疯狂的命名约定,它们都是疯狂的匈牙利语。

根据我的经验,最好将尽可能多的代码放入命名良好的模块中,并且只将需要的代码放入实际的工作表对象中


示例:任何使用工作表事件(如工作表选择更改或工作表计算)的代码。

我建议根据每个工作表或模块特定的功能和用途分离代码。通过这种方式,您将只将与工作表的UI相关的代码放在工作表的模块中,而只将与模块相关的代码放在相应的模块中。此外,使用单独的模块封装在多个不同的工作表之间共享或重用的代码

例如,假设有多个工作表负责以特殊方式显示数据库中的数据。在这种情况下,我们有哪些功能?我们拥有与每个特定工作表相关的功能、与从数据库获取数据相关的任务以及与使用数据填充工作表相关的任务。在这种情况下,我可以从一个用于数据访问的模块开始,一个用于用数据填充工作表的模块,在每个工作表中,我都有用于访问这些模块中的代码的代码

它可能是这样布置的

模块:数据访问

Function GetData(strTableName As String, strCondition1 As String) As Recordset
    'Code Related to getting data from the database'
End Function
Sub PopulateASheet(wsSheet As Worksheet, rs As Recordset)
    'Code to populate a worksheet '
End Function
Sub GetDataAndPopulate()
    'Sample Code'
     Dim rs As New Recordset
     Dim ws As Worksheet
     Dim strParam As String
     Set ws = ActiveSheet
     strParam = ws.Range("A1").Value

     Set rs = GetData("Orders",strParam)

     PopulateASheet ws, rs
End Sub

Sub Button1_Click()
    Call GetDataAndPopulate
End Sub
模块:普及表

Function GetData(strTableName As String, strCondition1 As String) As Recordset
    'Code Related to getting data from the database'
End Function
Sub PopulateASheet(wsSheet As Worksheet, rs As Recordset)
    'Code to populate a worksheet '
End Function
Sub GetDataAndPopulate()
    'Sample Code'
     Dim rs As New Recordset
     Dim ws As Worksheet
     Dim strParam As String
     Set ws = ActiveSheet
     strParam = ws.Range("A1").Value

     Set rs = GetData("Orders",strParam)

     PopulateASheet ws, rs
End Sub

Sub Button1_Click()
    Call GetDataAndPopulate
End Sub
工作表:工作表1代码

Function GetData(strTableName As String, strCondition1 As String) As Recordset
    'Code Related to getting data from the database'
End Function
Sub PopulateASheet(wsSheet As Worksheet, rs As Recordset)
    'Code to populate a worksheet '
End Function
Sub GetDataAndPopulate()
    'Sample Code'
     Dim rs As New Recordset
     Dim ws As Worksheet
     Dim strParam As String
     Set ws = ActiveSheet
     strParam = ws.Range("A1").Value

     Set rs = GetData("Orders",strParam)

     PopulateASheet ws, rs
End Sub

Sub Button1_Click()
    Call GetDataAndPopulate
End Sub

在Reddick命名约定中实现的匈牙利符号或多或少已成为Visual Basic for Applications和VB6的变量命名标准。虽然我当然不会在工具非常强大的.NET中使用它,但在VBA中使用它并没有什么坏处,因为VBA的工具比较旧。@Ben—“疯狂的匈牙利人”被开玩笑地说:)而匈牙利人确实帮助解决了缺少静态键入和围绕“这又是什么”的工具的问题,我认为,如果您更倾向于面向对象的VBA,并开始创建您自己的域对象,那么它就有缺陷了。然而,我最大的抱怨是,匈牙利语确实扰乱了实际阅读代码的流程。每个人都有自己的想法,对我来说不是宗教观点。但如果有人问我,我不会推荐。这是很好的观点。我同意在VBA中构造类时,匈牙利语会使对象看起来很难看。也许我仍然在VB6中使用它来提醒自己,我正在使用VB6:-)“在没有完全限定引用的情况下,不能从其他模块调用工作表中的代码“代码隐藏”。我该怎么做?这也是我的一般政策。