Страницы: 1
RSS
VBA. Выбор уникальных значений в двух столбцах.
 
Здравствуйте.  
 
Помогите, пожалуйста, улучшить макрос.  
Появилась необходимость в выборе уникальных значений по двум столбцам (по типу, как это реализовано в сводных таблицах). Но оба этих столбца в таблице имеют разрывы.  
 
Макрос я реализовал в меру своего разумения (поскольку в VBA слабо разбираюсь, то и алгоритм решения и реализация на низком уровне), но есть две проблемы:    
1. Все равно появляются задвоенные значения (эта проблема есть и в файле во вложении)  
2. Не знаю, как избавиться от пустых значений.  
 
Подскажите, пожалуйста, как можно решить данные проблемы.  
Кроме того, подозреваю, он будет очень медленно работать на больших таблицах - может, его как-то можно оптимизировать?  
 
Заранее большое спасибо за помощь!  
 
P.S. Заранее предвидя Ваш возможный вопрос - использовать сами сводные таблицы я не могу, поскольку этот макрос - часть еще большего макроса. Хотелось бы все один раз автоматизировать и забыть...
 
Я этот макрос вообще не понял...  
Как и не понял, что из чего нужно получить.  
"в выборе уникальных значений по двум столбцам" - это по зелёным?  
 
На словаре и массивах будет быстро и на больших объёмах, доказано опытом форумов :)
 
Алгоритм элементарный:  
 
1 берём данные в массив  
2 объявляем пустой массив нужного размера (исходя из уже определённого количества данных)  
3 перебор исходного массива, заносим уникальные в словарь или коллекцию, сразу копируем данные в итоговый массив, двигая индекс  
4 в случае повтора в словаре/коллекции не копируем и не двигаем :)  
На коллекции даже будет быстрее.  
 
5 выгрузка заполненной части массива.
 
Да, выбрать уникальные нужно из двух зеленых столбцов.    
 
Важное уточнение (к сожалению, забыл написать), из столбца "а" необходимо выбрать уникальные не из полных значений, а из первых 4 знаков каждого значения.  
 
По факту макрос в отдельных столбцах делает следующее:  
1. Берет первые 4 знака каждого значения в столбце "а"  
2. Сцепляет полученное со значением из столбца "с"  
3. Выбирает уникальные  
4. Разбивает полученные данные опять на 2 столбца  
 
С массивами, боюсь, не смогу реализовать... :(
 
Ерунда, сможете. Сейчас, погодите...
 
Есть еще нюанс - макрос предназначается для работы с разными таблицами, и изначально я не знаю, сколько значений в столбце, но это в принципе можно определить отдельной процедурой...
 
Sub tt()  
   Dim a(), i&, ii&, t$  
   a = [a1].CurrentRegion.Value ' или любым другим способом определить диапазон и взять его value
   ReDim b(1 To UBound(a), 1 To 2)    ' вот такой нужен на выходе  
     
   With CreateObject("scripting.dictionary")    'будем юзать словарь, с ним проще код :)  
       .CompareMode = 1    'сравнение без учёта регистра  
       For i = 1 To UBound(a)    'первая строка не нужна, но нехай буде родной заголовок :)  
           t = Left(a(i, 1), 4) & "|" & a(i, 3)    'получаем значение вида aaaa|Banana  
           If Len(t) > 1 Then 'если в переменной не только "|", но можно и иначе отсеять пробелы  
           If Not .exists(t) Then 'если нет в словаре  
               .Item(t) = 0& 'заносим  
               ii = ii + 1 'увеличиваем индекс  
               b(ii, 1) = Left(a(i, 1), 4): b(ii, 2) = a(i, 3) 'копируем  
           End If  
           End If  
       Next  
   End With  
     
   If ii > 0 Then [h1].Resize(ii, 2) = b 'выгрузка, если есть что выгружать
     
End Sub
 
)))))  
Спасибо большое, сейчас буду пробовать...  
 
З.Ы. Отдельное спасибо за комментарии :)
Страницы: 1
Читают тему
Наверх