Страницы: 1
RSS
Выбор уникальных значений из диапазона и вставка их в указанную ячейку, VBA
 
Добрый день!
Подскажите, пожалуйста, что не так в прилагаемой процедуре? Коллекция из уникальных значений формируется правильно, массив из тех же значений - тоже правильно, но при вставке я получаю только первый элемент массива в каждой ячейке. При вставке я избегал цикла, как рекомендует Уокенбах, но у него в примере данные из массива в диапазон переносятся правильно, а у меня нет.

Буду благодарен за помощь.

Код
Sub CopyPasteUnique()
 'процедура формируем массив уникальных значений в выбранном диапазоне и вставляем его в указанную ячейку
    Dim cell As Range
    Dim Unique As New Collection
    Dim cellPaste As Range
    Dim i As Long
    Dim UniqueArray()
           
    If TypeName(Selection) <> "Range" Then
        Exit Sub
    End If
           
    On Error Resume Next
'запрашиваем у пользователя ячейку для вставки
    Set cellPaste = Application.InputBox("Укажите ячейку для вставки", Type:=8)
    On Error GoTo 0
        If cellPaste Is Nothing Then
            Exit Sub
        End If
    Set cellPaste = cellPaste.Range("A1")
    On Error Resume Next
    For Each cell In Selection
   'формируем коллекцию из уникальных значений диапазона
        If cell.Value <> "" Then
            Unique.Add cell.Value, CStr(cell.Value)
        End If
    Next cell
    On Error GoTo 0
    
    ReDim UniqueArray(1 To Unique.Count)
   'переносим уникальные значения в массив
        For i = 1 To Unique.Count
            UniqueArray(i) = Unique.Item(i)
        Next i    
'определяем диапазон для вставки
    Set cellPaste = Range(cellPaste, cellPaste.Offset(Unique.Count - 1, 0))
   'вставляем массив в диапазон
' при вставке я пытался избежать цыкла (рекомендация одного автора учебника по VBA с примером).
' во всем диапазоне для вставки я получаю только первое значание массива
        cellPaste.Value = UniqueArray
    
End Sub
 
Такое объявление массива UniqueArray хорошо для вставки его значений в строку, а не в столбец
Для вставки по строкам измените его
ReDim UniqueArray(1 To Unique.Count, 1 To 1)
В цикле запись будет
UniqueArray(i, 1) = Unique.Item(i)
 
Попробуйте так:

Код
ReDim UniqueArray(1 To Unique.Count, 1 to 1)
   'переносим уникальные значения в массив
        For i = 1 To Unique.Count
            UniqueArray(i,1) = Unique.Item(i)
        Next i    


Сейчас сам попробую  :)  

Да, сработало.
Дело в том, что массив даже из одного столбца - двумерный. каждый элемент имеет номер строки и столбца.
Другой вариант - в Вашем варианте выгружать так:
cellPaste.Value = Application.Transpose(UniqueArray)

Но Transpose ест ресурсы, на огромном диапазоне может загнуться (в 2000 точно, в 2003 чуть лучше, в 2007 работает до предела листа 2003  :)  , далее не знаю...)
Изменено: Hugo - 05.09.2013 11:32:02
 
Работает.
Благодарствую за рекомендацию.)
 
Без указания столбца тоже должен сработать:
Код
UniqueArray(i) = Unique(i)
Страницы: 1
Читают тему
Наверх