在VBA中计算Excel公式,但只在Excel中显示值

这是我的第一篇文章,我无法在任何地方find确切的答案。 我有一个Excel电子表格变得太大,无法操作,因为我在数百万个单元格中有很长的公式。 我需要知道如何使用VBA计算公式,但只有Excel中出现该值。 一个例子是我想乘列C列C:

我试过这个代码:

Range("D3:D6").Formula = Evaluate("=B3*C3") 

它正确计算第一个单元格,但是对于其他单元格,它仍然尝试将B3 * C3计算为固定引用,而不是作为单元格位置更改时更改的dynamic引用。

我怎么能解决这个问题? 谢谢。

编辑:

我的实际电子表格如下所示:

Excel截图2

此公式需要应用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