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

Posted

技术标签:

【中文标题】使用 VBA 检测计算机使用的十进制符号【英文标题】:Using VBA to detect which decimal sign the computer is using 【发布时间】:2013-12-18 07:50:01 【问题描述】:

是否可以使用 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

【问题讨论】:

您能否发布您的最终答案,它是如何解决的。赞赏.. 你是如何添加格式条件的? 【参考方案1】:

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

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

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

【讨论】:

当我发布我的答案时,我不知道它的行为方式。这应该是公认的。 补充以上信息,如果您在 Windows 区域设置中将区域设置的分隔符更改为其他内容,Application.International() 将 continue 报告区域设置中最初定义的分隔符,而不是那个您已将其覆盖为。 @GSerg Yipes - 所以两者都错了?要做到这一点,您需要同时使用它们和 Application.DecimalSeparator 吗?在所有情况下都有效的代码片段究竟是什么? 如果您需要 系统分隔符(而不是 Excel 使用的实际小数分隔符),请添加到上述信息 - 例如对于 CDbl() 函数 - 使用 Erik A 的答案提供的方法 - 即使用 Format(0, ".")【参考方案2】:

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


请注意: 事实证明,这部分过于简单化到了错误的程度。请参考other answer(应该是公认的),了解Application.DecimalSeparatorApplication.International(xlDecimalSeparator) 的实际行为方式。

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


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

【讨论】:

Application.International(xlDecimalSeparator) 工作,而 Application.DecimalSeparator 没有。他们不应该做同样的事情吗? @WaiWong 它们通常不一样,但默认情况下它们是相同的。 International 告诉您来自区域设置的实际信息,并且是只读的。 DecimalSeparator 允许您指定任何其他字符作为分隔符并将其与UseSystemSeparators = False 一起使用。【参考方案3】:

您可以使用DecimalSeparator 属性。

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

附带说明:即使有可能,建议不要更改此设置,而是将其用于您的需求。

【讨论】:

不,这是错误的。默认设置为 UseSystemSettings = true,然后忽略 Application.DecimalSeparator。【参考方案4】:

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

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

DecimalSeparator = Format(0, ".")

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

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

【讨论】:

Format(0, ".") 是解决我问题的唯一答案。谢谢。【参考方案5】:

我的 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

【讨论】:

【参考方案6】:

您还可以将计算得出的已知数字转换为已知字符串,然后提取分隔符。在此示例中,1/2 计算为三个字符的字符串“0.5”或“0,5”。 Mid 函数从字符串中的位置 2 中提取 1 个字符。

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

【讨论】:

虽然此代码可能会回答问题,但提供有关 why 和/或 如何 此代码回答问题的附加上下文将显着改善其长期-期限价值。请edit你的答案添加一些解释。

以上是关于使用 VBA 检测计算机使用的十进制符号的主要内容,如果未能解决你的问题,请参考以下文章

excel vba移位运算

Word VBA - 在计算/选择X个“单词”或“句子”时忽略标点符号

计算机基础教程7 - 数字系统

MS Excel 2010 - 使用 Abs() 的计算在放置在其他 VBA 中时停止工作

计算机组成原理--数据格式与机器码

如何检测二进制/库中的未定义符号?