Здравствуйте, ГУРУ Excel!!! Помогите написать макрос. Есть три листа На листе "свод" данные по которому осуществляется поиск, столбец А На "лист1" и "лист2" соответствующие значения в столбце А и данными в столбце С Необходимо по листу "свод" найти соответствующие данным в "лист1" и "лист2" и добавить в Свод в столбец D данные из столбцов С Не могу сообразить как сделать так, чтоб макрос не найдя совпадений в "лист1" стал их искать во втором листе и добавлял значения друг под другом и наоборот
Здравствуйте, ГУРУ Excel!!! Помогите написать макрос. Есть три листа На листе "свод" данные по которому осуществляется поиск, столбец А На "лист1" и "лист2" соответствующие значения в столбце А и данными в столбце С Необходимо по листу "свод" найти соответствующие данным в "лист1" и "лист2" и добавить в Свод в столбец D данные из столбцов С Не могу сообразить как сделать так, чтоб макрос не найдя совпадений в "лист1" стал их искать во втором листе и добавлял значения друг под другом и наоборотPonka
Вот мои несчастные попытки! Но это с помощью функции впр, хотелось бы упростить, может как то поиском! Подскажите, пожалуйста, или дайте хотя бы направление.
[vba]
Код
Worksheets("свод").Range("F1").EntireColumn.Insert ' выделяем лист "база столбец F и добавляет перед ним еще один столбец" Worksheets("свод").Range("F1").EntireColumn.Insert ' выделяем лист "база столбец F и добавляет перед ним еще один столбец" Sheets("свод").Select Ri_ = Range("B" & Rows.Count).End(xlUp).Row ' определяем последнее значение с данными по столбцу B Range("F3:F3").Activate 'выбираем активную ячейку ActiveCell.FormulaR1C1 = "=VLOOKUP(C[-4],лист1!C[-5]:C[-3],3,0)" Selection.AutoFill Destination:=Range("F3:F" & Ri_) Range("G3:G3").Activate ActiveCell.FormulaR1C1 = "=VLOOKUP(C[-5],лист2!C[-6]:C[-2],5,0)" Selection.AutoFill Destination:=Range("G3:G" & Ri_) Columns("F:G").Select ' выделяем столбецы F,G со значениями Selection.Copy 'копируем выделенное Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False 'столбец с выделенными формулами превращаем в данные Worksheets("свод").Range("F:G").Replace What:="#N/A", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Range("H3").Select ActiveCell.FormulaR1C1 = "=IF(RC[-1]=0,RC[-2],RC[-1])" Selection.AutoFill Destination:=Range("H3:H686") Columns("H:H").Select ' выделяем столбец Н со значениями Selection.Copy 'копируем выделенное Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False 'столбец с выделенными формулами превращаем в данные Worksheets("свод").Columns("F:G").Delete
[/vba]
Вот мои несчастные попытки! Но это с помощью функции впр, хотелось бы упростить, может как то поиском! Подскажите, пожалуйста, или дайте хотя бы направление.
[vba]
Код
Worksheets("свод").Range("F1").EntireColumn.Insert ' выделяем лист "база столбец F и добавляет перед ним еще один столбец" Worksheets("свод").Range("F1").EntireColumn.Insert ' выделяем лист "база столбец F и добавляет перед ним еще один столбец" Sheets("свод").Select Ri_ = Range("B" & Rows.Count).End(xlUp).Row ' определяем последнее значение с данными по столбцу B Range("F3:F3").Activate 'выбираем активную ячейку ActiveCell.FormulaR1C1 = "=VLOOKUP(C[-4],лист1!C[-5]:C[-3],3,0)" Selection.AutoFill Destination:=Range("F3:F" & Ri_) Range("G3:G3").Activate ActiveCell.FormulaR1C1 = "=VLOOKUP(C[-5],лист2!C[-6]:C[-2],5,0)" Selection.AutoFill Destination:=Range("G3:G" & Ri_) Columns("F:G").Select ' выделяем столбецы F,G со значениями Selection.Copy 'копируем выделенное Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False 'столбец с выделенными формулами превращаем в данные Worksheets("свод").Range("F:G").Replace What:="#N/A", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Range("H3").Select ActiveCell.FormulaR1C1 = "=IF(RC[-1]=0,RC[-2],RC[-1])" Selection.AutoFill Destination:=Range("H3:H686") Columns("H:H").Select ' выделяем столбец Н со значениями Selection.Copy 'копируем выделенное Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False 'столбец с выделенными формулами превращаем в данные Worksheets("свод").Columns("F:G").Delete
я долго долго мучилась и не без помощи получилось вот так: может кому то поможет
Sub sdf()
With Sheets("свод") i = 3 While .Cells(i, 2) <> "" doc = .Cells(i, 2) j = 2 f = True Do If Sheets("лист1").Cells(j, 1) = doc Then .Cells(i, 6) = Sheets("лист1").Cells(j, 3) f = False Exit Do End If j = j + 1 Loop Until Sheets("лист1").Cells(j, 1) = "" If f Then k = 2 Do If Sheets("лист2").Cells(k, 1) = doc Then .Cells(i, 6) = Sheets("лист2").Cells(k, 5) Exit Do End If k = k + 1 Loop Until Sheets("лист2").Cells(k, 1) = "" End If i = i + 1 Wend End With End Sub
я долго долго мучилась и не без помощи получилось вот так: может кому то поможет
Sub sdf()
With Sheets("свод") i = 3 While .Cells(i, 2) <> "" doc = .Cells(i, 2) j = 2 f = True Do If Sheets("лист1").Cells(j, 1) = doc Then .Cells(i, 6) = Sheets("лист1").Cells(j, 3) f = False Exit Do End If j = j + 1 Loop Until Sheets("лист1").Cells(j, 1) = "" If f Then k = 2 Do If Sheets("лист2").Cells(k, 1) = doc Then .Cells(i, 6) = Sheets("лист2").Cells(k, 5) Exit Do End If k = k + 1 Loop Until Sheets("лист2").Cells(k, 1) = "" End If i = i + 1 Wend End With End SubPonka
krosav4ig, интересное решение. Но на словаре было бы быстрее на больших объёмах. А зачем тут буфер использовать? Вполне можно без него: [vba]
Код
Sub sdf() Dim arr(), result(), i%, j&, r& Dim sh As Worksheet, rng As Range Set sh = ThisWorkbook.Worksheets("Свод") r = sh.Cells(sh.Rows.Count, 2).End(xlUp).Row arr() = sh.Range("B2:B" & r) ReDim result(1 To UBound(arr), 1 To 1) For i = 1 To 2 With ThisWorkbook.Worksheets("Лист" & i).Columns(1) For j = 1 To UBound(arr) Set rng = .Find(arr(j, 1), , xlValues, xlWhole) If Not rng Is Nothing Then result(j, 1) = result(j, 1) + rng.Offset(0, 2) End If Next End With Next sh.Range("D2").Resize(UBound(arr), 1) = result Erase arr, result End Sub
[/vba]
krosav4ig, интересное решение. Но на словаре было бы быстрее на больших объёмах. А зачем тут буфер использовать? Вполне можно без него: [vba]
Код
Sub sdf() Dim arr(), result(), i%, j&, r& Dim sh As Worksheet, rng As Range Set sh = ThisWorkbook.Worksheets("Свод") r = sh.Cells(sh.Rows.Count, 2).End(xlUp).Row arr() = sh.Range("B2:B" & r) ReDim result(1 To UBound(arr), 1 To 1) For i = 1 To 2 With ThisWorkbook.Worksheets("Лист" & i).Columns(1) For j = 1 To UBound(arr) Set rng = .Find(arr(j, 1), , xlValues, xlWhole) If Not rng Is Nothing Then result(j, 1) = result(j, 1) + rng.Offset(0, 2) End If Next End With Next sh.Range("D2").Resize(UBound(arr), 1) = result Erase arr, result End Sub