arrays - 处理 Excel 的 VBA 宏中的数组

标签 arrays excel matlab

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

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

  • 我可以在 Excel 宏中使用任何现有的矩阵/数组操作吗?例如,是否有一些命令可以检查数组中的最小值或下一个最小值? Excel 函数“SMALL”将是完美的,但它似乎不适用于宏。还是我只需要用 for 循环解决这个问题?
  • 关于如何创建数组还有其他建议吗?最好有一个大矩阵,其中每一行对应于时间、数据、用户等(NxM 矩阵),还是每个参数都有单独的数组更好?
  • 如何加快矩阵/数组运算?有什么一般性的建议吗?

  • 谢谢!
    奥斯卡

    最佳答案

    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/

    相关文章:

    java - 如何乘以数组长度减去索引

    php - 使用 PHP 多维数组作为数据库

    Excel VBA 字典项连接

    matlab - 如何设置 Mat to Mat with a mask? (开放式简历)

    javascript - 如何使用 lodash 根据值对嵌套数组进行排序?

    java - 使用数组进行用户输入

    C#读取多个Excel文件

    .net - 优化 vba 宏 excel 2007 的循环

    excel - matlab,如何将文本和数值数据导出到 excel csv 文件?

    r - 为什么这个巴特沃斯滤波器在 R 和 Matlab 中呈现不同的结果?