首页 文章

在VBA中计算Excel公式但仅显示Excel中的值

提问于
浏览
1

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

我试过这段代码:

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

它正确计算第一个单元格,但对于其他单元格,它仍然会尝试将B3 * C3计算为固定参考,而不是随着单元格位置的变化而变化的动态参考 .

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

编辑:

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

Excel Screenshot 2

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

  • 0

    尝试

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

    或者干脆

    Range("D3:D6").Formula = Evaluate("(B3:B6)*(C3:C6)")
    
  • 0

    我认为最好的选择是保留公式而不是使用VBA来生成相同的公式 . 相反,在SpreadSheet中输入新数据时,请务必将计算设置为手动(转到 Formulas tab => Calculation Options => Manual . 这样,在输入/粘贴新值时,您不会触发计算,这意味着您的Excel文件将以同样快的速度运行好像没有公式 . 输入/粘贴所有新值后,将 Calculations 设置为 Automatic .

  • 0

    使用Evaluate计算公式,然后将值传输到Excel将比Excel直接计算公式慢 .

    您可以尝试以下几种方法:

    a)公式你在500万个单元中只有500万个公式 - 这不是一个非常大的数字,但你的公式很长,每个公式都引用了大量的单元格 . 您的公式包含许多重复的表达式和计算 - 将它们移动到辅助单元格并尝试简化/缩短您的公式 .

    b)VBA - 不使用Evaluate - 只需将500万个单元格的范围扩展到单个变量数组中,并使用VBA循环,算术和逻辑来完成与公式相同的任务,然后将数组放回原位 .

  • 0

    你可能想试试这个:

    Dim i as Integer
    
    For i = 3 to 6
        Range("D" & i).Value = Range("B" & i).Value * Range("C" & i).Value
    Next i
    

相关问题