什么是良好做法和良好的代码卫生?将代码放在模块或表格中?
我有这个Excel工作簿,每张工作表都有用户界面。工作簿中的每个工作表都执行某项总体任务的不同部分。我应该将相关的代码放在Sheet对象或模块中吗?分组成一个模块,还是单独的模块?
我正在使用Excel 2003.
答案 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