如何使用VBA将公式导入Excel单元格

我想实现下面的公式到Excel单元格

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

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

在这里输入图像说明

所以我写下如下简单的macros,但是无法实现公式,公式回归的值为“真”

 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 

我通过vbamacros执行公式后得到了错误的结果,如下图所示:

在这里输入图像说明

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

尝试将长公式转换为VBA时,请尝试使用Stringvariables来帮助您对其进行testing。

  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 

如果你想跳过stringvariables,你可以直接replace你的行

 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))" 

我会换个方式,没有循环,并利用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