Excel VBA反复更改一个控制单元的内存

我在网上search的相当广泛,但没有find任何类似的经验。 有任何想法吗?

我在VBA中有一个简单的子程序来改变一个控制单元。 该控制单元由另一个表单中的公式使用。 随着代码改变控制值,Excel越来越多地使用Excel来停止Excel。

基本上我有一个3000行和330列的表单设置。 在工作表的每个单元格中填充以下相同的公式:

=sum(sheet1!F8:INDEX(sheet1!F8:F$3000,Control!$D$1)) 

所以在单元格A1您可以使用上面的公式,在单元格B1您将拥有:

 =sum(sheet1!F**9**:INDEX(sheet1!F9:F$3000,Control!$D$1)) 

代码改变的控制值是Control!$D$1 ,因此改变控制从2到4将导致计算sheet1中连续2到4行的运行Sum。 请注意,代码首先在控制单元(200)中设置一个较高的值,然后降低到2.内存使用量的增加令我感到困惑。

我有的代码是:

 For i = 200 To 1 Step -1 Application.Calculation = xlCalculationManual ClearClipboard 'sets cutcopymode to false Range("Control!d1").Value = i Application.Calculation = xlCalculationAutomatic Next i 

最后,我尝试了下面的select,但没有一个适合我:

  • 在VBAarrays中进行所有计算:因为VBA不是multithreading的,所以这是非常慢的(关键是要利用我的cpu内核在Excel工作表中使用公式)
  • 设置screenupdating = false,enablevents = false,cutcopymode = false没有明显的改进
  • 将公式转换为值并通过VBA重新input公式:这再次减慢了计算速度
  • 手动减less处理器的数量:因为我需要快速计算,所以打败了我的方法的目的

这是一个Excel错误?

我已经对你的问题做了更多的研究。 运行总和函数的构build方式需要创build很多中间范围:

=sum(sheet1!F8:INDEX(sheet1!F8:F$3000,Control!$D$1))

首先, sheet1!F8:F$3000 ,第二个是INDEX()函数的结果,第三个是SUM()的参数。 相反,我build议只使用OFFSET()函数构造一个范围(最小值)。 它适用于任务,因为控制参数是一个标量,OFFSET()从范围和标量中创build一个新的范围。 运行总和是

=SUM(OFFSET(sheet1!$A$1;ROW()-1;COLUMN()-1;Control!$D$1;1))

其中控制值仅仅设置要被求和的范围的大小。 在我用2000 x 14个单元和200个循环的testing中,没有观察到内存消耗的增加。 由于这两个方法(INDEX()和OFFSET())对于一个大小不能做任何关于计算时间的假设(但请参阅下面的提示)是相当快的。

我已经添加了ROW()和COLUMN()函数来使公式自我调整 – 总和的起始地址将是公式所在单元格的相同地址。这样,表单上的所有公式都是完全相同的而不必根据他们的位置来改变。

至于运行时,我build议你离开循环改变计算模式(即自动)。 我注意到每个模式改变都有几秒的巨大开销。 在改变控制单元之后,所有相关的单元必须被计算一次,并且将模式设置为手动将不会改变该单元。

最后,如果您使用原始数据尝试此公式,则testing是否ClearClipboard命令将会产生任何影响。 最终它将不得不调用一个Windows函数,从而离开Excel的过程环境,我不明白为什么它在这里需要,除了美容的目的。