我不能使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