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