Использование VBA для определения того, какой знак десятичного знака используется компьютером
Можно ли использовать VBA для определения того, какой десятичный знак используется на компьютере?
У меня есть макрос script, который добавляет условное форматирование в лист excel. Проблема в том, что целевые компьютеры могут использовать как десятичные знаки. Поэтому я хочу сделать работу script для всех компьютеров
Код выглядит так:
With range("D" & row)
.FormatConditions.Delete
.FormatConditions.Add Type:=xlCellValue, Operator:=xlNotBetween, Formula1:="=1,01*$C$" & row, Formula2:="=0,99*$C$" & row
.FormatConditions(1).Font.ColorIndex = 3
End With
Ответы
Ответ 1
Я фактически не знал, что Formula
в FormatConditions
принимает локализованные формулы. В других местах у вас есть выбор между Formula
и FormulaLocal
.
Пожалуйста, обратите внимание:
Эта часть оказалась упрощенной до такой степени, что ошибалась. Пожалуйста, обратитесь к другому ответу (который должен был быть принят), чтобы узнать, как на самом деле ведут себя Application.DecimalSeparator
и Application.International(xlDecimalSeparator)
.
Чтобы просто ответить на вопрос, вы можете использовать Application.International(xlDecimalSeparator)
или просто Application.DecimalSeparator
чтобы узнать разделитель.
Но для нетривиальных формул может быть проще назначить инвариантную формулу на основе английской локали свойству Formula
скрытой ячейки, а затем прочитать FormulaLocal
из этой ячейки и использовать ее для FormatConditions
. Excel сделает все преобразования для вас.
Ответ 2
Что касается вышеприведенного ответа, важно знать, что Application.DecimalSeparator
и Application.International(xlDecimalSeparator)
ведут себя не так:
-
Application.DecimalSeparator
будет ВСЕГДА выводить десятичный разделитель, выбранный в параметрах Excel, даже если Excel будет использовать системные разделители (из региональных настроек Windows).
-
Application.International(xlDecimalSeparator)
выведет любой фактический разделитель десятичных чисел, используемый в Excel, независимо от того, исходит ли он из настроек Windows (когда Application.UseSystemSeparators = True
) или из параметров Excel (когда Application.UseSystemSeparators = False
)
Поэтому я настоятельно рекомендую всегда использовать Application.International(xlDecimalSeparator)
.
Ответ 3
Вы можете использовать свойство DecimalSeparator.
Application.DecimalSeparator
затем возвращает десятичный разделитель, определяемый локалью, в которой выполняется excel с.
На стороне примечания: Желательно, хотя это возможно, не изменять это и вместо этого использовать его для ваших нужд.
Ответ 4
Для приложений, отличных от Excel, решение в принятом ответе недоступно.
Вместо этого вы можете использовать Format
для получения десятичного разделителя: неэкранированная точка в Format
заменяется текущим десятичным разделителем.
DecimalSeparator = Format(0, ".")
Вы также можете найти десятичный разделитель из реестра
DecimalSeparator = CreateObject("WScript.Shell").RegRead("HKCU\Control Panel\International\sDecimal")
Ответ 5
Public Function DecimalSeparator() As String
DecimalSeparator = Mid$(1 / 2, 2, 1)
End Function