Проблема с разными языками при вставке формулы из VBA

правильно ли я понимаю, что если я использую команду типа

Set myRange.formula = “=ROW(mySheet!R12)” 

мой макрос вызовет появление ошибки #NAME? в ячейках, если он запущен, скажем, в русском Excel. Я имею в виду, что в этом случае приведенная выше формула должна быть жестко запрограммирована, например

Set myRange.formula = “=СТРОКА(mySheet!R12)”

где СТРОКА — русский аналог функции СУММ. Я бы не ожидал, что Excel будет достаточно умным, чтобы переводить формулы во время выполнения. Так есть ли какой-нибудь способ обойти это и, самое главное, каков наиболее общий код, чтобы макрос работал правильно, независимо от языка?


person Edgar Navasardyan    schedule 01.03.2016    source источник


Ответы (1)


VBA очень ориентирован на EN-US. .Formula и .FormulaR1C1 ожидать функция ROW. Чтобы использовать региональные языковые функции, такие как СТРОКА, затем свойство Range.FormulaLocal или < вместо этого следует использовать свойство href="https://msdn.microsoft.com/en-us/library/office/ff838568.aspx" rel="noreferrer">Range.FormulaR1C1Local.

То же самое относится и к символам-разделителям списков. Используйте запятую (например, ,) для разделения аргументов в функции при использовании .Formula или .FormulaR1C1 независимо от региональных настроек системы. Если ваша система использует точку с запятой (например, ;) в качестве символа-разделителя списка, его следует использовать только с .FormulaLocal или .FormulaR1C1Local.

Результат на листе будет правильно отражать языковые параметры установки Office.

myRange.Formula = "=ROW(mySheet!$12:$12)"
myRange.FormulaR1C1 = "=ROW(mySheet!R12)"
myRange.FormulaLocal  = "=СТРОКА(mySheet!$12:$12)"
myRange.FormulaR1C1Local= "=СТРОКА(mySheet!R12)"
person Community    schedule 01.03.2016
comment
Итак, правильно ли я вас понимаю, что использование .FormulaLocal сделает мой код абсолютно жизнеспособным и не зависящим от языковой системы? - person Edgar Navasardyan; 01.03.2016
comment
Тогда зачем вообще нужен метод .Formula ?)) И почему бы просто не интегрировать функционал .FormulaLocal в метод .Formula ?)) Как ни странно - person Edgar Navasardyan; 01.03.2016
comment
Да, должно. Все, что необходимо, это убедиться, что вы используете либо .FormulaLocal или .FormulaR1C1Local соответственно. Ссылка R12 в вашем образце была немного двусмысленной; Надеюсь, я правильно угадал. Кроме того, любые кавычки в формуле должны быть удвоены, поскольку они будут находиться внутри строки в кавычках. например ="abc" становится .FormulaLocal = "=""abc""". - person ; 01.03.2016
comment
Formula Local — относительно новое дополнение. Интерпретатор команд VBA пришлось переписать, чтобы он мог принимать функции, зависящие от языка. - person ; 01.03.2016
comment
Ok. Просто для подтверждения - Set myRange.FormulaLocal = = ROW(mySheet!$12:$12) будет работать на всех системах. - person Edgar Navasardyan; 01.03.2016
comment
Нет, если ваша установка Office — RU-RU или что-то еще, кроме EN-US. Однако myRange.Formula = "=ROW(mySheet!$12:$12)" будет работать в любой системе. (не используйте Set для назначения формулы) - person ; 01.03.2016
comment
Спасибо Спасибо спасибо. Я много боролся с тем, чтобы не заставить его работать с Formula. Я совершенно пропустил, что это должно быть "," вместо ";". Обычно я ищу значения в отладчике VBA, но не через тысячу лет я мог представить, что у Microsoft есть эта разница между Formula и FormulaLocal. Я знаю, что они странные, но эти странные... - person 244an; 29.11.2017