Excel内存中的全局数组?


2

我有一张大纸 Sheet1 在我的Excel中,使用CSE我过滤它并在名为的范围内生成一个数组 filtered_resultSheet2; filtered_result 之后被许多查询使用 Sheet3 直到 Sheet10,主要由 VLookUp 等等,一切正常。

filtered_resultSheet2 很大,它的计算已经很慢,作为一个中间结果,它加速了计算 Sheet3 直到 Sheet10

现在,我想删除 Sheet2,以避免可视化中间结果。这仍然是可能的,因为我可以修改公式 Sheet3 直到 Sheet10,但随后Excel变得非常慢。

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


您可以使用VBA全局数组 - 请参阅 这个帖子
harrymc

@harrymc但是VBA全局数组不能用在公式中吗?
athos

1
可以将阵列分配给范围 Range.FormulaArray ,或者可以通过定义的用户函数调用在公式中使用。如果数组不合适而你的问题只是没有可视化sheet2,那么就是 把它藏起来
harrymc

想到的第一件事就是隐藏起来 Sheet2,如果你的目标只是“避免可视化中间结果”。
simlev

隐藏是一种伪装......
athos

Answers:


3

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

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

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

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

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

如何做好记忆中的一切

如果要完全删除表单,可以使用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行。


是的,我想在记忆中做一切,谢谢。
athos

1

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

虽然此解决方案并不复杂,但它不需要您进行更改 您的应用程序中的任何内容,它将解决缓慢显示问题。


0

这个snipet应该没有太多编辑工作。长话短说,你最好制作一个sub来制作数组,只要再次调用sub,它就应该保留在内存中。

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

这并不好,因为每次都要再次调用sub,但真正的计算很重。
athos

@athos仍在回答关于标题的问题。将volite公式留在工作表中也更快。
dmb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.