这是我的第一篇文章,我无法在任何地方找到确切的答案 . 我有一个Excel电子表格,它变得太大而无法运行,因为我在数百万个单元格中有很长的公式 . 我需要知道如何使用VBA计算公式,但只有值出现在Excel中 . 一个例子是我想将列B乘以列C:
我试过这段代码:
Range("D3:D6").Formula = Evaluate("=B3*C3")
它正确计算第一个单元格,但对于其他单元格,它仍然会尝试将B3 * C3计算为固定参考,而不是随着单元格位置的变化而变化的动态参考 .
我怎么能解决这个问题?谢谢 .
编辑:
我的实际电子表格如下所示:
此公式需要应用于17520行和300列,但我只希望值显示在Excel中 . 这样做的目的是减小文件大小并减少计算时间 .
=IF(-SUMIF(AIG$4:AIG4,"<0")>0.9*SUMIF(AIG$4:AIG4,">0"),0,IF(-SUMIF(AIG$4:AIG4,"<0")-IF(WQ5<'Battery Specs'!$B$13,-'Battery Specs'!$B$15,IF(WQ5=ROUNDDOWN('Battery Specs'!$B$13,0)+1,-('Battery Specs'!$B$13-ROUNDDOWN('Battery Specs'!$B$13,0))*'Battery Specs'!$B$15,0))>0.9*SUMIF(AIG$4:AIG4,">0"),-(0.9*SUMIF(AIG$4:AIG4,">0")+SUMIF(AIG$4:AIG4,"<0")),IF(WQ5<'Battery Specs'!$B$13,-'Battery Specs'!$B$15,IF(WQ5=ROUNDDOWN('Battery Specs'!$B$13,0)+1,-('Battery Specs'!$B$13-ROUNDDOWN('Battery Specs'!$B$13,0))*'Battery Specs'!$B$15,IF((0.9*SUMIF(AIG$4:AIG4,">0")+SUMIF(AIG$4:AIG4,"<0"))>'Battery Specs'!$B$10,0,IF(((0.9*SUMIF(AIG$4:AIG4,">0")+SUMIF(AIG$4:AIG4,"<0"))+$AIF5*0.9)>'Battery Specs'!$B$10,'Battery Specs'!$B$10-(0.9*SUMIF(AIG$4:AIG4,">0")+SUMIF(AIG$4:AIG4,"<0")),$AIF5))))))
4 回答
尝试
或者干脆
我认为最好的选择是保留公式而不是使用VBA来生成相同的公式 . 相反,在SpreadSheet中输入新数据时,请务必将计算设置为手动(转到
Formulas
tab =>Calculation Options
=>Manual
. 这样,在输入/粘贴新值时,您不会触发计算,这意味着您的Excel文件将以同样快的速度运行好像没有公式 . 输入/粘贴所有新值后,将Calculations
设置为Automatic
.使用Evaluate计算公式,然后将值传输到Excel将比Excel直接计算公式慢 .
您可以尝试以下几种方法:
a)公式你在500万个单元中只有500万个公式 - 这不是一个非常大的数字,但你的公式很长,每个公式都引用了大量的单元格 . 您的公式包含许多重复的表达式和计算 - 将它们移动到辅助单元格并尝试简化/缩短您的公式 .
b)VBA - 不使用Evaluate - 只需将500万个单元格的范围扩展到单个变量数组中,并使用VBA循环,算术和逻辑来完成与公式相同的任务,然后将数组放回原位 .
你可能想试试这个: