首页 > 解决方案 > Excel VBS 中 ActiveSheet.Range.Value 的简单 =IF 语句触发 1004 运行时错误

问题描述

得到以下代码,它可以作为 Excel VBScript 宏工作:

Sub replace()
    Dim ws As Worksheet

    For Each ws In ActiveWorkbook.Worksheets
        Sheets(ws.Name).Activate

        Dim I
        For I = 5 To 20
            ActiveSheet.Range("T" & I).Value = "=AVERAGE(3)"
        Next I
    Next ws
End Sub

显然=AVERAGE(3)不是为了以任何方式有用,而是为了表明上面的代码有效,而下面的代码块没有

Sub replace()
    Dim ws As Worksheet

    For Each ws In ActiveWorkbook.Worksheets
        Sheets(ws.Name).Activate

        Dim I
        For I = 5 To 20
            ActiveSheet.Range("T" & I).Value = "=IF(1=1;1;0)"
        Next I
     Next ws
End Sub

实际上应该有一个更复杂的公式,其中IFis (看起来像:=IF(Q5<>0;IF(R5+S5>Q5;"ERROR";IF(R5="";S5/Q5;IF(Q5=R5;"Coord.";S5/(Q5-R5))));"N/A").

问题是,我缩小了范围,直到我看到即使是那个微不足道=IF(1=1;1;0)的语句也因 1004 运行时错误而失败。

我认为解决这个问题并不重要,但整个宏只是为了更新每个工作表上的大约 15 个单元格,大约 31 个工作表。正如我所说,第一个块有效(通过AVERAGE()计算)但=IF不起作用。


为了完整起见,这是我想要的代码:

Sub updCells()

    Dim ws As Worksheet

    For Each ws In ActiveWorkbook.Worksheets
    Sheets(ws.Name).Activate

        Dim I
        For I = 5 To 20
        ActiveSheet.Range("T" & I).Value = "=IF(Q" & I & "<>0,IF(R" & I & "+S" & I & ">Q" & I & ",""ERROR"",IF(R" & I & "="""",S" & I & "/Q" & I & ",IF(Q" & I & "=R" & I & ",""Coord."",S" & I & "/(Q" & I & "-R" & I & ")))),""N/A"")"

        Next I

     Next ws
End Sub

标签: excelvba

解决方案


除了不需要激活工作表的注释之外,您的代码可以简化为以下代码。看看如何避免 select

这通常也适用于更复杂的公式(例如您的示例) - Excel 将计算出相对引用。

Sub replace()

Dim ws As Worksheet

For Each ws In ActiveWorkbook.Worksheets
    ws.Range("T5:T20").Formula = "=IF(1=1,1,0)"
Next ws

End Sub

推荐阅读