Application.DecimalSeparator问题

我的地区使用“,”作为小数点分隔符。 当我在Excel 2013中运行以下代码导入使用“。”的数字时。 作为小数点分隔符我没有得到错误

Dim strGetResult As String strGetResult = httpObject.responseText strGetResult = Replace(strGetResult, ".", Application.DecimalSeparator) 

但是当我在Excel 2010中使用同样的代码时,也使用“,”作为小数点分隔符,我不会得到相同的结果。 debugging显示Application.DecimalSeparator =“。” 这是没有意义的,因为数字是用Excel中的“,”分隔符input的。

任何想法为什么发生这种情况?

我有同样的问题,并设法find在这个线程的答案。

Application.DecimalSeparator仅在用户没有选中UseSystemSeparators选项时才有意义。

例如,如果Application.UseSystemSeparators = True,则Application.DecimalSeparator的值不反映Excel实际使用的内容。 如果在Application.DecimalSeparator的MSDN文档中对此进行了描述,那将会很好,但事实并非如此。

mrexcel线程还包含一个优雅的解决scheme; 而不是调用Application.DecimalSeparator,创build一个函数

 Public Function GetDecimalSeparator() GetDecimalSeparator = Mid(Format(1000, "#,##0.00"), 6, 1) End Function 

并调用它。 我用这种方法,似乎工作正常。

我的地区也使用“,”作为小数点分隔符和“。” 为数千个分离器。 过去也有类似的问题。 不幸的是,我现在无法重复这个错误,但我记得更改Excel的小数点分隔符,也没有解决问题。

唯一的解决方法,我能find(我不是真的很喜欢)是通过代码在Workbook_Open切换十进制和千位分隔符,并将其更改回原来在Workbook_BeforeClose。 其中很大一部分是工作簿继续显示原始分隔符,而代码使用了更改的分隔符。 这样用户根本看不出有什么区别。

我想你可以使用这种技术将区域设置更改为httpObject使用的区域设置,仅用于导入过程并消除代码的replace部分。

原始解决scheme在这里find: http : //www.xtremevbtalk.com/archive/index.php/t-138511.html 。

将下面的代码放在一个标准模块中。 调用InitLocale将小数点分隔符设置为“。” 和千位分隔符“,”。 调用RestoreLocale恢复原始设置。 两个命名的范围(rDecimal和rThousand)用于存储原始设置,但如果在同一过程中更改为原始文件,则可能不需要执行此操作。

 Declare PtrSafe Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" _ (ByVal LOCALE As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long Declare PtrSafe Function GetUserDefaultLCID% Lib "kernel32" () Declare PtrSafe Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" _ (ByVal LOCALE As Long, ByVal LCType As Long, ByVal lpLCData As String) As Long Public Const LOCALE_SCURRENCY = &H14 Public Const LOCALE_SDECIMAL = &HE Public Const LOCALE_STHOUSAND = &HF Public SDECIMAL As String Public STHOUSAND As String Public LOCALE As Long Public rDecimal As Range, rThousand As Range Sub FixLocale() Set rDecimal = ActiveWorkbook.Names("sDecimal").RefersToRange Set rThousand = ActiveWorkbook.Names("sThousand").RefersToRange Call GetLocale rDecimal = SDECIMAL rThousand = STHOUSAND If SDECIMAL <> "." Or STHOUSAND <> "," Then Call SetLocale(".", ",") End If End Sub Sub RestoreLocale() Set rDecimal = ActiveWorkbook.Names("sDecimal").RefersToRange Set rThousand = ActiveWorkbook.Names("sThousand").RefersToRange Call GetLocale If SDECIMAL <> rDecimal Or STHOUSAND <> rThousand Then Call SetLocale(rDecimal.Value, rThousand.Value) End If End Sub Sub GetLocale() Dim Symbol As String Dim iRet1 As Long Dim iRet2 As Long Dim lpLCDataVar As String Dim Pos LOCALE = GetUserDefaultLCID() iRet1 = GetLocaleInfo(LOCALE, LOCALE_SDECIMAL, lpLCDataVar, 0) Symbol = String$(iRet1, 0) iRet2 = GetLocaleInfo(LOCALE, LOCALE_SDECIMAL, Symbol, iRet1) Pos = InStr(Symbol, Chr$(0)) If Pos > 0 Then SDECIMAL = Left$(Symbol, Pos - 1) Else MsgBox ("Error geting LOCALE") End If iRet1 = GetLocaleInfo(LOCALE, LOCALE_STHOUSAND, lpLCDataVar, 0) Symbol = String$(iRet1, 0) iRet2 = GetLocaleInfo(LOCALE, LOCALE_STHOUSAND, Symbol, iRet1) Pos = InStr(Symbol, Chr$(0)) If Pos > 0 Then STHOUSAND = Left$(Symbol, Pos - 1) Else MsgBox ("Error geting LOCALE") End If End Sub Sub SetLocale(SymbDecimal As String, SymbThousand As String) LOCALE = GetUserDefaultLCID() iRet1 = SetLocaleInfo(LOCALE, LOCALE_SDECIMAL, SymbDecimal) LOCALE = GetUserDefaultLCID() iRet1 = SetLocaleInfo(LOCALE, LOCALE_STHOUSAND, SymbThousand) End Sub 

正如GodSmith所述 ,如果Application.UseSystemSeparators = True,则Application.DecimalSeparator返回不正确的值。 但是你可以使用:

 Application.International(xlDecimalSeparator) 

find实际的小数点分隔符。