При вставке десятичных чисел в виде текста (в примере это результат Split'а), разделитель целой и дробной части будет удалён для чисел с разрядами 3 и более Решение: элементы массива Split'а строковые и преобразование их не изменит, так что используем переменную Если числа получены как-то по-другому, то просто не забываем их преобразовать, иначе это сделает Excel и не всегда корректно
Код и скрины
Код
Option Explicit
'===========================================================================================
Sub Test()
Dim x, spl, arr(), i&
spl = Split("1|1.1|1,1|1.11|1,11|1.111|1,111", "|")
ReDim arr(1 To UBound(spl) + 1, 1 To 2)
Debug.Print "DecSep: «" & Application.International(xlDecimalSeparator) & "»"
For i = 0 To UBound(spl)
x = spl(i)
Debug.Print i + 1 & " bef", spl(i), TypeName(spl(i)), x, TypeName(x)
If IsNumeric(x) Then x = --x: spl(i) = --spl(i)
Debug.Print i + 1 & " aft", spl(i), TypeName(spl(i)), x, TypeName(x)
arr(i + 1, 1) = spl(i)
arr(i + 1, 2) = x
Next i
Range("A1").Resize(1, UBound(spl) + 1).Value = spl
Range("A4").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
End Sub
— как можете заметить, при вставке абсолютно плевать, какой был разделитель целой и дробной части — всё будет числами и не всегда корректными
Суть проблемы в 2ух строках кода
Код
Sub t()
' Если разделитель целой и дробной части у вас ЗАПЯТАЯ, то …
ActiveCell.Value = "1,111" ' вставит число 1111 (умножит в 1000 раз)
ActiveCell.Value = "1.111" ' вставит число 1,111 (корректное преобразование, хотя тоже никто не просил) + ТОЧКА НЕ ЯВЛЯЕТСЯ у меня разделителем для дат, если это имеет значение
End Sub
объяснил на Split'е, т.к. после него и обнаружил эту проблему + понял (и захотел тоже показать), что элементы Split'а (строковый массив) не преобразовать в числа напрямую, пока они внутри массива
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
vikttur, ошибся — при вставке пропадает он При вставке пропадает разделитель целой и дробной части, Решено
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
А Split при чем? Значение преобразовывается, когда от Split следа не осталось.
Код
Sub Test()
Dim arr(1 To 2, 1 To 1)
arr(1, 1) = "1,111"
arr(2, 1) = "1.111"
Range("A4").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
End Sub
Догадка. У американцев запятая - разделитель групп разрядов, поэтому число так и воспринимается (с преобразованием). А Split - текстовый оператор, все значения, полученные в массив, редактор понимает как тексты, и не иначе
vikttur, я уже предложил название с ним не связанное - запутался Но саму инфу по Split'у надо оставить - то, что его строковые элементы не преобразовать в числа, пока они в массиве тут тоже важно
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
На майских создам отдельную тему с систематизацией подобных эффектов (давно их коллекционирую). Результат работы "2 строк кода" указан верно и не зависит от региональных настроек.
скорее всего так и есть, потому что запятая у пиндосов как раз разделитель разрядов и его Excel просто опускает за ненадобностью (спасибо, бл%% большое ) Странно (на самом деле нет), что как всегда порядка нет, ведь Immediate выводит с учётом настроек (с запятой у меня)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