1

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

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
4

3 回答 3

6

可维护性的最佳选择是在将公式从 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 中输入,选择 G2,然后打开即时窗口(在 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 公式并将其粘贴到代码中。

于 2013-10-21T18:59:47.307 回答
0
.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”进行硬编码

于 2013-10-21T18:28:20.993 回答
0

当您到达这一行来编写公式时,您并没有写出 oRo 和 nRo 的值,因此 excel 期望它们在名称管理器中定义。

.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

注意 noselect是必需的,因为您只处理一个范围,所以 nowith也是必需的。我还建议您添加Option Explicit到程序的顶部,以确保所有变量都被正确声明和拼写。

于 2013-10-21T18:34:06.193 回答