Автоматическая настройка «R C» в формуле Engli sh на основе языка установки пользователя - PullRequest
0 голосов
/ 06 марта 2020

Так что я неожиданно получал сообщения об ошибках от многих пользователей для нового инструмента, который я сделал. У всех этих пользователей установлена ​​немецкая версия Excel. После быстрого взгляда я понял проблему:

Я использовал эту формулу в качестве именованной функции, чтобы получить цвет смежной ячейки (не спрашивайте меня, почему это важно, но все зависит от результата) :

=GET.CELL(63;OFFSET(INDIRECT("RC";FALSE);0;1))

Теперь в немецкой версии «R C» остается, но для формулы не нужно выдавать ошибку ссылки. Он написан так, чтобы сделать ссылку на ячейку, в которой находится функция.

Можно ли переписать эту формулу так, чтобы она не "жестко кодировала" "R C", чтобы она могла изменить в зависимости от локализации пользователя (китайский и чешский тоже будут актуальны)? Или можно заменить именованную формулу небольшим количеством кода VBA, который может проверять языковую версию пользователя? Или у вас есть другая идея?

Если я не смогу отрегулировать этот бит инструмента, мне придется go с менее привлекательным обходным путем (иметь несколько проверок Y / N вместо назначения цветов) .

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 06 марта 2020

Ну, это может на самом деле не ответить на мой вопрос, но это решит мою проблему. Оказывается, что ввод

=GET.CELL(63;Sheet!B1)

в менеджере имен при выборе A1 дает точно такой же результат, как и

=GET.CELL(63;OFFSET(INDIRECT("RC";FALSE);0;1))

При том, что он получает номер цвета ячейки от ячейки до верно, где бы вы ни вставили эту функцию.

0 голосов
/ 07 марта 2020

Это легко решить с помощью UDF

Вариант 1: передать ячейку, цвет которой вы хотите, в качестве параметра (эта ячейка может быть где угодно, не ограничиваясь следующей ячейкой справа)

Function GetColor(r As Range) As Variant
    Application.Volatile
    GetColor = r.Interior.ColorIndex
End Function

Вариант 2: получить цвет следующей ячейки справа от ячейки, содержащей формулу

Function GetColorNextCell() As Variant
    Application.Volatile
    GetColorNextCell = Application.ThisCell.Offset(, 1).Interior.ColorIndex
End Function

При этом использование формата в качестве данных является плохим идея. Обе эти формулы (и ваша версия именованного диапазона) не будут обновляться, если вы просто измените цвет ячейки. Все они требовали от вас принудительного обновления c для обновления (изменение формата не вызывает восстановление c).

Я сделал их Volitile, чтобы они хотя бы обновлялись на все восстанавливает, но даже тогда они не будут обновляться, если вы просто измените цвет.

Вы представляете что-то с этим цветом. Я бы посоветовал вам изменить это, чтобы использовать значение c в ячейке для представления того, что есть. Вы всегда можете использовать условное форматирование, чтобы также покрасить ячейку на основе этого значения.

0 голосов
/ 06 марта 2020

Затем вы можете найти LCID пользователя, используя код vba, такой как

dim lcode as long
lcode = Application.LanguageSettings.LanguageID(msoLanguageIDUI)

Затем вы можете использовать простой if then else и подключить LCID к соответствующим строкам, используя ( this ). Пример:

If lcode = "0407" Then
Cells(5, 5).Formula = "=GET.CELL(63;OFFSET(INDIRECT(""ZS"";FALSE);0;1))"
ElseIf lcode = "1033" Then
Cells(5, 5).Formula = "=GET.CELL(63;OFFSET(INDIRECT(""RC"";FALSE);0;1))"
End If

В качестве альтернативы, вы также можете определить строку i и на основе LCID вы можете присвоить i соответствующее значение на основе результата и использовать:

Cells(5, 5).Formula = "=GET.CELL(63;OFFSET(INDIRECT(" & i & ";FALSE);0;1))"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...