Страницы: 1
RSS
Сохранение элементов VBA-коллекции на лист за один проход., (т.е. без записи каждой отдельной ячейки, а все сразу, оптом)
 
Здравствуйте.
Возможно ли сохранение VBA-коллекции на лист за один проход. Также как с массивами.
Считывать циклом и записывать элемент в каждую ячейку - долго. Как записать оптом всю коллекцию  ?
Код
Sub СборкаМатериалов210921()

    Dim KM As New Collection 'коллекция материалов
    Set arr = Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row)
    On Error Resume Next
    For Each i In arr
        KM.Add i.Value, CStr(i.Value)
    Next i
    On Error GoTo 0
    
' далее нужно сохранить всю коллекцию на лист за один проход, (также быстро как можно сохранять массивы)
' т.е. без записи каждой отдельной ячейки

End Sub
Изменено: Сергей Евдокимов - 21.09.2021 07:49:16
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
Цитата
Сергей Евдокимов написал:
Как записать оптом всю коллекцию
подключить смекалку. В каждую ячейку - долго, да. Но если предварительно записать в массив - то быстро.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Сергей Евдокимов, поддерживаю Дмитрий(The_Prist) Щербаков. Выгрузить в двумерный массив, массив на лист.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
Дмитрий(The_Prist) Щербаков написал: подключить смекалку.
Всенепременно воспользуюсь столь ценным советом. Но в следующий раз.
Стало быть, напрямую нельзя. В чем и была потребность убедиться...

p/s а файл мастырил - от злых языков. Был уверен, что не будет нужен )
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
Можно, заменив коллекцию на словарь.
Код
Sub СборкаМатериалов220921()
    Dim KM As Object
    Set KM = CreateObject("Scripting.Dictionary")
    Dim arr As Variant
    Set arr = Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row)
    On Error Resume Next
    For Each i In arr
        KM.Add KM.Count, CStr(i.Value)
    Next i
    On Error GoTo 0
     
    Range("A1").Resize(KM.Count, 1) = Application.Transpose(KM.Items())
End Sub
 
Цитата
МатросНаЗебре: Можно, заменив коллекцию на словарь
вы не поняли —
Цитата
Сергей Евдокимов: напрямую нельзя. В чем и была потребность убедиться
не тратьте время — ТСу не нужны рабочие варианты, вопрос был именно "можно ли"  :)

Всё про коллекции в VBA
Изменено: Jack Famous - 21.09.2021 09:26:55
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
МатросНаЗебре, у транспонирования есть ограничение. Потому я избегаю его использовать.
для Jack Famous

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
JayBhagavan: на кой ляд лишний раз провоцировать человека?
в чём провокация, простите?
Цитата
МатросНаЗебре: KM.Items
выгружать нужно КЛЮЧИ, а не ЗНАЧЕНИЯ— иначе зачем это всё?   :)
В коллекциях пара инвертирована и представляет собой ЗНАЧЕНИЕ-КЛЮЧ, а не привычное по логике и словарям КЛЮЧ-ЗНАЧЕНИЕ (если вы руководствовались этим)
Изменено: Jack Famous - 21.09.2021 09:38:47
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
МатросНаЗебре, JayBhagavan, спасибо.
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
У ТС в первом сообщении коллекция наполняется таким образом, что возможны повторы.
Для того, чтобы сохранить эту возможность, сделал выгрузку значений.
 
Цитата
МатросНаЗебре: У ТС в первом сообщении коллекция наполняется таким образом, что возможны повторы
ещё раз перечитайте моё замечание
У ТСа в качестве И КЛЮЧЕЙ, И ЗНАЧЕНИЙ — ОДНИ И ТЕ ЖЕ данные, поэтому непонятно, откуда такой вывод…
Выставление оператора On Error Resume Next однозначно говорит, что мы готовимся к ошибкам при добавлении повторов ключей, а значит отбираем УНИКАЛЬНЫЕ причём совершенно хрестоматийным способом
О ключах коллекции
Удивлюсь, если ТС не согласен со мной
Изменено: Jack Famous - 21.09.2021 09:52:00 (Добавил скрин)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
МатросНаЗебре написал:
в первом сообщении коллекция наполняется таким образом, что возможны повторы
это в каком месте, если не секрет? Что-то не углядел подобного. О повторах чего речь? Там и для ключа и для значения - одна и та же ячейка используется. Только для ключа всегда в текст переводится, а для значения - нет. Этот подход позволяет как раз избежать таких задвоений как: 1 <> "1".
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Почитал про коллекции. Соглашусь с замечанием по повторам.
Изменено: МатросНаЗебре - 21.09.2021 09:50:54
 
Эту строку
Код
KM.Add KM.Count, CStr(i.Value)
Замените на эту
Код
KM.Item(CStr(i.Value)) = 0

И эту
Код
Range("A1").Resize(KM.Count, 1) = Application.Transpose(KM.Items())

На эту
Код
Range("A1").Resize(KM.Count, 1) = Application.Transpose(KM.Keys())
Изменено: МатросНаЗебре - 21.09.2021 10:03:50
 
Подскажите плиз.
Перезаписываю циклом коллекцию в массив.

Пытаюсь массив выгрузить на лист, а выгружается только первый элемент.
Чего делаю не так ?
Код
Sub СборкаМатериалов210921()
    Dim KM As New Collection 'коллекция материалов
    Dim arr() As Variant
    
    Set a = Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row)
    
    On Error Resume Next
    For Each i In a
        KM.Add i.Value, CStr(i.Value)
    Next i
    On Error GoTo 0
    
    ReDim arr(1 To KM.Count)
    For r = 1 To KM.Count
        arr(r) = KM(r)
    Next
    Range("B1").Resize(UBound(arr, 1), 1) = arr
End Sub

 
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
Цитата
Сергей Евдокимов написал:
Чего делаю не так ?
создаете горизонтальный массив, а выгрузить пытаетесь вертикальный. По умолчанию все одноразмерные массивы именно горизонтальные. Правильно так:
Код
ReDim arr(1 To KM.Count, 1 to 1)
    For r = 1 To KM.Count
        arr(r,1) = KM(r)
    Next
а далее все как было
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Сергей Евдокимов: Чего делаю не так ?
одномерный массив не выгрузить в столбец (можно в строку или с помощью транспонирования)
Исправьте ReDim arr(1 To KM.Count, 1 To 1)
Как бы я сделал (без словарей и за 1 цикл)
Изменено: Jack Famous - 21.09.2021 12:25:02
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Дмитрий(The_Prist) Щербаков, Jack Famous, спасибо !
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
Сергей Евдокимов, добавил вариант. Пожалуйста  ;)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх