Простой = оператор IF для ActiveSheet.Range.Value в Excel VBS запускает 1004 Ошибка времени выполнения - PullRequest
0 голосов
/ 09 января 2019

Получил следующий код, который работает как макрос VBScript Excel:

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

На самом деле должна быть более сложная формула, где 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 голосов
/ 09 января 2019

Ваш код может быть сокращен до следующего, так как в дополнение к комментариям вам не нужно активировать листы. См. как избежать выбора .

Это также обычно работает для более сложных формул (например, вашего примера) - 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
...