Excel 内存中的全局数组?

Excel 内存中的全局数组?

我的 Excel 中有一个大表Sheet1,我使用 CSE 对其进行了过滤并在名为 的范围内生成一个数组filtered_resultSheet2之后该数组被tillfiltered_result中的许多查询使用,主要是等,一切正常。Sheet3Sheet10VLookUp

filtered_result中的Sheet2很大并且它的计算已经很慢了,作为中间结果,它加速了中的计算Sheet3直到Sheet10

现在,我想删除Sheet2,以避免可视化中间结果。这仍然是可能的,因为我可以修改 中的公式Sheet3Sheet10但 Excel 会变得相当慢。

有没有办法以某种方式将原始中间结果存储filtered_resultSheet2内存中,并且以后的查询仍然能够检索它?

答案1

不要使用数组公式,使用常规公式。

例如,假设您有一个公式,当 A 列中的值大于 10 时,添加 B 列。不要创建带有条件的数组公式来执行此操作。而是使用以下公式创建新的 C 列:

=If( $A > 10, $B, 0 )

因此,如果满足条件,则第三列包含 B 的值;如果不满足条件,则包含 0。现在只需对 C 列求和。此方法通常比数组公式快得多。它被称为“辅助列”。

如果计算速度仍然很慢,请使用宏或 VBA 来计算值;这样,您只需计算一次,如果情况没有变化,则无需重新计算。因此,在上面的例子中,我们可以使用宏(或 VBA 代码)来计算 If 公式并将结果放入单元格中,而不是使用条件公式。然后在需要计算表格并生成值时运行宏。由于电子表格本身没有条件(If 语句),因此计算速度会快得多。

如何利用内存完成所有操作

如果您想完全摆脱工作表,您可以使用 VBA 代码模块中的静态变量在内存中完成所有操作:

Dim MyArray(1000, 2000) As Double

Sub computeMyArray()
   ... compute all the values of MyArray
End sub

Function GetValueFromMyArray( Dim x as Integer, Dim y as Integer )
   GetValueFromMyArray = MyArray( x, y )
End Function

然后,您可以在工作簿的任何单元格中使用此函数从您创建的数组(即内存)中获取值。例如,工作簿中的单元格可以包含以下公式:

=GetValueFromMyArray( 5, 6 )

这将检索内存中数组的第 5 行、第 6 行。

答案2

最简单和最愚蠢的解决方案就是隐藏工作表Sheet2关联)。

虽然这个解决方案并不复杂,但它不需要您在应用程序中进行任何更改,并且可以解决显示缓慢的问题。

答案3

此代码片段无需过多编辑即可运行。长话短说,您最好创建一个子程序来创建数组,只要您再次调用该子程序,它就会保留在内存中。

Public Sub MakeArrayGlobal(byRef Range as Range)
    dim MyPublicArray() as Variant
    with Range
        counter = 0
        For each cell in range
            MyPublicArray(counter) = cell.value #Or whatever you need
            counter = counter + 1
        Next
    End with
End sub

相关内容