Формула / VBA - ошибка приложения или объекта - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь создать код vba, чтобы написать формулу в определенной ячейке на моем листе, но это не работает. В чем дело ? Потому что я действительно не вижу, что я делаю неправильно в этом коде.

Range("BC" & ActiveCell.Row).Formula = "=IF($BB" & ActiveCell.Row & "=" & """" & "REVIEW" & """" & ";IF(ROW($BB" & ActiveCell.Row & ")<MAX(IF($BB:$BB=" & """" & "OK" & """" & ";$A:$A));IF(TODAY()-$AY" & ActiveCell.Row & ">=3;" & """" & "DROP" & """" & ";" & """" & "REVIEW" & """" & ");" & """" & "REVIEW" & """" & ");" & """" & """" & ")"

1 Ответ

0 голосов
/ 30 октября 2018

Использование на компьютере ; в качестве разделителя региональных списков приводит вас в замешательство. VBA ориентирован на EN-US, поэтому Range.Formula и Range.FormulaR1C1 ожидают запятую (,) в качестве разделителя списка аргументов функции.

Range("BC" & ActiveCell.Row).Formula = "=IF($BB" & ActiveCell.Row & "=" & """" & "REVIEW" & """" & ", IF(ROW($BB" & ActiveCell.Row & ")<MAX(IF($BB:$BB=" & """" & "OK" & """" & ", $A:$A)), IF(TODAY()-$AY" & ActiveCell.Row & ">=3, " & """" & "DROP" & """" & ", " & """" & "REVIEW" & """" & "), " & """" & "REVIEW" & """" & "), " & """" & """" & ")"

Альтернативно, Свойство Range.FormulaLocal или Свойство Range.FormulaR1C1Local можно использовать с собственной точкой с запятой в качестве разделителя списка.

Range("BC" & ActiveCell.Row).FormulaLocal = "=IF($BB" & ActiveCell.Row & "=" & """" & "REVIEW" & """" & ";IF(ROW($BB" & ActiveCell.Row & ")<MAX(IF($BB:$BB=" & """" & "OK" & """" & ";$A:$A));IF(TODAY()-$AY" & ActiveCell.Row & ">=3;" & """" & "DROP" & """" & ";" & """" & "REVIEW" & """" & ");" & """" & "REVIEW" & """" & ");" & """" & """" & ")"

Удвоение двойных кавычек внутри строки в кавычках является немного многословным, и запись xlR1C1 спасет некоторые шаги. TEXT(,) совпадает с "" в формуле; каждый производит одинаковую строку нулевой длины.

Range("BC" & ActiveCell.Row).Formula = "=IF($BB" & ActiveCell.Row & "=""REVIEW"", IF(ROW($BB" & ActiveCell.Row & ")<MAX(IF($BB:$BB=""OK"", $A:$A)), IF(TODAY()-$AY" & ActiveCell.Row & ">=3, ""DROP"", ""REVIEW""), ""REVIEW""), TEXT(,))"
'.FormulaR1C1
Range("BC" & ActiveCell.Row).FormulaR1C1 = "=IF(RC54=""REVIEW"", IF(ROW(R:R)<MAX(IF(C54:C54=""OK"", C1:C1)), IF(TODAY()-RC51>=3, ""DROP"", ""REVIEW""), ""REVIEW""), TEXT(,))"

Переписанные выше формулы xlA1 и xlR1C1, каждый из которых приводит к следующему, когда ActiveCell находится во второй строке.

=IF($BB2="REVIEW", IF(ROW($BB2)<MAX(IF($BB:$BB="OK", $A:$A)), IF(TODAY()-$AY2>=3, "DROP", "REVIEW"), "REVIEW"), TEXT(,))

Как я уже упоминал в комментариях выше, эта формула выглядит как формула массива. В этом случае используйте переписывание на основе запятой .Formula, но измените свойство Range.Formula на Range.FormulaArray .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...