vba - 如何在 VBA Excel 2016 中查看编译后的子例程的大小?

标签 vba excel compiler-errors

在模块的特定子例程上发现“procedure to large”错误后,我正在重构模块中的代码。我很好奇重构在减少编译代码大小方面的效果如何。

所以我想知道是否有办法查看 Excel 2016 模块中子例程的编译代码的大小?

到目前为止,我的尝试仅限于在线搜索确定 VBA 中已编译模块或子例程的大小的方法。

它让我发现了 VBA 的局限性,如 here 中列出的那样。 。它没有提到查看编译过程的大小的方法,也没有提到这是否(实际上)可能。

(正如评论中提到的,编译过程的当前最大大小为 64K,如 here 所述。)

  1. 我认为编译后的程序大小与行数并不是1对1的关系。 (因为这没有考虑短行或长行。但我目前不确定 vba-procure 是如何编译的,以及行如何影响编译文件大小,否则解决方案可能是计算编译文件大小.)
  2. 一对一的过程也不依赖于存储为“.txt”文件的代码的大小。 (因为它可以包含不会影响编译代码大小的注释)

免责声明 - 我很清楚我正在修改的旧代码的缺点。它写得不好,我认为比尔·盖茨的这句话很好地说明了这一点:

Measuring programming progress by lines of code is like measuring aircraft building progress by weight.

我认为重构并将代码分解为较短的子例程是适当的第一步。为了监视这个过程,结合 VBA 提出的硬瓶颈,如 Procedure too long - 错误让我想到了这个问题。

最佳答案

不,你不能那样做。 VBA 分几个阶段进行编译,它的一部分是 p 代码,一部分是解释的,最终,编译过程的大小(以 kb 为单位)并不是您需要处理的。

<小时/>

您迫切需要阅读有关抽象的内容。触发此编译器错误的过程超过 10K 行代码。适当抽象级别的健康过程可能比这个小 500 到 1000 倍(不是开玩笑) - 编译代码的大小绝对没有意义

如果您担心编译后代码的大小,那么您就不是在为人类编写代码。

代码不是为编译器处理和运行时环境而编写的。代码是为人类维护人员阅读、理解、遵循、调试、修改、扩展等而编写的。如果没有任何抽象级别,代码就是一系列无聊、令人难以忍受的可执行语句,这些语句总是冗余、低效且烦人的容易出现错误。

您可以使用第 3 方工具来分析 VBA 代码。 MZ-Tools 3.0 是免费的,但最新版本不是免费的。它有一个功能,可以告诉你每个模块的每个过程中有多少行代码,有多少代码被注释掉,是否有未使用的变量等等。

Rubberduck是免费和开源的,正在积极开发中(免责声明:我拥有该项目的存储库),并且具有代码指标功能(与代码检查不同),可能会有所帮助您确定了最有问题的区域(尽管解析 10K 线性模块可能需要一段时间):

Rubberduck Code Metrics

行数是您的“代码行数”指标;循环复杂度是代码中不同可能执行路径的粗略指标(该指标在模块级聚合中的意义有多大是值得商榷的); 最大嵌套也是“箭头形”代码可能有多严重的一个指标。

这些指标的值较高表明您可能需要提取方法

关于vba - 如何在 VBA Excel 2016 中查看编译后的子例程的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50492838/

相关文章:

c++ - C++将类拆分为多个文件。我指定类型时采用的显式类型int

c# - 无法分配数据

VBA Powerpoint - 打开时自动运行并在后台运行

vba - 运行时错误 '424' : Object required vba

vba - 跳过 "Open as read-only?"的自动弹出

excel - 如何更改 EPPlus 中 ColumnField 列标题的格式?

c++ - 抽象类/函数编译错误

vba - 使用 VBA 将公式分配给 Excel 单元格

excel - 如何通过单元格引用更新电源数据透视表过滤器?

excel - 在另一个工作表中的另一个按钮上运行(单击)的命令按钮