Страницы: 1
RSS
VBA code - сравнить id и скопировать инфо
 
Нужна срочная помощь!!  
 
Работаю над очень большим файлом и надо соединить информацию с 2 листа.  
Надо сравнить из листа "MainSheet" колонну G с колонной B из листа data и там где совпадает надо скопировать информацию с листа data начиная с колонны С на конец строки в MainSheet    
 
В файле есть пример что надо сделать! Зеленым цветом что надо сровнить и желтым что надо копировать.    
 
Спасибо огромное!
 
вот что у меня есть пока...    
 
 
Option Explicit  
 
Sub ertert()  
Dim x, y, rez(), s, i&, j&, k&, str$  
x = Range("G2:G" & Cells(Rows.Count, 1).End(xlUp).Row).Value  
With Sheets("data")  
   y = .Range("B2:I" & .Cells(Rows.Count, 1).End(xlUp).Row).Value  
End With: ReDim rez(1 To UBound(x), 1 To 4)  
With CreateObject("Scripting.Dictionary")  
   .CompareMode = 0  
   For i = 1 To UBound(y): .Item(UCase(y(i, 1))) = i: Next i  
   For i = 1 To UBound(x)  
       str = Trim(UCase(x(i, 1)))  
       If .Exists(str) Then  
           k = .Item(str): rez(i, 1) = y(k, 2): rez(i, 2) = y(k, 3): rez(i, 3) = y(k, 4): rez(i, 4) = y(k, 5)  
       Else  
           s = Split(Trim(x(i, 1)))  
           For j = 0 To UBound(s)  
               str = UCase(s(j))  
               If .Exists(str) Then  
                   k = .Item(str): rez(i, 1) = y(k, 2): rez(i, 2) = y(k, 3): rez(i, 3) = y(k, 4): rez(i, 4) = y(k, 5)  
               End If  
           Next j  
       End If  
   Next i  
End With: [b3:e3].Resize(i - 1).Value = rez()
End Sub  
 
 
Но это не работает совсем правильно, потому что не вся информация копируется да и вставляет ее не в конец а начиная с B3... !    
 
Очень нужна ваша помощь!    
Спасибо
 
Есть у меня один шаблон кода для таких задач.  
Обычно хвататет изменить пару строк...  
 
Option Explicit  
 
'Макросом -  
'1.два диапазона в два массива  
'2.создание массива для результатов  
'3.один перебор 300 значений массива в словарь  
'4.100 000 проверок массива на наличие в словаре и заполнение данными массива результата  
'5.выгрузка результатов (тут нет предварительной очистки диапазона)  
 
Sub compare()  
   Dim a(), b(), c(), iLastrow&, i&, ii&, x As Byte  
 
   '1.  
   With Sheets(1)  
       iLastrow = .Cells(Rows.Count, 7).End(xlUp).Row  
       a = Range(.[g1], .Range("G" & iLastrow)).Value
   End With  
 
   With Sheets(2)  
       iLastrow = .Cells(Rows.Count, 2).End(xlUp).Row  
       b = Range(.[b1], .Range("Q" & iLastrow)).Value
   End With  
 
   '2.  
   ReDim c(1 To UBound(a), 1 To 15)  
 
   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 = .Item(a(i, 1))  
               For x = 2 To 16: c(i, x - 1) = b(ii, x): Next  
           End If  
       Next  
   End With  
 
   '5.  
   With Sheets(1)  
       .[AF1].Resize(i - 1, 15) = c
   End With  
 
End Sub  
 
 
Можно было бы и тот код наладить - но проще свой :)
 
Спасибо Hugo,  
 
а как можно еще добавить чтоб само id тоже копировалась? item_id из data
 
А зачем? Оно ведь рядом :)  
Как -    
расширить итоговоый массив:  
ReDim c(1 To UBound(a), 1 To 16)  
 
заполнять его так:  
For x = 1 To 16: c(i, x) = b(ii, x): Next  
 
И выгружать соответственно пошире:  
.[AF1].Resize(i - 1, 16) = c
 
Не проверял :)
 
Работает супер!    
 
еще раз спасибо! а тут нету системы давать очки за ответы, ну награждение? ))
 
{quote}{login=yiannis1925}{date=22.12.2011 06:19}{thema=}{post}Работает супер!    
 
еще раз спасибо! а тут нету системы давать очки за ответы, ну награждение? )){/post}{/quote}  
 
У Игоря (Hugo) в подписи есть номер кошелька Webmoney ))
Страницы: 1
Читают тему
Наверх