【问题标题】:Put Excel-VBA code in module or sheet? [closed]将 Excel-VBA 代码放入模块或工作表中? [关闭]
【发布时间】:2011-03-16 09:22:26
【问题描述】:

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

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

我使用的是 Excel 2003。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    绝对在模块中。

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

    由于工具在 Excel VBA 等原始系统中非常糟糕,因此最佳实践、强迫性代码卫生和对约定的虔诚遵循很重要,尤其是当您尝试用它做任何远程复杂的事情时。

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

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

    【讨论】:

    • 在 Reddick 命名约定中实现的匈牙利符号或多或少已成为 Visual Basic for Applications 和 VB6 的变量命名标准。虽然我肯定会避免在工具非常强大的 .NET 中使用它,但在工具较旧的 VBA 中使用它并没有什么坏处。
    • @Ben - “疯狂的匈牙利语”被说成是诙谐的 :) 虽然匈牙利语确实有助于缺乏静态打字和围绕“这又是什么”的工具,但我认为当你更倾向于面向对象的 VBA 并开始创建自己的域对象。然而,我最大的抱怨是,匈牙利语确实扰乱了实际阅读代码的流程。每个人都有自己的想法,对我来说不是宗教观点。但是如果有人问,我不会推荐它。
    • 好点。我同意在 VBA 中构建类时,匈牙利语会使你的对象看起来很丑。也许我仍然在 VB6 中使用它来提醒自己我正在使用 VB6 :-)。
    • “如果没有完全限定引用,您不能从其他模块调用工作表“代码隐藏”中的代码。”我该怎么做?
    【解决方案2】:

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

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

    【讨论】:

    • 这也是我的一般政策。
    【解决方案3】:

    我建议根据特定于每个工作表或模块的功能和用途来分离您的代码。以这种方式,您只会将与工作表的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多