Страницы: 1 2 След.
RSS
Числа, как текст при выгрузке массива на лист методом Resize
 
Доброго времени суток!
Подскажите пожалуйста, почему массив, при выгрузке на лист поэлементно (закомментировано) вставляет всё как надо, а через Resize числа вставляются как текст?
Код
Option Explicit
Sub Редиска()
Dim arrAll, arrSome, x
Dim i&
Dim delSome$

arrAll = [E1:E3].Value
delSome = " "
i = 1
    For Each x In arrAll
        arrSome = Split(x, delSome)
        Cells(i, 9).Resize(1, 3).Value2 = arrSome
'        Cells(i, 9) = arrSome(0)
'        Cells(i, 10) = arrSome(1)
'        Cells(i, 11) = arrSome(2)
        i = i + 1
    Next x
End Sub
Изменено: Jack Famous - 02.03.2018 17:48:15
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Пример, пожалуйста
Владимир
 
sokol92, обновил шапку, хотя вопрос, как мне кажется, чисто умозрительный…
Изменено: Jack Famous - 02.03.2018 17:56:08
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
sokol92, пример простой - в Immediate
Код
[A1:C1]=split("1 d 4")
Дело видимо в следующем. Split возвращает массив типа String(), и при заполнении диапазона ячейки получают значения напрямую, без конвертации. При присваивании значения одной ячейке VBA приводит тип String к Variant/String и Excel анализирует - если текст представляет собой число, он преобразуется в числовой тип. Сравните например с
Код
[A2:C2]=array("1","d","4")
Здесь передаются значения типа Variant/String и они конвертируются в числа.
 
Split в результате выдает String. Потом когда Cells.Value = элементу массива - то в ЗНАЧЕНИЕ ячейки пишется String.
А вот если Cells = элементу массива, то происходит неявное преобразование (программа "сам с усам" и преобразует похожее на число строковое выражение в число.
Кому решение нужно - тот пример и рисует.
 
Казанский, Пытливый, спасибо за объяснение! Примеры работают. А как обойти это правильно?

Кстати, заменил Cells(i, 9).Resize(1, 3).Value = arrSome на Cells(i, 9).Resize(1, 3) = arrSome — эффект тот же (в том смысле, что ошибки нет). Отсюда небольшой подвопрос - насколько важно явное объявление .Value? Какие ошибки может повлечь его отсутствие?
Изменено: Jack Famous - 02.03.2018 18:00:58
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, создать массив типа Variant() нужного размера, перенести в него значения.
Бывает так, что массив приходится определять "с запасом". При выгрузке из макроса проблем нет, но если массив является результатом работы UDF, то пустые элементы массива отображаются в ячейках как 0. Приходится заполнять "лишние" элементы пустой строкой.
 
Разъяснение в #4 нуждается в уточнении:
Код
[A1] = Split("1")
Владимир
 
Казанский, спасибо)) чёт муторно как-то (хоть и более правильно)… Попробую математическую операцию по вставленным тексточислам для преобразования…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
sokol92 написал:
Разъяснение в #4 нуждается в уточнении
это вы с чего взяли? Пример работает ровно в таком виде, как его показал Казанский
Ваш вариант для одного числа (с кавычками или без них) всё одно - вставляет, как текст. Притом, для одного числа без кавычек Split сработает, а больше — вызовет ошибку
Изменено: Jack Famous - 02.03.2018 18:14:16
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Попробую сформулировать более аккуратно (если что, есть кому уточнить).
При записи свойства value объекта Range преобразование текста в число (дату) может произойти, только если правая часть имеет один из следующих типов: string, variant/string, массив variant/variant. Это условие является необходимым, но не достаточным.
Владимир
 
В дополнение к разъяснениям, если массив задан конкретного типа, например -  As String, то при копировании массива в ячейки Excel не конвертирует автоматически типы.
Конвертация типов производится, если массив явно задан как Variant, а  элементы массив -  любого типа, но в массиве они тогда имеют составной тип Variant/String или Variant/Long и т.п. В приложенных тестовых кодах это можно увидеть в VBE -View - Locals Window  - раскрыть a() и заглянуть в столбец типов каждого элемента.
Код
Sub Test1()
' Тип элементов массива a()- String
  Dim a
  a = Split("1 d 4")
  Stop ' VBE -View - Locals Window -a(0) Type = String
  Range("A1:C1").Value = a
End Sub

Sub Test2()
' Аналогично Test1
  Dim a() As String
  ReDim a(0 To 2)
  a(0) = "1"
  a(1) = "D"
  a(2) = "4"
  Stop ' VBE -View - Locals Window -a(0) Type = String
  Range("A1:C1").Value = a
End Sub

