使用VBA检测计算机正在使用的十进制符号

时间:2013-12-18 07:50:02

标签: excel vba excel-vba

是否可以使用VBA检测计算机上使用的十进制符号?

我有一个宏脚本,可以为Excel工作表添加条件格式。问题是目标计算机可能使用两个小数符号。所以我想让脚本适用于所有计算机

代码看起来像这样

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

6 个答案:

答案 0 :(得分:13)

关于上述答案,重要的是要知道Application.DecimalSeparatorApplication.International(xlDecimalSeparator)的行为方式不同:

  • Application.DecimalSeparator将始终输出Excel选项中选择的小数分隔符,即使告诉Excel使用系统分隔符(来自Windows区域设置)
  • Application.International(xlDecimalSeparator)将输出Excel使用的实际小数分隔符,无论它来自Windows设置(Application.UseSystemSeparators = True时)还是Excel选项(Application.UseSystemSeparators = False时)

因此,我强烈建议您始终使用Application.International(xlDecimalSeparator)

答案 1 :(得分:11)

我实际上并不知道Formula中的FormatConditions接受本地化公式。在其他地方,您可以选择FormulaFormulaLocal

要简单回答问题,您可以使用Application.International(xlDecimalSeparator)或仅Application.DecimalSeparator来了解分隔符。

但是对于非平凡的公式,可能更容易将基于英语语言环境的不变公式分配给隐藏单元格的Formula属性,然后从该单元格中读取FormulaLocal并将其用于{ {1}}。 Excel将为您完成所有转换。

答案 2 :(得分:9)

您可以使用DecimalSeparator属性。

Application.DecimalSeparator然后返回由运行excel的语言环境定义的小数分隔符。

旁注:尽管可能,但建议不要改变这一点,而是将其用于满足您的需求。

答案 3 :(得分:1)

对于Excel以外的应用程序,接受的答案中的解决方案不可用。

相反,您可以使用Format来检索小数点分隔符:Format中未转义的点将被当前的小数点分隔符代替。

DecimalSeparator = Format(0, ".")

您还可以从注册表中查找小数点分隔符

DecimalSeparator = CreateObject("WScript.Shell").RegRead("HKCU\Control Panel\International\sDecimal")

答案 4 :(得分:0)

我在这里的2美分混合了这里的Excel答案和Erik A.出色的注册表技巧;但是我想在这个游戏中加入Word,因为我经常使用Word / Outlook来实现很多自动化:

Function CorrectDecimalSeparator() As String
Dim auxCorrectListSeparator As String
    If WordIsOpen Then
        CorrectDecimalSeparator= Word.Application.International(wdListSeparator)
    ElseIf ExcelIsOpen Then
        CorrectDecimalSeparator= Excel.Application.International(xlListSeparator)
    Else
        auxCorrectListSeparator = CreateObject("WScript.Shell").RegRead("HKCU\Control Panel\International\sDecimal")
    End If
End Function
Function WordIsOpen() As Boolean
    Dim oWord As Object
    On Error Resume Next
    Set oWord = GetObject(, "Word.Application")
    On Error GoTo 0
    WordIsOpen = Not oWord Is Nothing
    Set oWord = Nothing
End Function
Function ExcelIsOpen() As Boolean
    Dim oExcel As Object
    On Error Resume Next
    Set oExcel = GetObject(, "Excel.Application")
    On Error GoTo 0
    ExcelIsOpen = Not oExcel Is Nothing
    Set oExcel = Nothing
End Function

答案 5 :(得分:-1)

Public Function DecimalSeparator() As String
    DecimalSeparator = Mid$(1 / 2, 2, 1)
End Function