如何使用VBA中的格式确定千位分隔符

时间:2019-07-07 07:45:03

标签: vba

我想确定在目标计算机上运行VBA代码时使用的千位分隔符而无需解析为调用系统内置函数,例如(Separator = Application.ThousandsSeparator)。

我正在通过“格式”使用以下简单代码:

ThousandSeparator = Mid(Format(1000, "#,#"), 2, 1)

上面的方法似乎工作正常,并且想确认这是否是一种安全的方法,而无需借助系统调用。

我希望结果是一个单个字符串,形式为或。或'或适用于机器语言环境的空格。

请注意,我只想使用诸如Format或类似格式的语言语句(不进行sys调用)。这也与千位分隔符而不是十进制分隔符有关。本文Using VBA to detect which decimal sign the computer is using并没有帮助或回答我的问题。谢谢

谢谢。

2 个答案:

答案 0 :(得分:2)

使用Format来获取千位分隔符是否安全的严格答案是

例如在Windows上,最多可以在控制面板的区域设置的“千位分隔符”字段中输入三个字符。
假设您输入asd,然后单击确定。

如果您现在致电Format(1000, "#,#"),它将给您1a000。那只是千位分隔符的首字母。您无法正确检索它。

Reading the registry

? CreateObject("WScript.Shell").RegRead("HKCU\Control Panel\International\sThousand")

您将全额退还asd

说句公道话,Excel国际属性似乎也没有太大帮助。在这种情况下,Application.International(xlThousandsSeparator)将返回最初在计算机区域设置中定义的分隔符,而不是您覆盖它的值。

话虽如此,实际答案是肯定的,因为它会出现(并且如果您确实知道,请发布答案here),不存在带有多字符分隔符的文化(即使是在存在1億2345万6789 or 1億2345萬6789之类的恐怖事物的中国,它们恰好用just one UTF-16 character代表),您可能很乐意忽略那些决定以这种方式使用其区域设置的人。

答案 1 :(得分:0)

我认为您首先需要考虑您正在谈论的是“千分之一”。 在Win 10中,以下代码将为您提供两个不同的千位分隔符,除非您在区域设置中更改了千位分隔符

Sub TestIt()
    Application.ThousandsSeparator = "@"
    Application.UseSystemSeparators = False
    ThousandSeparator = Mid(Format(1000, "#,#"), 2, 1)
    Debug.Print ThousandSeparator
    Debug.Print Application.ThousandsSeparator
End Sub

更新:基于@GSerg的评论,以下功能应始终为您提供区域设置中的ThousandsSeparator

Function ThousandsSeparator() As String

    Dim appUse As Boolean

    appUse = Application.UseSystemSeparators
    Application.UseSystemSeparators = True
    ThousandsSeparator = Application.International(xlThousandsSeparator)
    Application.UseSystemSeparators = appUse

End Function