输入A1单元格=1/10
运行此宏:
Sub ChangeDecimalSeparator()
Application.DecimalSeparator = "#"
Application.UseSystemSeparators = False
MsgBox Range("A1").Value
End Sub
显然现在在单元格A1中,您可以看到小数分隔符已更改为新字符#。为什么VBA仍然将它视为默认的分隔符,尽管你已经改变它(我的意思是MsgBox)。
为什么需要它?我的默认分隔符是,(逗号)。我想将数据插入到使用的SQL。 (点)。
答案 0 :(得分:2)
Application.DecimalSeparator
影响单元格中显示的内容,这是一个次要但重要的区别,即单元格中显示的内容并不总是与单元格中显示的相同。单元格的.Value
属性,尤其是当我们修改值的格式或显示方式时。当使用日期值时,例如:
如您所见,无论单元格的格式如何,MsgBox
函数都使用我的(美国)语言环境来格式化日期:
该异常(实际上不是异常)是,如果MsgBox
函数传递了字符串文字:
MsgBox(Format(#6/1/2018#,"dd-mm-yyyy"))
在这里,我们没有传递 date ,而是传递了一个字符串,MsgBox
将根据Format
函数准确显示该字符串:
这与您修补DecimalSeparator
或其他分隔符属性时发生的事情相同。您没有更改基础值,仅更改了Excel Application在UI中表示它们的方式。
您可能希望MsgBox
函数使用通过Application.DecimalSeparator
分配的替代,但是MsgBox
函数的第一个参数仅接受String
类型,因此当您传递字符串以外的任何内容时,都会隐式转换为字符串类型,实际上发生的是:
MsgBox(CStr(Range("A1").Value))
值仍然与语言环境无关,现在您将该值转换为字符串。唯一真正的逻辑输出是使用Windows / System Local来处理该转换。
TL; DR
您可以使用单元格的Text
属性获取单元格中实际显示的内容,而不是单元格的真实值。
答案 1 :(得分:1)
我无法100%确定地发言,但我相信虽然Application.DecimalSeparator
会影响单元格中显示的内容,但MsgBox
似乎使用Windows区域设置默认值。
如果您尝试在Windows级别更改它会发生什么?此外,您确定您的SQL插件没有正确解释它吗?
如果需要,可能会尝试使用潜在的解决方法 kludge:
Dim x as Integer
Dim xs as String
x = 1.5
xs = replace(cstr(x),".", ",")
SQLString = Stuff & xs & MoreStuff