Проблема с Application.DecimalSeparator

Мой регион использует «,» как десятичный разделитель. Когда я запускаю следующий код в Excel 2013, чтобы импортировать номер, который использует «.». как десятичный разделитель, я не получаю ошибок.

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

Но когда я пытаюсь использовать тот же самый код в Excel 2010, который также использует «,» как десятичный разделитель, я не получаю такого же результата. Отладка показывает, что Application.DecimalSeparator = "." Это не имеет никакого смысла, поскольку числа вводятся с разделителем «,» в этом Excel.

Любая идея, почему это происходит?

У меня была такая же проблема, и мне удалось найти ответ в этой теме .

Application.DecimalSeparator имеет значение только в том случае, если у пользователя нет опции UseSystemSeparators.

Например, если Application.UseSystemSeparators = True, значение Application.DecimalSeparator не отражает то, что фактически использует Excel. Было бы неплохо, если бы это было описано в документах MSDN для Application.DecimalSeparator , но это не так.

Нить mrexcel также содержит элегантное решение; вместо вызова Application.DecimalSeparator, создайте функцию

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

и назовите это вместо этого. Я использовал этот подход, и он работает нормально.

Мой регион также использует «,» как десятичный разделитель и «.». для разделителя тысяч. У меня также были подобные проблемы в прошлом. К сожалению, я не смог повторить ошибку сейчас, но могу вспомнить, что смена десятичного разделителя Excel не устранила и проблему.

Единственным обходным решением, которое я смог найти (что мне не очень понравилось), было преобразование десятичных и тысяч разделителей по коду в Workbook_Open и их возврат к оригиналу в Workbook_BeforeClose. Хорошая его часть заключалась в том, что книга продолжала показывать оригинальные разделители, в то время как код использовал измененные. Таким образом, пользователь вообще не видит никакой разницы.

Я думаю, вы могли бы использовать эту технику, чтобы изменить региональные настройки на те, которые используются httpObject, только для процедуры импорта и исключить часть Заменить вашего кода.

Исходное решение было найдено здесь: 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) 

для нахождения фактического разделителя.

Interesting Posts

Преобразование вертикальных данных в горизонтальное положение в excel

Как сохранить файл Excel в s3 с помощью aws-sdk в узле js?

Возможность объединения нескольких файлов excel

Установите Fit to Visible в Pdf от excel vba

Как найти слова, начинающиеся с определенного письма, и удалить эту строку?

Формула для преобразования чисел во Время

Удалить всю строку выбранного элемента в списке, VBA Excel

VBA Excel Слияние динамических диапазонов от двух листов до одной, 1004 пасты

Excel: есть ли событие для обнаружения изменений в режиме расчета (автоматический / ручной)

Excel Min Date в заданном диапазоне

Как прочитать файл excel на C # без использования библиотек Microsoft.Office.Interop.Excel

Задержка макроса auto_open с возможностью отмены

excel vba даты записи dd / mm / yyyy

.FindPrevious не находит истинный предыдущий в excel userform

Как создать строку, которая будет использоваться в качестве формулы в excel VBA

Давайте будем гением компьютера.