Использование 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