【问题标题】:Changing decimal separator in VBA (not only in Excel)在 VBA 中更改小数点分隔符(不仅在 Excel 中)
【发布时间】:2018-07-16 22:21:49
【问题描述】:

输入A1单元格=1/10

运行这个宏:

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

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

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

【问题讨论】:

  • MsgBox Range("A1").Text
  • 使用单元格的 Text 属性,而不是 Value 属性。这有帮助吗?
  • @DavidZemens 是的,确实如此。这解决了问题。

标签: vba excel


【解决方案1】:

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

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

如果MsgBox 函数被传递一个字符串字面量,这个异常并不是真正的异常:

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

在这里,我们传递的不是日期,而是一个字符串,MsgBox 将完全按照Format 函数显示:

当您修改 DecimalSeparator 或其他分隔符属性时,这与正在发生的事情是一样的。您没有更改基础值,只是 Excel 应用程序在 UI 中表示它们的方式。

您可能希望 MsgBox 函数使用您通过 Application.DecimalSeparator 分配的覆盖,但 MsgBox 函数的第一个参数只接受 String 类型,因此当您传递除一个字符串,隐式转换为字符串类型,本质上是这样的:

MsgBox(CStr(Range("A1").Value))

仍然与语言环境无关,现在您将该值转换为字符串。唯一真正的逻辑输出是使用 windows/system local 来处理该转换。

TL;DR

您可以使用单元格的Text 属性来获取单元格中实际显示的内容,而不是单元格的真实

【讨论】:

    【解决方案2】:

    我不能 100% 肯定地说,但我相信虽然 Application.DecimalSeparator 会影响单元格中显示的内容,但 MsgBox 似乎使用 Windows 区域设置默认值。

    如果您尝试在 Windows 级别更改它会发生什么?另外,您确定您的 SQL 插入没有正确解释它吗?

    如果需要,可能会尝试一个潜在的解决方法组合:

    Dim x as Integer
    Dim xs as String
    x = 1.5
    xs = replace(cstr(x),".", ",")
    SQLString = Stuff & xs & MoreStuff
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      相关资源
      最近更新 更多