在VBA Excel 2010中,如何(如果可能)从工作表中定义和填充全局数组variables?

*******背景*******由于不能辩论的原因,我正在使用Excel 2010和VBA来编程一个科学模型,该模型涉及用户从每个物种的在线数据库向工作表input数据参与其中。 物种的数量可能会从仿真变为仿真。 随着程序的迭代,它会多次调用多个函数(一些成千上万次)。 该程序的执行速度变得太长,所以我想尝试加快速度。 在我看来,提高执行速度的两件简单的事情就是减less工作表调用次数,并尽量减less我必须使用的variables数量。

另外值得注意的是几个函数共享相同的常量。

我已经在stackexchange和其他网站的其他地方,但我还没有find我在找什么♪。 也许我只是没有正确的search条件。


这个问题由于物种的数量并不是恒定的,因为我想让一些常量可用于多个函数,所以我可以定义一个全局variables,它是一个双精度数组(double)(或单精度数组)当一个子程序运行时,它的尺寸就是这样的,从excel表单中读取一次常量,然后在我的“main”子程序执行完后就被销毁了。

我可以在main子类中创build数组,并将其作为parameter passing,但是我的一些函数已经将其他函数作为参数调用,而且我的一些行很长,很难阅读。 通过使这些常量parameter passing给函数只增加这些行的长度。

第二个问题,如果我不能创build一个全局数组variables是有一次调用工作表(像我这样做),但使variables双而不是一个变种? 由于types不匹配错误,我无法得到以下工作。 Dim C()As Double redim c(1 to 7,1 to n)C = Application.Transpose(Worksheets(“Viscosity2”)。Range(“J10:p19”))

函数示例:我有一个在VBA中运行的函数。 这个function在我的程序中被称为几万次。 我想使C(1到7,1到n)数组和mw(1到n)数组双精度数组调用工作表一次,然后可用于多个函数。

下面是这个例子的function:

Function mumx(y, T) 'this function calculates the mixture viscosity using the Chapman Enskog Wilke method 'using the mol fraction vector, y, and the temperature T n = UBound(y, 1) - LBound(y, 1) + 1 'number of species '***********Get Equation Parameters from Worksheet************** Dim C() As Variant C = Application.Transpose(Worksheets("Viscosity2").Range("J10:p19")) Dim mw As Variant mw = Application.Transpose(Worksheets("Viscosity2").Range("g10:g19")) '*************************************************************** Dim mu() As Double ReDim mu(1 To n) For i = 1 To n Step 1 mu(i) = (C(1, i) * (T ^ C(2, i))) / (1 + C(3, i) / T + (C(4, i) / (T ^ 2))) Next i Dim phi() As Double ReDim phi(1 To n, 1 To n) For i = 1 To n For j = 1 To n phi(i, j) = 1 / 8 ^ 0.5 * (1 + mw(i) / mw(j)) ^ -0.5 * (1 + (mu(i) / mu(j)) ^ 0.5 * (mw(j) / mw(i)) ^ 0.25) ^ 2 test = 1 Next j Next i Dim denom As Double Dim mumix As Double denom = 0 mumix = 0 For i = 1 To n For j = 1 To n denom = denom + y(j) * phi(i, j) Next j mumix = mumix + y(i) * mu(i) / denom denom = 0 Next i mumx = mumix 'where the units on mumx are in units of cP (which are 1 gm/(m*s)) End Function '************Example constants are as follows******** 'PS should someone stumble on this looking for say viscosity data 'the following constants just example constants ' ' 'C(1, 1) = 0.00018 'C(1, 2) = 0.000017 'C(1, 3) = 0.001113 'C(1, 4) = 0.00215 'C(1, 5) = 0.0005255 'C(1, 6) = 0.0011 'C(1, 7) = 0.0006559 'C(1, 8) = 0.00005 'C(1, 9) = 0.00026 'C(1, 10) = 0.002079 ' 'C(2, 1) = 0.69 'C(2, 2) = 1.115 'C(2, 3) = 0.534 'C(2, 4) = 0.46 'C(2, 5) = 0.59 'C(2, 6) = 0.563 'C(2, 7) = 0.608 'C(2, 8) = 0.90 'C(2, 9) = 0.68 'C(2, 10) = 0.4163 ' 'C(3, 1) = -0.59 'C(3, 2) = 0 'C(3, 3) = 94.7 'C(3, 4) = 290. 'C(3, 5) = 106. 'C(3, 6) = 96.3 'C(3, 7) = 54.7 'C(3, 8) = 0 'C(3, 9) = 98.9 'C(3, 10) = 353. ' 'C(4, 1) = 140. 'C(4, 2) = 0 'C(4, 3) = 0 'C(4, 4) = 0 'C(4, 5) = 0 'C(4, 6) = 0 'C(4, 7) = 0 'C(4, 8) = 0 'C(4, 9) = 0 'C(4, 10) = 0 ' ' 'C(5, 1) = 0 'C(5, 2) = 0 'C(5, 3) = 0 'C(5, 4) = 0 'C(5, 5) = 0 'C(5, 6) = 0 'C(5, 7) = 0 'C(5, 8) = 0 'C(5, 9) = 0 'C(5, 10) = 0 ' 'C(6, 1) = 300 'C(6, 2) = 300 'C(6, 3) = 300 'C(6, 4) = 300 'C(6, 5) = 300 'C(6, 6) = 300 'C(6, 7) = 300 'C(6, 8) = 300 'C(6, 9) = 300 'C(6, 10) = 300 ' 'C(7, 1) = 1000 'C(7, 2) = 1000 'C(7, 3) = 1000 'C(7, 4) = 1000 'C(7, 5) = 1000 'C(7, 6) = 1000 'C(7, 7) = 1000 'C(7, 8) = 1000 'C(7, 9) = 1000 'C(7, 10) = 1000 ' ' ' 'mw(1) = 2.0158 'mw(2) = 18.0148 'mw(3) = 28.01 'mw(4) = 44.009 'mw(5) = 16.0426 'mw(6) = 31.998 'mw(7) = 28.014 'mw(8) = 44.0962 'mw(9) = 30.0694 'mw(10) = 28.0536 ' ''****************************** 

是的,您可以并应该*使用一个数组来存储用户input的常量,是的,您可以使它成为全局的,以便它不必传递给其他函数。

这是一个例子。 请注意,数据首先被读入Variant,然后被转移到数组 – 这是您导致Type Mismatch错误的缺失步骤。 虽然这可能看起来像是太多的代码,但是将数据传输到Doublearrays比单独读取单元要快很多倍。

 Public C() As Double Public Sub PopulateArrayC(n As Integer) ReDim C(1 To 7, 1 To n) Dim v As Variant v = Application.Transpose(Worksheets("Viscosity2").Range("J10:P" & n + 10 - 1)) Dim i As Integer, j As Integer For i = 1 To 7 For j = 1 To n C(i, j) = v(i, j) Next j Next i End Sub 

*读取和写入单元格是非常耗时的。 只要有可能,限制读取和写入的数量*

  1. 将常用值存储在variables中
  2. 一次读/写整个范围。