【问题标题】:I cannot make excel vba to use application separator in windows 10 while I can in windows 7我不能让 excel vba 在 Windows 10 中使用应用程序分隔符,而我可以在 Windows 7 中使用
【发布时间】:2017-05-03 03:55:38
【问题描述】:

我一直在寻找两天来解决我的问题,但到目前为止一无所获。

在我工作的地方开发了许多(非常多)vba excel 工具,我们在 PC-s 中的区域设置将逗号确定为小数分隔符,但从我们的系统下载的报告和数据以点作为小数分隔符。在这些工具中,我们只需要在需要时设置 UseSystemSeparators = False 然后设置 DecimalSeparators = "." 并在宏的末尾恢复。

现在新人已经获得了 Windows 10 电脑,并且一些工具遇到了错误。我从 IT 部门获得了一台 Win10 电脑进行测试,发现无论我如何在 Excel 设置中设置 VBA 宏都使用 PC 区域设置,而在工作表上它仍然使用 Excel 设置中确定的内容。相同的文件,在我的 win7 电脑中进行相同的测试,如果设置,则工作表和 vba 宏都使用本地应用程序设置。

有谁知道是什么原因以及如何解决?我可以想出很多变通办法,但所有这些都意味着这些工具需要重新编码,而且这些工具太多了,我仍然在不断地寻找新工具的使用以及在我 3 月份加入公司之前开发的工具。更改所有 ~300 PC-s 区域设置不是一个选项,因为它通常需要以逗号作为小数分隔符。

编辑:为了更清楚,我将添加一些代码:

Sub test()
    Application.UseSystemSeparators = False
    Application.DecimalSeparator = "."
    variable = "10.1"
    MsgBox CDbl(variable)
End Sub

在 Windows 7 下 - 没问题。可以转换包含字符串的变量。 在 Windows 10 - 运行时错误下,类型不匹配。两台电脑都有“,”作为系统分隔符。有趣的是,当我将“10.1”更改为“10,1”时,这对两台 PC 都有效。两台 PC 的设置相同。系统使用“,”作为分隔符,Excel设置使用“.”。

【问题讨论】:

  • @codegenerator 这个数据是否已经生成为非 Excel 文件,然后被导入 Excel?如果是这样,您如何将数据导入 Excel?使用 VBA,更好的方法是使用 Workbook.OpenText 方法,该方法允许您指定导入数据中存在的千位和小数分隔符。在我看来,这将是一种更防弹的方法,尤其是在未来。
  • @codegenerator 您对 cdbl 的测试并未显示 Excel 未使用系统分隔符。将值写入工作表单元格,看看会发生什么。 VBA 不是 Excel
  • @codegenerator 还有,您可能需要更改千位分隔符
  • #codegenerator 我不相信您可以更改 VBA 中的小数点分隔符。我不知道为什么它在 2007 年有效。可能是您的代码或数据中的某些内容您没有与我们共享。据我所知,也许 a 一直只使用点作为小数分隔符
  • @codegenerator 我无法在 W10 / Excel 2016 中重现您的问题,当时我将系统分隔符设置为小数点的逗号和千位(数字)的空格。我复制/粘贴了您的代码和 MsgBox 显示 10,1 您的环境一定有些不同。 (如果我使用点作为数字分隔符,那么10.1 会被解释为101;这就是我将其设为non-dot 的原因)。当事情不起作用时,您的系统区域小数和数字分隔符是什么?

标签: vba excel


【解决方案1】:

此答案基于您的系统(默认)DecimalSeparator 为逗号 (,) 和 ThousandsSeparator 为点 (.) - 使用 Windows 10

说明:

我做了一点测试,发现以下函数只在Excel中改变DecimalSeparator,而不是在VBA中:

Application.UseSystemSeparators = False
Application.DecimalSeparator = "."
Application.ThousandsSeparator = ","

这意味着当您使用这些代码行更改DecimalSeparator 时,它只会更新工作簿中的值,以便以您指定的格式显示。例如,如果您的系统格式是:

100.000.000,99

然后上面的代码行会将值转换为:

100,000,000.99

但是,当您运行上面的代码并尝试对DecimalSeparator 使用使用非系统格式的字符串时,VBA 将无法识别它。

示例:

(在Application.DecimalSeparator = ","Application.UseSystemSeparators = True

Sub TestSeparator()

Application.UseSystemSeparators = False
Application.DecimalSeparator = "."
Application.ThousandsSeparator = ","

Debug.Print CDbl("100.99")

End Sub

此代码将返回10099,而不是100,99 的预期双精度(以您的系统格式),因为VBA 看不到“。”的DecimalSeparator。作为DecimalSeparator

解决方案:

在 VBA 中引用双精度时,您需要始终使用计算机的系统分隔符来表示千位和小数。如果将双打作为字符串导入,则需要使用 Replace 将字符串转换为使用系统分隔符的格式。

解决方案示例:

(Application.DecimalSeparator = ","Application.UseSystemSeparators = True)

如果您在单元格A1 中有"100,000,000.99" 的字符串并使用以下代码:

CDbl(Range("A1").Value)

它将产生“类型不匹配”错误。但是,如果您将其转换为使用系统分隔符的字符串,则不会出现错误。您将需要使用两个Replace 函数,一个用于删除ThousandsSeparators,另一个用于将DecimalSeparators 转换为您的系统:

CDbl(Replace(Replace(Range("A1").Value, ",", ""), ".", ",")

【讨论】:

  • 感谢您的解释。但问题是......在windows 7pc中一切正常。我设置 Application.UseSystemSeparators = False, Application.DecimalSeparator = "."我可以将带有 CDbl 的字符串“10.1”转换为双精度。当我在 Windows 10 电脑中执行相同操作时,我收到类型错误。
  • 解决方案不应该改变,您只需要对字符串应用Replace 函数,这将阻止错误在 Windows 10 上发生并且不会影响 Windows 7 PC,因为它们使用Replace 函数仍可正常运行
  • 正如我所说,有这么多不同的工具,我真的希望避免在接下来的三个月里重新编程它们。正如我在原始帖子中所说,我可以找出许多解决方法。我想知道的是如何让Excel像在windows 7下一样工作,或者确定它是否真的不可能,然后我可以让大家知道我工作清单中的所有项目都将推迟三个月。
  • 我觉得应该更加强调CDbl 从来都不是为了尊重Application.DecimalSeparator。在没有 OP 注意到的情况下,它要么从未做过并且产生了轻微/不那么轻微的值,或者发生了something really strange,但重点是,CDbl 仅在设计上尊重系统分隔符,并且任何假设不同的代码必须是改变了。
【解决方案2】:

也许是这样的:

Set ws = ThisWorkbook.Worksheets("Name of Worksheet")
ws.Cells.Replace What:="", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=True, ReplaceFormat:=True
Set ws = Nothing

【讨论】:

  • 疯狂的物理学家 谢谢你的格式化。我应该提到要使十进制和千位分隔符起作用,我在 ThisWorkbook 模块中插入以下内容: Private Sub Workbook_Open(), tmpBool = Application.UseSystemSeparators, Application.UseSystemSeparators = False, End Sub; tmpBool 可以在主模块中设置为布尔值,然后:Private Sub Workbook_BeforeClose(Cancel As Boolean), Application.UseSystemSeparators = tmpBool, End Sub
  • 如果您将 UseSystemSeparators 放在单个 Sub 中,一旦 Sub 关闭,它将恢复到原始状态,不允许您的小数和千位分隔符更改保持活动状态。
猜你喜欢
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多