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

#excel #vba #excel-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 . Я знаю, что они странные, но это странно…