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

标签 vba excel

我已经寻找了两天来解决我的问题,但到目前为止没有任何结果。

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

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

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

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

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 设置为使用“.”。

最佳答案

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

说明:

我做了一些测试,发现以下函数仅更改 Excel 中的 DecimalSeparator,而不更改 VBA 中的 DecimalSeparator:

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 中引用 double 时,您需要始终使用计算机的系统分隔符来表示千位和小数。如果 double 作为字符串导入,则需要使用 Replace将字符串转换为使用系统分隔符的格式。

解决方案示例:

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

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

CDbl(Range("A1").Value)

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

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

关于vba - 我无法使 Excel VBA 在 Windows 10 中使用应用程序分隔符,而在 Windows 7 中可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41258972/

相关文章:

excel - 在 Excel 中打印 MATLAB 图窗并调整其大小

c# - 如何将 C# 对象列表导出到 Excel 电子表格?

arrays - VBA将数组缓慢写入Excel工作簿

vba - 公共(public)变量在表单中的 VBA 中并不是真正公共(public)的

excel - 土耳其语 Excel 版本 : transforming dotted upper i, "İ"到无点上部 i "I",带 VBA

python - Python xlwt模块中的Excel组合框

excel - 在 Excel 2003 中过滤掉所有具有相同背景颜色的行?

vb.net - 关闭 Excel.exe 进程

VBA,Excel - 比较多个条件的行,复制并在新工作表中添加结果

VBA - 试图打开文件夹中的所有工作簿