Страницы: 1 2 След.
RSS
Найти и скопировать одинаковые позиции из двух прайсов на новый лист
 
Никак не удается найти подсказки для составления формулы.  
У меня есть 2 прайса, старый и новый.    
Задача: найти в новом прайсе позиции совпадающие  по колонке А1,с оной в старом прайсе и скопировать их на отдельный лист.
 
Вы со Спиридоном договорились?
 
Про Спиридона:  
http://www.planetaexcel.ru/forum.php?thread_id=36032  
 
О названии тем и не только:  
http://www.planetaexcel.ru/forum.php?thread_id=8735&
 
{quote}{login=vikttur}{date=29.12.2011 05:01}{thema=}{post}Вы со Спиридоном договорились?{/post}{/quote}  
 
Вообще то я не знаю Спиридона и не договаривался... У меня вопрос горит, я кипятком писаю а справиться не могу.  
И прямо сейчас сижу и молю тапо - манитор-манитор, покажи буковки с формулой... ну и тд.
 
trips, в Вашем файле что-то не видно совпадений.
 
{quote}{login=The_Prist}{date=29.12.2011 05:24}{thema=}{post}<EM>http://www.excel-vba.ru/chto-umeet-excel/kak-najti-znachenie-v-drugoj-tablice-ili-sila-vpr/</EM>{/post}{/quote}  
Спасибо за ссылку,очень полезно было, но моих знаний не достаточно домыслить остальное.  
Из этого файла мне надо чтобы на странице "новый", по колонке А1 была сделана проверка на совпадение со страницей "старый" А1 и совпавшие позиции были отображены на листе 3 включая все остальные колонки. Либо, из листа "новый" удалены не совпавшие позиции.  
Примерно как то так.  
<EM><STRONG>Файл удален</STRONG> - велик размер - [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>
 
Вам давали ссылку на Правила - Вы оттуда ничего не почерпнули или просто не читали?
 
{quote}{login=Юрий М}{date=29.12.2011 06:05}{thema=}{post}Вам давали ссылку на Правила - Вы оттуда ничего не почерпнули или просто не читали?{/post}{/quote}  
Со страшной силой извиняюсь!!!    
Восклицательные знаки - есть, вопросительные - есть, а нагибательных почему-то нет...  
Просто я весь в истерике, аврале и даунито морале.
 
Какой из прайсов изначально больше - новый или старый?
 
Юр, а зачем? В любом случае:"найти в новом прайсе позиции совпадающие по колонке А1,с оной в старом прайсе и скопировать их на отдельный лист." ВПР в новый прайс и копируем все, кроме ошибок. Проще простого.
Я сам - дурнее всякого примера! ...
 
Я собираюсь сначала из бОльшего извлечь уникальные.
 
Этим пускай автор заморачивается:-)  
Sub www()  
   With Лист1.Range(Лист1.[a1], Лист1.[a2].End(xlDown)).Offset(, 5)
   .FormulaR1C1 = "=VLOOKUP(RC[-5],старый!R1C1:R95C5,1,0)"
   .SpecialCells(xlCellTypeFormulas, 3).Offset(, -5).Resize(, 5).Copy Sheets(3).[a1]
   .Clear  
   End With  
End Sub
Я сам - дурнее всякого примера! ...
 
Строка:  
.FormulaR1C1 = "=VLOOKUP(RC[-5],старый!R1C1:R1000C5,1,0)"
Будет просматривать 1000 строк в "старый". Если надо больше - поменяйте в строке 1000 на нужное число.
Я сам - дурнее всякого примера! ...
 
На массивах.
 
Юрий, ваш макрос отлично написано, но мне кажется нужно добавить инструкцию    
Exit For после строки x = x + 1  
 
т.е. если мы нашли такой код, заполняем ArrRez, а дальше выходим из цикла For j = 1 To UBound(ArrOld, 1). Это будет лишним затраченным временем.    
 
Поэтому предлагаю так  
...  
ArrRez(x, 4) = ArrNew(i, 4)  
ArrRez(x, 5) = ArrNew(i, 5)  
x = x + 1  
 
Exit For  
 
End If
 
При построчной оплате я разорюсь и помру с голоду:-)
Я сам - дурнее всякого примера! ...
 
