#vba #formula
Вопрос:
правильно ли я понимаю, что если я использую команду типа
Set myRange.formula = “=ROW(mySheet!R12)”
мой макрос вызовет #NAME?
появление ошибки в ячейках, если он будет запущен, скажем, в русском Excel.
Я имею в виду, что в этом случае приведенная выше формула должна быть жестко закодирована, как
Set myRange.formula = “=СТРОКА(mySheet!R12)”
где СТРОКА-российский аналог функции СУММЫ. Я бы не ожидал, что Excel будет достаточно умен, чтобы переводить формулы во время выполнения.
Итак, есть ли какой-либо способ обойти это и, самое главное, каков наиболее общий код для правильной работы макроса независимо от языка ?
Ответ №1:
VBA очень ориентирован на США. VBA .Формула И.FormulaR1C1 ожидайте функцию СТРОКИ. Для использования функции регионального языка «вкусы» , такие как СТРОКА, затем диапазон.Формульно-локальное свойство или диапазон.Вместо этого следует использовать свойство FormulaR1C1Local.
То же самое справедливо и для символов-разделителей списков. Используйте запятую (например ,
) для разделения аргументов в функции при использовании .Формула или .FormulaR1C1 независимо от региональных настроек системы. Если ваша система использует точку с запятой (например ;
) в качестве символа разделителя списка, его следует использовать только с .FormulaLocal или .FormulaR1C1Local.
Результат на листе будет правильно отражать языковые настройки установки Office.
myRange.Formula = "=ROW(mySheet!$12:$12)"
myRange.FormulaR1C1 = "=ROW(mySheet!R12)"
myRange.FormulaLocal = "=СТРОКА(mySheet!$12:$12)"
myRange.FormulaR1C1Local= "=СТРОКА(mySheet!R12)"
Комментарии:
1. Итак, правильно ли я вас понимаю, что с помощью . FormulaLocal сделает мой код абсолютно жизнеспособным и не зависящим от языковой системы ?
2. Тогда зачем нам нужен этот метод? Какая бы то ни было формула ?)) И почему бы им просто не интегрировать функциональность . Формуло-локально в методе . Формула ?)) Достаточно странно
3. Да, так и должно быть. Все, что необходимо, — это убедиться, что вы используете либо то, либо другое . Формульно -локальное или . formular1c1локально соответствующим образом.
R12
Ссылка в вашем образце была немного двусмысленной; надеюсь, я правильно угадал. Кроме того, любые кавычки в формуле должны быть удвоены, поскольку они будут находиться в строке в кавычках. например="abc"
, становится.FormulaLocal = "=""abc"""
.4.Нет, если ваша офисная установка RU-RU или что-то другое, кроме EN-US. Однако
myRange.Formula = "=ROW(mySheet!$12:$12)"
будет работать на любой системе. (не используйтеSet
для назначения формулы)5. Спасибо, спасибо, спасибо. Я много боролся с тем, чтобы не заставить его работать
Formula
. Я совершенно упустил из виду, что это должно быть","
вместо";"
. Обычно я ищу значения в отладчике VBA, но даже за тысячу лет я не мог себе представить, что у Microsoft есть такая разница междуFormula
иFormulaLocal
. Я знаю, что они странные, но это странно…