1

我正在尝试在 VB(Excel 宏)中编写一个模拟器,其中模拟的输入取自一张表中的单元格。输入将放置在多个数组中,例如 timePerUser(10) 和 bytesPerUser(10)。然后会有一些简单的 if/for/while 东西来根据数组进行计算,最后我会将结果写回 Excel。因此,Excel 将仅用于提供输入数据和显示结果,其他一切都发生在宏内部,包括更改数组中的值。

我习惯使用 Matlab,但不能将它用于这个模拟器,所以这是我的问题:

  1. 我可以在 Excel 宏中使用任何现有的矩阵/数组操作吗?例如,是否有一些命令可以检查数组中的最小值或下一个最小值?Excel 函数“SMALL”将是完美的,但它似乎不适用于宏。还是我只需要用 for 循环解决这个问题?

  2. 关于如何创建数组还有其他建议吗?最好有一个大矩阵,其中每一行对应于时间、数据、用户等(NxM 矩阵),还是每个参数都有单独的数组更好?

  3. 如何加快矩阵/数组运算?有什么一般性的建议吗?

谢谢!奥斯卡

4

1 回答 1

4

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

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

其中 r 是一个数组或范围,n 是介于 1 和r.Cells.Count

我强烈建议您对每个概念变量使用一个变量,而不是试图巧妙地处理一个二维数组中的多个实体。Speedwise 我怀疑差异很小;但是编写不可读代码的机会很重要。

至于加快速度:将变量(尤其是数组)定义为某种固定类型(而不是变体)确实很有帮助,例如:

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

在模块的开头,因为它将确保您未声明的任何变量(或更常见的是您拼写错误)将产生解释器错误。

关于数组的另一件事:作为一个 Matlab 人,您习惯于 Matlab 根据需要增加数组大小。在 VBA 中,可以在运行时动态更改数组大小,例如使用

ReDim Preserve a(1 To 20)

这将使数组a大小为 20 个元素。如果它更短,它将用零填充;如果它更长,它将被修剪。这可能很有用,但非常昂贵,因为通常需要将整个数组复制到新位置。当您事先不知道您的数组有多大时,最好高估(并检查边界)而不是每次需要变大时都重新调整 - 并在最后ReDim进行最终处理以使其达到正确的大小。

希望这足以让您开始!

于 2013-02-28T21:49:21.970 回答