我不能使Excel VBA使用Windows 10中的应用程序分隔符,而我可以在Windows 7中

我一直在寻找两天解决我的问题,但迄今为止没有。

在我工作的地方开发了很多(非常多)vba excel工具,而我们在PC-s中的区域设置决定了逗号作为小数点分隔符,但是从我们的系统下载的报告和数据具有小数点分隔符。 在这些工具中,需要的时候我们只需要设置UseSystemSeparators = False然后DecimalSeparators = "." 并在macros观结束时回复。

现在新来的人已经拿到了10个窗口,一些工具出现了错误。 我从IT获得了一个Win10的testing,发现无论我如何在Excel设置中设置,VBAmacros使用PC区域设置,但仍然使用在Excel设置中确定的PC区域设置。 相同的文件,在我的win7电脑相同的testing,如果设置然后在工作表和VBAmacros使用本地应用程序设置。

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

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

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

在Windows 7下 – 没问题。 包含一个string的variables可以被转换。 在Windows 10下 – 运行时错误,types不匹配。 两台PC都有“,”作为系统分隔符。 有趣的是,当我将“10.1”改为“10,1”时,这两个PC-s都能正常工作。 两台PC-s的设置是相同的。 系统使用“,”作为分隔符,Excel设置为使用“。”。

这个答案是基于你的系统(默认)DecimalSeparator是一个逗号(,)和ThousandsSeparator是一个点(。) – 使用Windows 10

说明:

我做了一些testing,发现以下函数只改变了Excel中的DecimalSeparator ,而不是在VBA中:

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

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

 100.000.000,99 

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

 100,000,000.99 

但是,当您运行上面的代码并尝试使用DecimalSeparator使用非系统格式的string时,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中引用双打时,您需要始终使用计算机的系统分隔符(数字和小数)。 如果将双精度input为string,则需要使用Replace将string转换为使用系统分隔符的格式。

解决scheme示例

(其中Application.DecimalSeparator = ","Application.UseSystemSeparators = True

如果在单元格A1具有"100,000,000.99"string并使用以下代码:

 CDbl(Range("A1").Value) 

它会产生“types不匹配”的错误。 但是,如果您将其转换为使用系统分隔符的string,则不会发生错误。 您将需要使用两个Replace函数,一个是删除ThousandsSeparators DecimalSeparators ,另一个是将DecimalSeparators转换为系统位置:

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

也许这个:

 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