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

时间:2010-07-15 12:28:17

标签: vba excel-vba excel

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

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

我正在使用Excel 2003.

3 个答案:

答案 0 :(得分:49)

绝对是模块。

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

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

This article解释了不同类型代码容器的预期用法。它不符合为什么应该做出这些区别,但我相信大多数尝试在Excel平台上开发严肃应用程序的开发人员都会遵循它们。

还有一个VBA coding conventions的列表我觉得很有帮助,虽然它们与Excel VBA没有直接关系。请忽略他们在该网站上的疯狂命名约定,这些都是疯狂的匈牙利

答案 1 :(得分:10)

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

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

答案 2 :(得分:9)

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

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

可能会这样布局。

模块: DataAccess

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

模块: PopulateSheet

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

工作表: 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