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

#excel #vba

#vba #excel #региональные настройки

Вопрос:

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

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

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

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

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

Ответ №1:

VBA очень ориентирован на пользователя. VBA.Формула и .FormulaR1C1 ожидает функцию строки. Чтобы использовать региональные языковые функции, такие как СТРОКА, затем диапазон.Свойство FormulaLocal или диапазон.Вместо этого следует использовать свойство 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)"
 

Комментарии:

1. Итак, я правильно вас понимаю, что использование . FormulaLocal сделает мой код абсолютно жизнеспособным и не зависящим от языковой системы?

2. Тогда зачем нам нужен этот метод. Формула вообще?)) И почему они просто не интегрируют функциональность . FormulaLocal в метод. Формула?)) Достаточно странно

3. Да, так и должно быть. Все, что необходимо, это убедиться, что вы используете либо . FormulaLocal или . FormulaR1C1Local соответствующим образом. R12 Ссылка в вашем примере была немного двусмысленной; Надеюсь, я правильно догадался. Кроме того, любые кавычки в формуле необходимо удвоить, поскольку они будут находиться в строке, заключенной в кавычки. например ="abc" , становится .FormulaLocal = "=""abc""" .

4.Нет, если ваша установка Office — RU-RU или что-то еще, кроме EN-US. Тем не менее, myRange.Formula = "=ROW(mySheet!$12:$12)" будет работать в любой системе. (не использовать Set для назначения формулы)

5. Спасибо, спасибо, спасибо. Я много боролся с тем, чтобы не заставить его работать Formula . Я полностью пропустил, что это должно быть "," вместо ";" . Обычно я ищу значения в отладчике VBA, но не через тысячу лет я мог бы представить, что у Microsoft есть такая разница между Formula и FormulaLocal . Я знаю, что они странные, но это странно…