Страницы: 1
RSS
Сравнение двух столбцов с данными
 
Помогите пожалуйста с макросом который бы выполнял простую задачу  
есть столбец 1 и 2 с данными  
в столбец 3 нужно вывести данные из столбца 1 которые НЕ совпадают с данными из столбца 2  
 
Заранее благодарен
 
Возможны ли дубликаты в первом столбце?
 
в 1 столбце дубликатов нет во 2 тоже не будет  
только есть совпадения значений в столбцах 1 и 2 которые надо исключить
 
Public Sub www()  
   Dim a(), i&  
   a = Range([b2], [b2].End(xlDown).Offset(, 1)).Value
   ReDim b$(1 To UBound(a))  
   For i = 1 To UBound(a)  
       b(i) = a(i, 1)  
   Next  
   For i = 1 To UBound(a)  
       If Not IsEmpty(a(i, 2)) Then b = Filter(b, a(i, 2), 0)  
   Next  
   [d2].Resize(UBound(b) + 1) = Application.Transpose(b)
End Sub
Я сам - дурнее всякого примера! ...
 
спасибо за ответ супер работает !
 
А вот интересно, в 1-м столбце есть слово "FAST" и его нет во 2-м столбце, его нужно переносить в 3-й столбец ? )
 
Привет, Паш. Во, глазастый! Filter работает по принципу "Содержится". Т.е. все равно, что *FAS*. Это я на твой вопрос Владимиру отвечаю:-)
Я сам - дурнее всякого примера! ...
 
привет, Серёг. Я просто Filter никогда не пользовался, и решил твой код потрессировать и обнаружил этот баг... Пытался использовать vbTextCompare и vbBinaryCompare, всё равно "FAST" убивается из массива при поиске "FAS"    
 
Придётся писать другой макрос для автора )) а то он половины (11-ти) кодов не досчитается в конце ))
 
А разве это правильно, если FAST не попадёт в третий столбец?
 
Ну, там править-то пару строчек и одну дописать:-) Автор пока молчит, мож ему так и нать?
Я сам - дурнее всякого примера! ...
 
Сделай заготовку :-)
 
На всякий:-)  
Public Sub www()  
   Dim a(), i&  
   a = Range([b2], [b2].End(xlDown).Offset(, 1)).Value
   ReDim b$(1 To UBound(a))  
   For i = 1 To UBound(a)  
       b(i) = "|" & a(i, 1) & "|"  
   Next  
   For i = 1 To UBound(a)  
       If Not IsEmpty(a(i, 2)) Then b = Filter(b, "|" & a(i, 2) & "|", 0)  
   Next  
   [d2].Resize(UBound(b) + 1) = Application.Transpose(b)
   [d2].Resize(UBound(b) + 1).Replace "|", ""
End Sub
Я сам - дурнее всякого примера! ...
 
Ещё вариант, немного побыстрее
 
ну, а я со Словарём предложу )
 
{quote}{login=Степлер}{date=16.01.2012 01:00}{thema=}{post}ну, а я со Словарём предложу ){/post}{/quote}Павел, я с объяснением про FAST опоздал, зато со словарем успел немного раньше :-)
 
Вы дуплетом:-) У меня первой мыслью было со словарем. Но я на сегодня уже несколько решений делал на словаре, скучнно. Решил повыпендриваться:-)
Я сам - дурнее всякого примера! ...
 
)) да со словарём проблем нет )) Просто я немного офигел, когда увидел, что Filter удаляет всё лишнее (*FAS*), я 3 раза прочитал встроенную Справку по Filter, поискал в Справки в Яндексе... думал-думал... потом спросил у тебя )  
 
В интернете нашёл пару примеров, но действительно не обратил внимание, что Filter удаляет элементы в режиме "содержит", а с виду такая хорошая функция была )))  
 
Когда Сергей написал про "содержит", то пошёл писать макрос со Словарём ))  
 
Вот можно было бы отключать эту фенечку (баг) в Filter, а не извращаться, как предложил Сергей с | , было бы интересней )))
 
и так... в виде интереса  
 
как лучше заполнять Словарь? так?  
 
oDict.Item(b(i, 1)) = vbNullString  
 
или так?  
 
oDict.Add b(i, 1), 1  
 
или без разницы как?
 
По мне, так это не баг, это фича. Когда бывает надо по "содержится", никаких лишних телодвижений. Ну а ячейка целиком... Другой подход.  
Посмотри, если не лень, здесь:  
http://www.planetaexcel.ru/forum.php?thread_id=33012  
и здесь:  
http://www.planetaexcel.ru/forum.php?thread_id=32854
Я сам - дурнее всякого примера! ...
 
Спасибо, Серёг, посмотрю
 
{quote}{login=Степлер}{date=16.01.2012 01:27}{thema=}{post}и так... в виде интереса  
 
как лучше заполнять Словарь? так?  
 
oDict.Item(b(i, 1)) = vbNullString  
 
или так?  
 
oDict.Add b(i, 1), 1  
 
или без разницы как?{/post}{/quote}  
Павел, вариант oDict.Item(b(i, 1)) = vbNullString немного быстрее
 
Спасибо.  
Все тот же Степлер.
Страницы: 1
Читают тему
Наверх