{quote}{login=Mouse}{date=29.12.2011 10:09}{thema=}{post}Юрий, ваш макрос отлично написано, но мне кажется нужно добавить инструкцию    
Exit For после строки x = x + 1{/post}{/quote}Была мысль... А если он ещё раз встретится?
 
ну, это да. Нужно автора спросить - встречаются ли случаи, что Коды заказа повторяются на одном и том же листе?  
 
P.S. Хотя та же ВПР - тоже берёт первое сверху значение, хоть их там 20 будет повторов.  
 
P.P. Но что-то мне подсказывает, что в Прайс-листе никогда товар не повторяется.
 
Юрий, а чего не на словаре?  
Одним проходом набрали словарь, вторым проходом по словарю проверили и отобрали.
 
А словарь - не умею...
 
а, кстати, какая разница повторяется ли товар или нет на одной строке. У нас задача "найти в новом прайсе позиции, совпадающие по колонке А1 с оной в старом прайсе и скопировать их на отдельный лист."  
 
Это говорит о том, что даже если код заказа и повторяется, то номер у него будет один и тот же. Т.е. мы пользователю говорим, что код "GJI2322322R0001" есть и там и там. Всё. А сколько там повторений на листе, это уже другая задача.    
Но повторюсь, в Прайс-листах обычно товар не повторяется.
 
{quote}{login=Юрий М}{date=29.12.2011 08:18}{thema=}{post}На массивах.{/post}{/quote}  
Зачем очистка лишней строки (LastRow + 1)?  
 
LastRow = Cells(Rows.Count, 1).End(xlUp).Row  
Range(Cells(2, 1), Cells(LastRow + 1, 5)).ClearContents
 
Т.к. в 1-й строке на листе "Результат" идёт шапка таблицы. Если +1 не сделать, то шапка очиститься
 
{quote}{login=Mouse}{date=29.12.2011 10:27}{thema=}{post}а, кстати, какая разница повторяется ли товар или нет {/post}{/quote}Согласен - зря я подстраховывался :-)
 
{quote}{login=Mouse}{date=29.12.2011 10:32}{thema=}{post}Т.к. в 1-й строке на листе "Результат" идёт шапка таблицы. Если +1 не сделать, то шапка очиститься{/post}{/quote}  
Но ведь "шапка" отсекается Cells(2, 1):  
диапазон с А2 по Е(последняя_строка+1)  
?
 
И здесь перестраховался? :)
 
не, Вить. Ты думаешь, что диапазон будет расширяться от второй строки и вниз до LastRow, но если LastRow = 1, то диапазон расширяется от второй строки вверх (до строки 1) ))
 
На массивах и словаре (шаблонный макрос :) ):  
 
 
Option Explicit  
 
'Макросом -  
'1.два диапазона в два массива  
'2.создание массива для результатов  
'3.один перебор 300 значений массива в словарь  
'4.100 000 проверок массива на наличие в словаре и заполнение данными массива результата  
'5.выгрузка результатов (тут нет предварительной очистки диапазона)  
 
Sub compare()  
   Dim a(), b(), c(), iLastrow As Long, i As Long, ii As Long, x As Byte  
 
   '1.  
   With Sheets(1)  
       iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row  
       a = Range(.[e1], .Range("A" & iLastrow)).Value
   End With  
 
   With Sheets(2)  
       iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row  
       b = Range(.[a1], .Range("A" & iLastrow)).Value
   End With  
 
   '2.  
   ReDim c(1 To UBound(a), 1 To 5)  
 
   With CreateObject("Scripting.Dictionary")  
 
       '3.  
       For i = 1 To UBound(b)  
           .Item(b(i, 1)) = i  
       Next  
 
       '4.  
       For i = 1 To UBound(a)  
           If .exists(a(i, 1)) Then  
               ii = ii + 1  
               For x = 1 To 5: c(ii, x) = a(i, x): Next  
           End If  
       Next  
   End With  
 
   '5.  
   With Sheets(3)  
       .[a1].Resize(ii, 5) = c
       .Activate  
   End With  
 
End Sub
 
{quote}{login=vikttur}{date=29.12.2011 10:39}{thema=}{post}И здесь перестраховался? :){/post}{/quote}Не, Вить, если очистить диапазон вручную, и выполнить макрос то шапка будет удалена (если +1 не предусмотреть).
 
Понял, перестраховка на случай, если таблица пустая (только шапка в наличии). Спасибо, сам не сообразил.
Страницы: 1 2 След.
Наверх