是否可以使用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
答案 0 :(得分:13)
关于上述答案,重要的是要知道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)
。
答案 1 :(得分:11)
我实际上并不知道Formula
中的FormatConditions
接受本地化公式。在其他地方,您可以选择Formula
和FormulaLocal
。
要简单回答问题,您可以使用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