将Excel-VBA代码放在模块或工作表中?

Jea*_*ett 42 excel vba excel-vba

什么是良好的做法和良好的代码卫生?将代码放入模块或表格中?

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

我正在使用Excel 2003.

jev*_*lio 49

绝对是模块.

  • 可以删除,复制和移动表格,但结果令人惊讶.
  • 如果没有完全限定引用,则无法从其他模块调用表单"代码隐藏"中的代码.这将导致纸张与其他模块/纸张中的代码的耦合.
  • 模块可以导出并导入到其他工作簿中,并置于版本控制之下
  • 逻辑上拆分为模块的代码(数据访问,实用程序,电子表格格式等)可以作为单元重用,如果宏变大,则更容易管理.

由于Excel VBA等原始系统中的工具很差,因此最佳实践,强迫性的代码卫生和惯例的宗教遵循非常重要,特别是如果您尝试使用它进行任何远程复杂的操作.

本文解释了不同类型的代码容器的预期用法.它不符合为什么要进行这些区分,但我相信大多数尝试在Excel平台上开发严肃应用程序的开发人员都遵循它们.

还有一个我发现有用的VBA编码约定列表,尽管它们与Excel VBA没有直接关系.请忽略他们在该网站上的疯狂命名约定,这都是疯狂的匈牙利人.

  • Reddick命名约定中实现的匈牙利符号或多或少已成为Visual Basic for Applications和VB6的变量命名的标准。虽然我肯定会避免在工具非常强大的.NET中使用它,但在工具较旧的VBA中使用它也不会受到损害。 (2认同)

Mic*_*ael 10

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

示例:使用Workheet_SelectionChange或Worksheet_Calculate等工作表事件的任何代码.


Ben*_*ack 10

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

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

它可能像这样布局.

模块:DataAccess:

Function GetData(strTableName As String, strCondition1 As String) As Recordset
    'Code Related to getting data from the database'
End Function
Run Code Online (Sandbox Code Playgroud)

模块:PopulateSheet:

Sub PopulateASheet(wsSheet As Worksheet, rs As Recordset)
    'Code to populate a worksheet '
End Function
Run Code Online (Sandbox Code Playgroud)

表:Sheet1代码:

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
Run Code Online (Sandbox Code Playgroud)