我的 Excel 中有一个大表Sheet1
,我使用 CSE 对其进行了过滤并在名为 的范围内生成一个数组filtered_result
;Sheet2
之后该数组被tillfiltered_result
中的许多查询使用,主要是等,一切正常。Sheet3
Sheet10
VLookUp
filtered_result
中的Sheet2
很大并且它的计算已经很慢了,作为中间结果,它加速了中的计算Sheet3
直到Sheet10
。
现在,我想删除Sheet2
,以避免可视化中间结果。这仍然是可能的,因为我可以修改 中的公式Sheet3
,Sheet10
但 Excel 会变得相当慢。
有没有办法以某种方式将原始中间结果存储filtered_result
在Sheet2
内存中,并且以后的查询仍然能够检索它?
答案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