在VBA中更改小数点分隔符(不仅在Excel中)

时间:2015-03-18 20:14:25

标签: excel vba excel-vba

输入A1单元格=1/10

运行此宏:

Sub ChangeDecimalSeparator()
    Application.DecimalSeparator = "#"
    Application.UseSystemSeparators = False
    MsgBox Range("A1").Value
End Sub

显然现在在单元格A1中,您可以看到小数分隔符已更改为新字符#。为什么VBA仍然将它视为默认的分隔符,尽管你已经改变它(我的意思是MsgBox)。

为什么需要它?我的默认分隔符是,(逗号)。我想将数据插入到使用的SQL。 (点)。

2 个答案:

答案 0 :(得分:2)

Application.DecimalSeparator影响单元格中显示的内容,这是一个次要但重要的区别,即单元格中显示的内容并不总是与单元格中显示的相同。单元格的.Value属性,尤其是当我们修改值的格式或显示方式时。当使用日期值时,例如:

enter image description here

如您所见,无论单元格的格式如何,MsgBox函数都使用我的(美国)语言环境来格式化日期:

该异常(实际上不是异常)是,如果MsgBox函数传递了字符串文字:

MsgBox(Format(#6/1/2018#,"dd-mm-yyyy"))

在这里,我们没有传递 date ,而是传递了一个字符串,MsgBox将根据Format函数准确显示该字符串:

enter image description here

这与您修补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