使用 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.DecimalSeparator
和Application.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
中的Formula
s 接受本地化公式。在其他地方,您可以在Formula
和FormulaLocal
之间进行选择。
请注意: 事实证明,这部分过于简单化到了错误的程度。请参考other answer(应该是公认的),了解
Application.DecimalSeparator
和Application.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 检测计算机使用的十进制符号的主要内容,如果未能解决你的问题,请参考以下文章
Word VBA - 在计算/选择X个“单词”或“句子”时忽略标点符号