首页 文章

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

提问于
浏览
3

在模块的特定子例程中找到“大过程”错误后,我正在重构模块中的代码 . 我很好奇重构在减少编译代码大小方面的效果 .

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

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

它使我达到here中列出的VBA限制 . 它没有提到一种方法来查看编译过程的大小,也没有提到这是否(实际上)可行 .

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

  • 我认为编译过程的大小不是1对1与行数有关 . (因为这没有考虑短线或长线 . 但我目前不确定如何编译vba-procure,以及因此线如何贡献编译文件大小,否则解决方案可能是计算编译文件大小 . )

  • 过程1 on 1也不依赖于存储为'.txt'文件的代码大小 . (因为它可以包含对编译代码大小没有贡献的注释)

Disclamer - 我很清楚我修改的旧代码的缺点 . 写得不好,我认为比尔盖茨的这句话很好地说明了这一点:

按代码行测量编程进度就像按重量测量飞机制造进度一样 .

我认为重构,并在较短的子程序中打破代码是适当的第一步 . 为了监控这个过程,结合VBA提出的硬瓶颈 Procedure too long - 错误引发了我这个问题 .

1 回答

  • 13

    不,你做不到 . VBA在几个阶段编译,它是部分p代码,部分解释,并且在一天结束时,编译过程的kb大小不是你需要处理的 .


    你需要紧急阅读 Abstraction . 触发此编译器错误的过程超过10K行代码 . 在适当的抽象级别上的 Health 程序可能比那个小500到千倍(不是开玩笑) - the size of the compiled code is absolutely meaningless .

    如果你担心编译代码的大小,你就不会为人类编写代码 .

    代码不是为编译器编写的,而是为了运行而运行的运行时环境 . 代码是为人类维护者编写的,用于阅读,理解,跟踪,调试,修改,扩展等 . 在没有任何抽象级别的情况下,代码是一个无聊的,令人难以忍受的令人烦恼的一系列可执行语句,总是冗余,低效和烦人容易出错 .

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

    Rubberduck是免费的开源,正在积极开发中(免责声明:我拥有项目的存储库),并且具有代码度量功能(不同于代码检查),可以帮助您识别问题最严重的区域(尽管解析10K-衬管模块可能需要一段时间):

    Rubberduck Code Metrics

    行是你的"lines of code"指标; Cyclomatic Complexity是代码中不同可能的执行路径的粗略指示(度量在模块级聚合中产生的多少意义是有争议的);最大嵌套也是"arrow-shaped"代码可能有多严重的指标 .

    这些指标中的高值表示您可能需要提取方法 .

相关问题