处理Excel的VBAmacros中的数组

我正在尝试在VB(Excelmacros)中编写一个模拟器,从一个工作表中的单元格中获取模拟的input。 input将被放置在许多数组中,例如timePerUser(10)和bytesPerUser(10)。 然后会有一些简单的if / for / while的东西来进行基于数组的计算,最后我会把结果写回Excel。 所以,Excel将只用于提供input数据并显示结果,其他所有内容都发生在macros内部,包括更改数组中的值。

我用Matlab的工作,但不能用于这个模拟器,所以这里是我的问题:

  1. Excelmacros中是否有任何现有的matrix/数组操作? 例如,是否有一些命令来检查数组中的最小值或下一个最小值? Excel函数“SMALL”将是完美的,但它似乎不能在macros中工作。 或者我只需要用for-loops解决这个问题?

  2. 有没有其他build议如何创build数组? 有一个大matrix,每行对应于时间,数据,用户等(一个NxMmatrix),还是每个参数都有单独的数组?

  3. 如何加快matrix/arrays操作? 任何一般的build议?

谢谢! 奥斯卡

Excel确实有一些简单的数组操作 – SUMPRODUCT(Matlab等效:A * B'),MIN,MAX,…其中大部分包括SMALL,都需要使用Application.WorksheetFunction.xxx来调用; 例如,可以使用以下方法在VBA中调用SMALL函数:

 nthSmallest = Application.WorksheetFunction.Small(r, n) 

其中r是数组或范围,n是1和r.Cells.Count之间的整数

我强烈要求你为每个概念variables使用一个variables,而不是试图在一个2D数组中使用多个实体。 速度我怀疑差距很小; 但是编写不可读代码的机会是非常重要的。

至于加快速度:它确实有助于定义你的variables(特别是你的数组)作为一些固定types(而不是Variant),例如:

 Dim a(1 To 10) as Double Dim ii as Integer 

所有的数组都可以使用相同的(默认)基础。 由于我自己是一个Matlab迷,所以我经常使用从1开始的数组索引 – 在VBA中通过添加来强制执行此操作

 Option Base 1 

在你的模块的开始。 在这一点上,如果你声明

 Dim a(10) as Double 

它相当于

 Dim a(1 To 10) as Double 

对于不熟练VBA的人来说,也是一个好的做法

 Option Explicit 

在模块的开始,因为它将确保你没有声明的任何variables(或者更经常地,你拼错)将会产生一个解释错误。

另一个关于数组的问题:作为一个Matlab人,你习惯于使用Matlab来根据需要增加数组的大小。 在VBA中,可以在运行时dynamic地改变数组的大小,例如

 ReDim Preserve a(1 To 20) 

这将使arraysa大小a 20个元素。 如果更短,则用零填充; 如果时间更长,则会被修剪。 这可能是有用的,但非常昂贵,因为通常整个arrays需要被复制到一个新的位置。 当你事先不知道数组的大小时,最好高估(和检查范围),而不是每次需要更大的时候对ReDim进行估计 – 最后做一个最终的ReDim ,使其达到合适的大小。

希望这足以让你开始!