我想确定在目标计算机上运行VBA代码时使用的千位分隔符而无需解析为调用系统内置函数,例如(Separator = Application.ThousandsSeparator)。
我正在通过“格式”使用以下简单代码:
ThousandSeparator = Mid(Format(1000, "#,#"), 2, 1)
上面的方法似乎工作正常,并且想确认这是否是一种安全的方法,而无需借助系统调用。
我希望结果是一个单个字符串,形式为或。或'或适用于机器语言环境的空格。
请注意,我只想使用诸如Format或类似格式的语言语句(不进行sys调用)。这也与千位分隔符而不是十进制分隔符有关。本文Using VBA to detect which decimal sign the computer is using并没有帮助或回答我的问题。谢谢
谢谢。
答案 0 :(得分:2)
使用Format
来获取千位分隔符是否安全的严格答案是否。
例如在Windows上,最多可以在控制面板的区域设置的“千位分隔符”字段中输入三个字符。
假设您输入asd
,然后单击确定。
如果您现在致电Format(1000, "#,#")
,它将给您1a000
。那只是千位分隔符的首字母。您无法正确检索它。
? 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