【问题标题】:How to Implement Formula into Excel cells using VBA如何使用 VBA 在 Excel 单元格中实现公式
【发布时间】:2016-10-26 05:01:13
【问题描述】:

我想在 Excel 单元格中实现以下公式

IF(OR(D12>0,C13=""),"",MAX(SUM($C$12:C13)-$D$9,0))

(一旦应用公式,我应该得到以下结果(公式手动实现):

所以我写了如下简单的宏,但无法实现公式,公式将值返回为“真”

Sub adjustoldbills()

lastRow_sht4 = Sheet4.Range("A" & Rows.Count).End(xlUp).Row
Sheet4.Cells(12, 11) = ""

For i = 1 To lastRow_sht4 - 10
    If Sheet4.Cells(11 + i, 1) <> "" Then
        '=MAX(SUM($C$12:C15)-$D$9,0)
        Sheet4.Cells(12, 4).Formula = "=MAX(SUM($C$12:C" & 12 & ")-$D$9,0)"
        Sheet4.Cells(11 + i, 4).Formula = "=(if(or(D" & 11 + i > 0 & ",C" & 12 + i & "=" & Chr(34) & Chr(34) & ")," & Chr(34) & Chr(34) & "," & "MAX(SUM($C$12:C" & 12 & i & ")-$D$9,0)"
    End If
Next i

End Sub

通过 vba 宏实现公式后,我得到了错误的结果,如下图所示:

如何实现公式并按预期获取值。

【问题讨论】:

  • 你在下面测试过我的答案了吗?

标签: vba excel excel-formula


【解决方案1】:

在尝试将长公式转换为 VBA 时,请尝试使用 String 变量来帮助您进行测试。

 Dim FormulaStr              As String

 FormulaStr = "=IF(OR(D" & 11 + i & ">0,C" & 12 + i & "=" & Chr(34) & Chr(34) & ")," & _
      Chr(34) & Chr(34) & ",MAX(SUM($C$12:C" & 12 + i & ")-$D$9,0))"
 Debug.Print FormulaStr

然后,在即时窗口中,您将获得:

=IF(OR(D12>0,C13=""),"",MAX(SUM($C$12:C13)-$D$9,0))

这是您要转换为 VBA 的公式。

现在您需要做的就是添加以下行:

 Sheet4.Cells(11 + i, 4).Formula = FormulaStr

如果你想跳过字符串变量,你可以替换你的行

Sheet4.Cells(11 + i, 4).Formula = "=(if(or(D" & 11 + i > 0 & ",C" & 12 + i & "=" & Chr(34) & Chr(34) & ")," & Chr(34) & Chr(34) & "," & "MAX(SUM($C$12:C" & 12 & i & ")-$D$9,0)"

到:

Sheet4.Cells(11 + i, 4).Formula = "=IF(OR(D" & 11 + i & ">0,C" & 12 + i & "=" & Chr(34) & Chr(34) & ")," & Chr(34) & Chr(34) & ",MAX(SUM($C$12:C" & 12 + i & ")-$D$9,0))"

【讨论】:

  • 就像@user3598756 写的那样,“勇敢的反对者能否解释一下原因”?
【解决方案2】:

我会走另一条路,没有循环并利用Range对象的SpecialCells()方法

Option Explicit

Sub adjustoldbills()

    With Sheet4
        .Range("D12").FormulaR1C1 = "=MAX(RC[-1]-R9C4,0)" 
        With .Range("A13", .Cells(.Rows.Count, 1).End(xlUp)).SpecialCells(xlCellTypeConstants)
            With .Offset(, 2).SpecialCells(xlCellTypeConstants)
                .Offset(, 1).FormulaR1C1 = "=IF(R[-1]C>0,"""",MAX(SUM(R12C[-1]:RC[-1])-R9C4,0))"
                With .Areas(.Areas.Count)
                    .Offset(, 1).Cells(.Rows.Count).Offset(1).FormulaR1C1 = "=IF(R[-1]C>0,"""",MAX(SUM(R12C[-1]:RC[-1])-R9C4,0))"
                End With
            End With
        End With
    End With
End Sub

【讨论】:

  • 非常感谢,我现在得到了正确的结果再次感谢
  • 不客气。然后请通过单击答案旁边的复选标记将答案从灰色切换为已填写,将答案标记为已接受。谢谢
  • 勇敢的否决者能否解释一下他为什么不喜欢这个答案并就如何改进它提出建议?如果他错了,或者删除反对票。谢谢他
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多