什么是专业和职业Excel VBA中传递数组与全局数组的缺点

时间:2010-02-02 22:12:36

标签: excel vba excel-vba excel-2003

好的,第二次尝试编写Stack Overflow问题,如果这看起来很熟悉,请原谅我。

我正在重写一个在2年半的时间内建立的Excel宏,frankenstein风格(添加到零碎)。我需要做的一件事就是将数据加载到一个数组中,只加载一次以获得数据的准确性和速度。对于我的技能水平,我将坚持使用Array方法。

我的两种方法是:

  • 使用全局调暗动态数组
  • 在我的Main过程中调暗动态数组并将它们传递给被调用的过程

那么,Stack Overflow对这两种方法的优点与缺点的看法是什么? 谢谢, 克雷格...

2 个答案:

答案 0 :(得分:9)

首先,回答你特别没问的问题:设置一个自定义类并加载其中的数据。说真的,你以后会感谢我。

好的,关于你的问题。我首先尽可能地限制范围。这意味着我在程序之间传递变量。当您的所有变量都具有最严格的限制范围时,您将遇到最少的问题。

一旦变量通过两个级别深度调用(调用过程到第一层,第一层到第二层),那么我就开始对我的结构进行严格审查。通常(但不总是)如果所有三个过程都在同一个模块中,我将创建一个模块级变量(使用Private关键字而不是Dim)。如果正确地(而不是任意地)分离模块,则可以使模块级变量没有太大风险。

有些变量从一开始就是全局变量:包含应用名称和应用版本的变量;只要应用程序正在运行,顶级类模块就不应该丢失范围;保持命令栏名称之类的常量(我知道它们不是变量)。我知道我希望这些是全球性的,所以他们就是这样开始的。

我将要说明模块级变量永远不会迁移到全局变量。全局变量因其性质而以这种方式开始。如果使用模块级变量看起来很麻烦,可能是因为我没有充分理由拆分模块,或者我需要重新考虑我的整个框架。

这并不是说我从来没有欺骗过,而且在我不应该做的时候也使用了全局。我们都做到了,如果你也这样做,你不应该失眠。

所以要正确地预订这篇文章:我放弃使用数组,除非我被迫。我使用自定义类,因为

ActiveCell.Value = Invoice.LocalSalesTaxAmount
调试比

好得多
ActiveCell.Value = aInvoice(35,2)

万一你认为你需要更多的技能来使用自定义类 - 我也是如此。我咬了一口子弹,其他任何人都可以。

答案 1 :(得分:2)

你需要小心Excel VBA中的全局变量,因为如果你的应用程序遇到任何类型的bug,并进行某种软复位(但应用程序仍然起作用),那么全局变量将被删除。

我不得不放弃全局,因为我没有写出完美的应用程序。