在VBA中计算Excel公式,但只在Excel中显示值
这是我的第一篇文章,我无法在任何地方find确切的答案。 我有一个Excel电子表格变得太大,无法操作,因为我在数百万个单元格中有很长的公式。 我需要知道如何使用VBA计算公式,但只有Excel中出现该值。 一个例子是我想乘列C列C:
我试过这个代码:
Range("D3:D6").Formula = Evaluate("=B3*C3")
它正确计算第一个单元格,但是对于其他单元格,它仍然尝试将B3 * C3计算为固定引用,而不是作为单元格位置更改时更改的dynamic引用。
我怎么能解决这个问题? 谢谢。
编辑:
我的实际电子表格如下所示:
此公式需要应用17520行和300列,但我只希望在Excel中出现的值。 这样做的目的是减less文件大小并减less计算时间。
=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))))))
尝试
Range("D3:D6").Formula = "=B3*C3" Range("D3:D6").Value = Range("D3:D6").Value
或干脆
Range("D3:D6").Formula = Evaluate("(B3:B6)*(C3:C6)")
我相信最好的select是保持公式,而不是使用VBA生成相同的公式。 相反,在SpreadSheet中input新数据时,请确保将计算设置为手动(转到Formulas
选项卡=> Calculation Options
=> Manual
。这样,在input/粘贴新值时不会触发计算,这意味着您的Excel文件将以就像没有公式一样。input/粘贴所有新值后,将“ Calculations
设置为“ Automatic
。
使用评估来计算公式,然后将值传递到Excel将比直接Excel计算公式更慢。
这里有几个你可以尝试的东西:
a)公式在500万个细胞中只有5百万个公式 – 这不是一个绝对大的数字,但是你的公式很长,每个公式都引用了大量的细胞。 您的公式包含许多重复的expression式和计算 – 将它们移出到辅助单元格,并尝试简化/缩短公式。
b)VBA – 不要使用Evaluate – 只需将500万个单元格的范围变成一个单独的variables数组,然后使用VBA循环,算术和逻辑完成与您的公式相同的任务,然后将数组放回原处。
你可能想试试这个:
Dim i as Integer For i = 3 to 6 Range("D" & i).Value = Range("B" & i).Value * Range("C" & i).Value Next i