我正在尝试在 VB(Excel 宏)中编写一个模拟器,其中模拟的输入取自一张表中的单元格。输入将放置在多个数组中,例如 timePerUser(10) 和 bytesPerUser(10)。然后会有一些简单的 if/for/while 东西来根据数组进行计算,最后我会将结果写回 Excel。因此,Excel 将仅用于提供输入数据和显示结果,其他一切都发生在宏内部,包括更改数组中的值。
我习惯使用 Matlab,但不能将它用于这个模拟器,所以这是我的问题:
谢谢!
奥斯卡
最佳答案
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
最后让它调整到合适的尺寸。希望这足以让您开始!
关于arrays - 处理 Excel 的 VBA 宏中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15145926/