将IF条件应用于范围Excel VBA

我已经写了这个代码,但它似乎并没有工作,为什么?

Dim oRo As String Dim nRo As String Lastro = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row oRo = "J2:O" & Lastro nRo = "Q2:V" & Lastro Range("C2:G" & Lastro).Select With Range("C2:G" & Lastro) .Range("C2:G" & Lastro).Formula = "=IF(oRo*nRo<0,ROUNDUP(oRo*1.3,-2),IF(ABS(oRo) <=ABS(nRo),nRo,ROUNDUP(oRo*1.3,-2)))" End With End Sub 

维护性的最佳方法是在从VBA向Excel中写入公式时使用R1C1表示法。 我仍然无法阅读R1C1,但我专门用它来写VBA的公式。 就是这样:

假设你想在G2中使用这个公式

 =IF(J2*Q2<0,ROUNDUP(J2*1.3,-2),IF(ABS(J2)<=ABS(Q2),Q2,ROUNDUP(J2*1.3,-2))) 

所以在G2中input,selectG2,然后打开立即窗口(在VBE中按Ctrl + G)。 在IW中,键入

 ?activecell.FormulaR1C1 

这将给你所有你需要的。 您不必能够阅读它,您只需确保在单元格G2中键入了正确的公式(以A1表示法)。 现在你可以拥有超级简单的代码

 Dim lRow As Long Dim sh As Worksheet Set sh = ActiveSheet lRow = sh.Cells(sh.Rows.Count, 2).End(xlUp).Row - 1 sh.Range("G2").Resize(lRow, 1).FormulaR1C1 = "=IF(RC[3]*RC[10]<0,ROUNDUP(RC[3]*1.3,-2),IF(ABS(RC[3])<=ABS(RC[10]),RC[10],ROUNDUP(RC[3]*1.3,-2)))" 

我所做的只是复制即时窗口中的R1C1公式,并将其粘贴到代码中。

 .Range("C2:G" & Lastro).Formula = "=IF(" & oRo & "*" & nRo & "<0,ROUNDUP(" & oRo & "*1.3,-2),IF(ABS(" & oRo & ") <=ABS(" & nRo & ")," & nRo & ",ROUNDUP(" & oRo & "*1.3,-2)))" 

你正在编码短语“oRo”和“nRo”

当你到这行写公式时,你不会写出oRo和nRo的值,所以excel是在名称pipe理器中定义的。

 .Range("C2:G" & Lastro).Formula = "=IF(oRo*nRo<0,ROUNDUP(oRo*1.3,-2),IF(ABS(oRo) <=ABS(nRo),nRo,ROUNDUP(oRo*1.3,-2)))" 

如果要写出oRo和nRo的计算值,则必须稍微更改代码:

 Dim oRo As String Dim nRo As String Lastro = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row oRo = "J2:O" & Lastro nRo = "Q2:V" & Lastro Range("C2:G" & Lastro).Formula = _ "=IF(" & oRo & "*" & nRo & "<0,ROUNDUP(" & oRo & _ "*1.3,-2),IF(ABS(" & oRo & ") <=ABS(" & nRo & _ ")," & nRo & ",ROUNDUP(" & oRo & "*1.3,-2)))" End Sub 

注意不要select ,因为你只处理一个范围,也不需要。 我也build议你添加Option Explicit到你的过程的顶部,以确保所有的variables被声明和拼写正确。