我无法使excel vba在windows 10中使用应用程序分隔符,而在windows 7中可以
我已经找了两天来解决我的问题,但到目前为止什么都没有 在我工作的地方开发了许多(很多)vba excel工具,我们在PC-s中的区域设置将逗号确定为十进制分隔符,但从我们的系统下载的报告和数据将点作为十进制分隔符。在这些工具中,当需要时,我们只需设置我无法使excel vba在windows 10中使用应用程序分隔符,而在windows 7中可以,vba,excel,Vba,Excel,我已经找了两天来解决我的问题,但到目前为止什么都没有 在我工作的地方开发了许多(很多)vba excel工具,我们在PC-s中的区域设置将逗号确定为十进制分隔符,但从我们的系统下载的报告和数据将点作为十进制分隔符。在这些工具中,当需要时,我们只需设置UseSystemSeparators=False然后设置DecimalSeparators=“.”,并在宏结束时恢复 现在,新用户已经购买了Windows10电脑,一些工具出现了错误。我从它那里得到了一个Win10 PC进行测试,发现无论我如何在E
UseSystemSeparators=False
然后设置DecimalSeparators=“.”
,并在宏结束时恢复
现在,新用户已经购买了Windows10电脑,一些工具出现了错误。我从它那里得到了一个Win10 PC进行测试,发现无论我如何在Excel设置中设置VBA宏都使用PC区域设置,而在工作表上它仍然使用Excel设置中确定的设置。在我的win7 pc中使用相同的文件、相同的测试,如果设置了,则在工作表和vba宏都使用本地应用程序设置
有人知道原因是什么以及如何解决吗?我可以想出很多解决办法,但所有这些都意味着这些工具需要重新编码,而且这些工具太多了,我仍然在不断地寻找新使用的工具,以及在我3月份加入该公司之前开发的工具。更改所有~300 PC-s区域设置不是一个选项,因为它通常需要逗号作为十进制分隔符
编辑:为了更清楚一点,我将添加一些代码:
Sub test()
Application.UseSystemSeparators = False
Application.DecimalSeparator = "."
variable = "10.1"
MsgBox CDbl(variable)
End Sub
在Windows7下-没问题。可以转换包含字符串的变量。
在Windows 10-运行时错误下,键入不匹配。两台PC都有“as”作为系统分离器。有趣的是,当我将“10.1”改为“10,1”时,这在两台PC-s上都有效。两台PC-s的设置相同。系统使用“,”作为分隔符,Excel设置为使用“。此答案基于您的系统(默认)小数分隔符为逗号(,),千位分隔符为点(.)-使用Windows 10
说明:
我做了一些测试,发现以下函数只会更改Excel中的小数分隔符,而不会更改VBA中的小数分隔符:
Application.UseSystemSeparators = False
Application.DecimalSeparator = "."
Application.ThousandsSeparator = ","
这意味着,当您使用这些代码行更改小数分隔符时,它只会更新工作簿中的值,以指定的格式显示。例如,如果系统格式为:
100.000.000,99
然后,上面的代码行将值转换为:
100,000,000.99
但是,当您运行上述代码并尝试使用非系统格式的字符串作为小数分隔符时,VBA将无法识别它
示例:
(其中Application.DecimalSeparator=“,”
whenApplication.UseSystemSeparators=True
)
此代码将返回10099
,而不是预期的100,99
(在您的系统格式中)的两倍,因为VBA没有将“.”的DecimalSeparator
视为DecimalSeparator
解决方案:
在VBA中引用Double时,您需要始终使用计算机的系统分隔符来表示千和小数。如果将双精度输入为字符串,则需要使用将字符串转换为使用系统分隔符的格式
解决方案示例:
(其中Application.DecimalSeparator=“,”
whenApplication.UseSystemSeparators=True
)
如果在单元格A1
中有字符串“100000000.99”
,请使用以下代码:
CDbl(Range("A1").Value)
它将产生“类型不匹配”错误。但是,如果将其转换为使用系统分隔符的字符串,则不会给出任何错误。不过,您需要使用两个Replace
函数,一个用于删除thousandsseparator
,另一个用于将小数分隔符转换为您的系统分隔符:
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
谢谢你的解释。但问题是。。。在Windows7PC中,一切正常。我设置Application.UseSystemSeparators=False,Application.DecimalSeparator=“”。我可以将带有CDbl的字符串“10.1”转换为双精度。当我在windows 10电脑上做同样的操作时,我得到了类型错误。解决方案不应该改变,您只需要对字符串应用Replace
函数,这将阻止错误在Windows 10上发生,并且不会影响Windows 7 PC,因为它们仍然可以正常使用Replace
函数。正如我所说,有这么多不同的工具,我真的希望避免花费接下来的三个时间数月后重新编程。正如我在最初的帖子中所说,我可以想出很多解决办法。我想知道的是如何使Excel在windows 7下工作,或者如果真的不可能,那么我可以让所有人知道我工作列表中的所有项目都将推迟三个月。我觉得应该更加强调的是,CDbl
从来就不是为了尊重应用程序。小数分隔符
。它可能从来没有这样做过,或者在OP没有注意到的情况下生成了稍微/不太稍微偏离的值,或者确实发生了这种情况,但问题是,CDbl
仅在设计上尊重系统分隔符,任何假定不同的代码都必须更改。@codegenerator是作为非Excel文件生成的数据,然后导入Excel?如果是,如何将数据输入Excel?使用VBA,更好的方法是使用Workbook.OpenText
方法,该方法允许您指定导入数据中存在的千分位和小数点分隔符。在我看来,这将是一种更加防弹的方法,尤其是在将来。@codegenerator您使用cdbl进行的测试并没有显示Excel没有使用系统分隔符。将该值写入工作表单元格,然后查看结果。VBA不是Excel@codegenerator此外,您可能需要更改千位分隔符#codegenerator我不相信您可以更改小数
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