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

47
好的实践和良好的代码卫生是什么?将代码放在模块或工作表中?
我有一个Excel工作簿,每个工作表都有用户界面。工作簿中的每个工作表执行一项整体任务的不同部分。我应该将与每个工作表相关的代码放在Sheet对象内还是放在模块中?将它们分组到一个模块中还是使用不同的模块?
我正在使用Excel 2003。
3个回答

55

一定要使用模块。

  • 工作表可以删除、复制和移动,并会产生意外的结果。
  • 不能在其他模块中从工作表“代码后台”调用代码,而不充分限定引用。这将导致工作表与其他模块/工作表中的代码耦合。
  • 模块可以导出和导入到其他工作簿,并放置在版本控制下。
  • 将代码按逻辑分割成模块(数据访问、实用程序、电子表格格式等),可以作为单元重复使用,如果您的宏变得很大,则更容易管理。

由于原始系统如Excel VBA中的工具链非常差,因此最佳实践、过度的代码卫生以及遵循约定都非常重要,特别是如果您试图通过它完成任何稍微复杂的任务。

本文解释了不同类型的代码容器的预期用途。它不说明应该做出这些区分的原因,但我相信大多数试图在Excel平台上开发严肃应用程序的开发人员都会遵循它们。

还有一个VBA编码约定清单,我发现这很有帮助,尽管它们与Excel VBA没有直接关联。请忽略该网站上的疯狂命名约定,所有这些都是“疯狂的匈牙利语”。


2
在Visual Basic for Applications和VB6中,Reddick命名约定实现的匈牙利符号法已经成为变量命名的标准。虽然在工具支持非常强大的.NET中应避免使用它,但在工具较老的VBA中使用它并不会有什么坏处。 - Ben McCormack
@Ben - “疯狂的匈牙利”是半开玩笑说的:)虽然匈牙利标记法对于缺乏静态类型和围绕“这是什么”的工具有所帮助,但我认为当您朝着面向对象的VBA并开始创建自己的领域对象时,它还是不太够用。然而,我最大的抱怨是匈牙利标记法真的会干扰实际阅读代码的流程。每个人都有自己的想法,对我来说这不是一个信仰的观点。但是如果有人问,我不会推荐使用它。 - jevakallio
好观点。我同意,在VBA中构建类时,匈牙利命名法可能会使您的对象看起来很丑。也许我仍然在VB6中使用它,以提醒自己我正在使用VB6 :-). - Ben McCormack
“你不能在其他模块中调用“代码后台”工作表中的代码,除非完全限定引用。” 我该怎么做? - peter

12
在我的经验中,最好将尽可能多的代码放入具有良好命名的模块中,并且仅将所需代码放入实际的工作表对象中。
例如:任何使用工作表事件(例如Worksheet_SelectionChange或Worksheet_Calculate)的代码。

这也是我的一般政策。 - Lunatik

11
我建议根据每个工作表或模块的功能和特定目的,将代码分开。这样,您只会将与工作表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 Code

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接