我一直在寻找两天来解决我的问题,但到目前为止还没有。
在我工作的地方开发了很多(很多)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设置为使用“。”。
答案 0 :(得分:1)
<强>解释强>
我做了一些测试,发现以下函数只更改了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