Sub Test3()
' Тип элементов массива a() - Variant/String
  Dim a
  a = Array("1", "d", "4")
  Stop ' VBE -View - Locals Window -a(0) Type = Variant/String
  Range("A1:C1").Value = a
End Sub
Изменено: ZVI - 02.03.2018 19:15:51
 
sokol92, понятнее не стало  :sceptic: но спасибо за попытку "достучаться" ))
вы же явно "немаленький" спец (судя по форуму) - можно ли менее терминизированными словами?)) хотя общую суть я от Казанского и Пытливого, понял))

ZVI, благодарю! Я так и понял, что Split виноват)) В моём случае, через Array не понимаю, как передавать (возможно и нельзя).
За очередной урок - огромное спасибо! буду юзать Locals Window  ;)
Изменено: Jack Famous - 02.03.2018 19:20:12
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Здравствуйте, Владимир! Во мне неожиданно проявились способности оракула (см. #11) :)  Мне кажется, в Вашем Test3 массив a будет иметь тип Variant/Variant (проверил на Excel 2007).
Владимир
 
sokol92, Там речь об a(0)
А, ну да в начале написано, а я проглядел.
Тогда и в первом случае массив Variant/String...
Изменено: AAF - 02.03.2018 19:08:46
 
Цитата
sokol92 написал: проявились способности оракула
Добрый вечер, Владимир!  В Test3  тип массива - Variant/Variant, а тип элементов массива - Variant/String
У меня же и написано в начале: "В дополнение к разъяснениям....". Или лучше было дописать: "... Максима, Пытливого и оракула Владимира"?  :D  Дописал в комментариях кода про тип элементов массива.
Смысл моего вмешательства - показать, где смотреть типы.
Изменено: ZVI - 02.03.2018 19:17:07
 
Владимир, как обычно, получил удовольствие от Ваших сообщений.
Изменено: sokol92 - 02.03.2018 19:20:48
Владимир
 
Цитата
Jack Famous написал:
Я так и понял, что Split виноват))
Уважаемый Jack Famous! Я думаю, что Split ни в чем не виноват - он добросовестно разбивает строки на подстроки. Другое дело, что строка "1" и число 1 - это совершенно разные вещи. Думаю (мое личное мнение), что авторы Excel VBA напрасно ввели неявное преобразование типов при присвоении значений ячейкам. Это уже принесло (и приносит) неисчислимые беды.
Владимир
 
sokol92, спасибо!  :)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
sokol92,авторы VBA с Excel попытались додумать за пользователей, т.е. сделали то, что мы на этом VBA пишущие делаем для пользователей наших проектов)
 
Anchoret, тоже так думаю - хотели, как лучше, что называется  :)
Изменено: Jack Famous - 02.03.2018 19:54:32
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Упражнение для самопроверки по теме (решать не глядя на доску у Excel сразу не спрашивать): каковы будут типы значений ячеек
Код
Range("A1:H1").Value = Array("1", "1,1", "1,12", "1,123", "  1,123.45 ", "1/2", "1/23", "1/234")
Владимир
 
ахахахах))) ну давайте попробуем  ;)
число/число/число/число/текст/дата/текст/текст
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
у меня:
число 1
текст  1,1
текст  1,12
число 1123 (запятая замененна на пробел разделяющий группы разрядов)
число 1123.45 (аналогично пробел вместо запятой)
дата   1 янв
дата   23 янв
текст  1/234
(у меня разделитель целой и дробной части точка)

Jack Famous,
не устраивают "умные" методы, используемые Excel - конвертируйте значения по одному в нужные Вам типы
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
конвертируйте значения по одному
в данном случае достаточно просто вставлять поэлементно ;)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Рискну высказать предположение, что результат примера #22 не зависит от региональных надстроек.
Владимир
 
Цитата
sokol92 написал:
не зависит от региональных надстроек
А если предположить что мог бы?... :)
Или не стоит рисковать?
 
Тогда попробуйте еще предсказать результат, если в окне Immediate (Alt-F11 и Ctrl-G) набрать и нажать Enter на каждой из таких строк (символы - английские):
?2d3d
?2e4a
?1abc
?2abc*3
?2abc+10
?4xyz^kdf
Изменено: ZVI - 03.03.2018 06:12:07
 
Если #22 - ЕГЭ, то #28 - "минимум Ландау" по VBA. Я не сдал, для меня это окно - не прозрачно. :cry:
Владимир
 
Цитата
AAF написал в #27:
А если предположить что мог бы
А проверим. У меня есть доступ к нескольким различным региональным надстройкам, везде ответы совпадают с ответами Игоря (спасибо!) из #24. Будет любопытно, если у кого-то результаты отличаются.
Владимир
Страницы: 1 2 След.
Наверх