【发布时间】:2011-03-16 09:22:26
【问题描述】:
什么是良好的实践和良好的代码卫生?将代码放入模块或表格中?
我有这个 Excel 工作簿,每张表都有用户界面。工作簿中的每个工作表都执行某些总体任务的不同部分。我应该将与每张工作表相关的代码放在工作表对象内还是模块中?组合成一个模块,还是单独的模块?
我使用的是 Excel 2003。
【问题讨论】:
什么是良好的实践和良好的代码卫生?将代码放入模块或表格中?
我有这个 Excel 工作簿,每张表都有用户界面。工作簿中的每个工作表都执行某些总体任务的不同部分。我应该将与每张工作表相关的代码放在工作表对象内还是模块中?组合成一个模块,还是单独的模块?
我使用的是 Excel 2003。
【问题讨论】:
绝对在模块中。
由于工具在 Excel VBA 等原始系统中非常糟糕,因此最佳实践、强迫性代码卫生和对约定的虔诚遵循很重要,尤其是当您尝试用它做任何远程复杂的事情时。
This article 解释了不同类型代码容器的预期用途。这并不限定为什么应该做出这些区别,但我相信大多数尝试在 Excel 平台上开发严肃应用程序的开发人员都会遵循它们。
还有一个VBA coding conventions 列表,我发现它们很有帮助,尽管它们与 Excel VBA 没有直接关系。请忽略他们在该网站上的疯狂命名约定,都是疯狂的匈牙利语。
【讨论】:
根据我的经验,最好将尽可能多的代码放入命名良好的模块中,并且只将所需的代码放入实际的工作表对象中。
示例:使用 Worksheet_SelectionChange 或 Worksheet_Calculate 等工作表事件的任何代码。
【讨论】:
我建议根据特定于每个工作表或模块的功能和用途来分离您的代码。以这种方式,您只会将与工作表的 UI 相关的代码放在工作表的模块中,并且只将与模块相关的代码放在相应的模块中。此外,使用单独的模块来封装在多个不同工作表之间共享或重用的代码。
例如,假设您有多个工作表,它们负责以特殊方式显示数据库中的数据。在这种情况下,我们有哪些功能?我们有与每个特定工作表相关的功能、与从数据库中获取数据相关的任务以及与用数据填充工作表相关的任务。在这种情况下,我可能会从一个用于数据访问的模块开始,一个用于用数据填充工作表的模块,在每个工作表中我都有用于访问这些模块中的代码的代码。
可能是这样布置的。
模块:数据访问:
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
工作表:工作表 1 代码:
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
【讨论】: