Excel VBS中ActiveSheet.Range.Value的简单= IF语句触发1004运行时错误

时间:2019-01-09 10:36:48

标签: excel vba ms-error-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)并不意味着以任何方式有用,而是表明该代码在上有效,而以下代码段无效:< / p>

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

实际上,应该有一种更复杂的公式,其中IF所在(看起来像:=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

1 个答案:

答案 0 :(得分:0)

您的代码可以简化为以下内容,除了注释之外,您无需激活工作表。参见how to avoid 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