Excel VBA中通过数组和全局数组有什么优点和缺点?

好吧,第二次尝试写一个堆栈溢出问题,所以请原谅,如果这似乎很熟悉。

我正在重写一个超过2年半的时间,frankenstein风格(增加到零碎)的Excelmacros。 我需要做的一件事就是将数据加载到数组中,一次又一次地提高数据的准确性和速度。 对于我的技能水平,我将坚持Array方法。

我的两种做法是:

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

那么,Stack Overflow对这两种方法的优点和缺点是什么呢? 谢谢,克雷格…

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

好的,在你的问题上。 我首先尽可能地限制范围。 这意味着我在过程之间传递variables。 当所有variables的可能范围都是最严格的时候,就会遇到最less的问题。

一旦一个variables通过两层深度(调用程序到第一层,第一层到第二层),然后我开始审视我的结构。 通常(但不总是)如果所有三个过程都在同一个模块中,我将创build一个模块级variables(使用Private关键字而不是Dim)。 如果你正确地分开你的模块(不是任意的),你可以有模块级别的variables而没有太大的风险。

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

我打算冒险,说模块级variables永远不会迁移到全局variables。 全球variables因其性质而开始。 如果使用模块级别的variables看起来很麻烦,那可能是因为我没有理由分割模块,或者我需要重新思考整个框架。

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

所以要正确预订这篇文章:除非我被强迫,否则我会退出使用数组。 我使用自定义类,因为

ActiveCell.Value = Invoice.LocalSalesTaxAmount 

比debugging好得多

 ActiveCell.Value = aInvoice(35,2) 

以防万一你认为你需要更多的技能来处理自定义的类 – 我也是如此。

你需要小心Excel VBA中的全局variables,因为如果你的应用程序遇到任何types的错误,并且做了某种软​​重置(但应用程序仍然有效),那么全局variables将被删除。

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