我无法使excel vba在Windows 10中使用应用程序分隔符,而我可以在Windows 7中使用

时间:2016-12-21 09:13:07

标签: excel vba excel-vba

我一直在寻找两天来解决我的问题,但到目前为止还没有。

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

现在新人已经获得10个窗口,而且有些工具会出错。我从IT部门获得了一台Win10的PC进行测试,发现无论我如何设置Excel设置,VBA Macro都会在工作表上使用PC区域设置,它仍然使用Excel设置中确定的内容。同样的文件,在我的win7 pc中进行相同的测试,如果设置,那么在sheet和vba宏上都使用本地应用程序设置。

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

编辑:只是为了让它更清楚我会添加一些代码:

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

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

2 个答案:

答案 0 :(得分: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的“{1}}。”作为DecimalSeparator

<强>解决方案:

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

解决方案示例:

Application.DecimalSeparator = ","时的Application.UseSystemSeparators = True

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

CDbl(Range("A1").Value)

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

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

答案 1 :(得分:-1)

也许这就是:

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