Всем привет. Я тут первый раз и нужна помощь в создании макроса. Есть файл с большим кол-вом товара его продажей и остатком, в котором нужно найти только определенный товар по списку из другого листа. Можно его либо выделять, либо просто переносить ниже. Макросы изучала давно еще в университете и помню как они отлично помогали в таких вопросах, но память старушка дает о себе знать и как это сделать я уже совсем не помню((( Буду рада помощи, очень! Пример файла приложила
Всем привет. Я тут первый раз и нужна помощь в создании макроса. Есть файл с большим кол-вом товара его продажей и остатком, в котором нужно найти только определенный товар по списку из другого листа. Можно его либо выделять, либо просто переносить ниже. Макросы изучала давно еще в университете и помню как они отлично помогали в таких вопросах, но память старушка дает о себе знать и как это сделать я уже совсем не помню((( Буду рада помощи, очень! Пример файла приложилаShumik916
Я нашла на форуме что-то похожее, применила к своей таблице и он выдал ниже списком наименование, но мне нужно, чтобы еще и столбец с остатком тоже вместе с наименованием выделялся [vba]
Код
Sub test() Dim sh1 As Worksheet, sh2 As Worksheet, x As Range, dic As Object Dim i&, lr&, iKey$ Set sh1 = ThisWorkbook.Sheets(1) Set sh2 = ThisWorkbook.Sheets(2) Set dic = CreateObject("scripting.dictionary") With sh1 For i = 2 To .Cells(Rows.Count, 2).End(xlUp).Row iKey = Trim(.Cells(i, "b") & "@" & .Cells(i, "c") & "@" & .Cells(i, "d")) dic(iKey) = i Next i End With With sh2 For i = 2 To .Cells(Rows.Count, 2).End(xlUp).Row iKey = Trim(.Cells(i, "b") & "@" & .Cells(i, "c") & "@" & .Cells(i, "d")) If dic.exists(iKey) Then sh1.Cells(dic(iKey), "e") = .Cells(i, "e") Else lr = sh1.Cells(Rows.Count, 2).End(xlUp).Row + 1 sh1.Cells(lr, "b") = .Cells(i, "b") sh1.Cells(lr, "c") = .Cells(i, "c") sh1.Cells(lr, "d") = .Cells(i, "d") sh1.Cells(lr, "e") = .Cells(i, "e") End If Next i End With End Sub
[/vba]
Я нашла на форуме что-то похожее, применила к своей таблице и он выдал ниже списком наименование, но мне нужно, чтобы еще и столбец с остатком тоже вместе с наименованием выделялся [vba]
Код
Sub test() Dim sh1 As Worksheet, sh2 As Worksheet, x As Range, dic As Object Dim i&, lr&, iKey$ Set sh1 = ThisWorkbook.Sheets(1) Set sh2 = ThisWorkbook.Sheets(2) Set dic = CreateObject("scripting.dictionary") With sh1 For i = 2 To .Cells(Rows.Count, 2).End(xlUp).Row iKey = Trim(.Cells(i, "b") & "@" & .Cells(i, "c") & "@" & .Cells(i, "d")) dic(iKey) = i Next i End With With sh2 For i = 2 To .Cells(Rows.Count, 2).End(xlUp).Row iKey = Trim(.Cells(i, "b") & "@" & .Cells(i, "c") & "@" & .Cells(i, "d")) If dic.exists(iKey) Then sh1.Cells(dic(iKey), "e") = .Cells(i, "e") Else lr = sh1.Cells(Rows.Count, 2).End(xlUp).Row + 1 sh1.Cells(lr, "b") = .Cells(i, "b") sh1.Cells(lr, "c") = .Cells(i, "c") sh1.Cells(lr, "d") = .Cells(i, "d") sh1.Cells(lr, "e") = .Cells(i, "e") End If Next i End With End Sub
А у Вас Excel какой? В профиле 2016, там можно. Можно еще в 2013 и в 2010 А в остальных версиях нужно импользовать именованный диапазон (Контрл F3). С той же формулой. Только когда будете создавать его, то сначала встаньте в ячейку А2 (А2 потому, что эта ячейка в формуле используется
А у Вас Excel какой? В профиле 2016, там можно. Можно еще в 2013 и в 2010 А в остальных версиях нужно импользовать именованный диапазон (Контрл F3). С той же формулой. Только когда будете создавать его, то сначала встаньте в ячейку А2 (А2 потому, что эта ячейка в формуле используется_Boroda_
Ага, а макросы - это лес светлее, чем именованные диапазоны . Вы файл смотрели из моего предыдущего сообщения? Если что-то конкретно не совсем понятно - спрашивайте, для того форум и сделан
Если все-таки есть непреодолимое желание помакросить, то вот [vba]
Код
Sub test() Application.ScreenUpdating = 0 Set sh2 = ThisWorkbook.Sheets(2) Set slov = CreateObject("scripting.dictionary") With slov For i = 2 To sh2.Cells(Rows.Count, 1).End(3).Row aaa = .Item(sh2.Cells(i, 1).Value & "") Next i r1_ = Cells(Rows.Count, 1).End(3).Row For i = 2 To r1_ If .exists(Cells(i, 1) & "") Then x_ = x_ + 1 Cells(i, 1).Resize(1, 4).Copy Cells(r1_ + x_ + 1, 1) End If Next i End With Application.ScreenUpdating = 1 End Sub
[/vba]
Ага, а макросы - это лес светлее, чем именованные диапазоны . Вы файл смотрели из моего предыдущего сообщения? Если что-то конкретно не совсем понятно - спрашивайте, для того форум и сделан
Если все-таки есть непреодолимое желание помакросить, то вот [vba]
Код
Sub test() Application.ScreenUpdating = 0 Set sh2 = ThisWorkbook.Sheets(2) Set slov = CreateObject("scripting.dictionary") With slov For i = 2 To sh2.Cells(Rows.Count, 1).End(3).Row aaa = .Item(sh2.Cells(i, 1).Value & "") Next i r1_ = Cells(Rows.Count, 1).End(3).Row For i = 2 To r1_ If .exists(Cells(i, 1) & "") Then x_ = x_ + 1 Cells(i, 1).Resize(1, 4).Copy Cells(r1_ + x_ + 1, 1) End If Next i End With Application.ScreenUpdating = 1 End Sub
_Boroda_, просто мне кажется макрос включил и вот тебе счастье, а тут у меня иксель не того года, формулы пиши, выделяй. А тут оп, и вы помогли, макрос написали. Но только теперь на мой большой объем товара он чет не работает.
_Boroda_, просто мне кажется макрос включил и вот тебе счастье, а тут у меня иксель не того года, формулы пиши, выделяй. А тут оп, и вы помогли, макрос написали. Но только теперь на мой большой объем товара он чет не работает.Shumik916
_Boroda_, вы знаете, а макрос по прошествию лет все-таки тоже темный лес )) ошибок нет, желтым не выделяет, просто не вижу после его включения сноски с нужным мне товаром.
А если я вставляю тот макрос, что кинула выше, который нашла, то он работает, но как и писала, не выдает так же остатка, а это важно.
_Boroda_, вы знаете, а макрос по прошествию лет все-таки тоже темный лес )) ошибок нет, желтым не выделяет, просто не вижу после его включения сноски с нужным мне товаром.
А если я вставляю тот макрос, что кинула выше, который нашла, то он работает, но как и писала, не выдает так же остатка, а это важно.Shumik916
Ну тогда наверное нужно посмотреть на кусок реального фалйла. Гнетут меня смутные сомнения, что у Вас там в артикулах (да, мы проверяем не по названию, а по артикулу, иначе зачем он вообще нужен?) или несовпадение, или лишние пробелы. Попробуйте так (если не получится, то покажите файла кусок) [vba]
Код
Sub test() Application.ScreenUpdating = 0 Set sh2 = ThisWorkbook.Sheets(2) Set slov = CreateObject("scripting.dictionary") With slov For i = 2 To sh2.Cells(Rows.Count, 1).End(3).Row aaa = Trim(.Item(sh2.Cells(i, 1).Value & "")) Next i r1_ = Cells(Rows.Count, 1).End(3).Row For i = 2 To r1_ If .exists(Trim(Cells(i, 1) & "")) Then x_ = x_ + 1 Cells(i, 1).Resize(1, 4).Copy Cells(r1_ + x_ + 1, 1) End If Next i End With Application.ScreenUpdating = 1 End Sub
[/vba]
Ну тогда наверное нужно посмотреть на кусок реального фалйла. Гнетут меня смутные сомнения, что у Вас там в артикулах (да, мы проверяем не по названию, а по артикулу, иначе зачем он вообще нужен?) или несовпадение, или лишние пробелы. Попробуйте так (если не получится, то покажите файла кусок) [vba]
Код
Sub test() Application.ScreenUpdating = 0 Set sh2 = ThisWorkbook.Sheets(2) Set slov = CreateObject("scripting.dictionary") With slov For i = 2 To sh2.Cells(Rows.Count, 1).End(3).Row aaa = Trim(.Item(sh2.Cells(i, 1).Value & "")) Next i r1_ = Cells(Rows.Count, 1).End(3).Row For i = 2 To r1_ If .exists(Trim(Cells(i, 1) & "")) Then x_ = x_ + 1 Cells(i, 1).Resize(1, 4).Copy Cells(r1_ + x_ + 1, 1) End If Next i End With Application.ScreenUpdating = 1 End Sub
_Boroda_, а мне нужно по названию именно, артикул просто вставляется автоматом у меня, извините, что я его и вам в образец пихнула, на автомате просто.
_Boroda_, а мне нужно по названию именно, артикул просто вставляется автоматом у меня, извините, что я его и вам в образец пихнула, на автомате просто.Shumik916
Sub test() Application.ScreenUpdating = 0 Set sh2 = ThisWorkbook.Sheets(2) Set slov = CreateObject("scripting.dictionary") With slov For i = 2 To sh2.Cells(Rows.Count, 2).End(3).Row aaa = Trim(.Item(sh2.Cells(i, 2).Value & "")) Next i r1_ = Cells(Rows.Count, 2).End(3).Row For i = 2 To r1_ If .exists(Trim(Cells(i, 2) & "")) Then x_ = x_ + 1 Cells(i, 1).Resize(1, 4).Copy Cells(r1_ + x_ + 1, 1) End If Next i End With Application.ScreenUpdating = 1 End Sub
[/vba]
Охохонюшки. Ловите [vba]
Код
Sub test() Application.ScreenUpdating = 0 Set sh2 = ThisWorkbook.Sheets(2) Set slov = CreateObject("scripting.dictionary") With slov For i = 2 To sh2.Cells(Rows.Count, 2).End(3).Row aaa = Trim(.Item(sh2.Cells(i, 2).Value & "")) Next i r1_ = Cells(Rows.Count, 2).End(3).Row For i = 2 To r1_ If .exists(Trim(Cells(i, 2) & "")) Then x_ = x_ + 1 Cells(i, 1).Resize(1, 4).Copy Cells(r1_ + x_ + 1, 1) End If Next i End With Application.ScreenUpdating = 1 End Sub
Sub SearchByList() '' Author: boa '' Written: 20.10.2017 '' Edited: ' Description: Берет данные из заданного диапазона искомых значений(Словаря) и сравнивает их со списком значений, ' если находит совпадения, то переносит все уникальные значения из заданного столбца ' и сопоставленное ему значение из Словаря в новую книгу.
Dim MyList As Range 'Список искомых значений Dim MyRange As Range 'Диапазон для поиска Dim SearchColumn As Integer 'колонка в которой ищем совпадения Dim ZnachColumn As Integer 'колонка из которой нужно вывести значения Dim iRow&, V$, Znach As Variant Dim strCaption$, strLabel$
On Error GoTo Proverka strCaption = "Поиск уникальных значений по списку" strLabel = "Введите ссылку на список значений которые надо найти(Словарь)." & vbCrLf & _ "Будут учитываться только видимы значения из выбранного диапазона." ' Debug.Print ActiveWorkbook.ActiveSheet.Selection.Address Set MyList = Application.InputBox(Prompt:=strLabel, Title:=strCaption, Type:=8) 'Default:=ActiveSheet.Selection.Address, strLabel = "Введите ссылку на диапазон содержащий искомые значения и колонку для сопоставления со Словарем." Set MyRange = Application.InputBox(Prompt:=strLabel, Title:=strCaption, Type:=8) If Not MyRange Is Nothing Then SearchColumn = MyRange.Columns.Count strLabel = "Введите номер колонки от 1 до " & SearchColumn & " в выбранном диапазоне, по которой должен быть произведен поиск значений из Словаря." '& vbCrLf & _ "В выделенном диапазоне " & SearchColumn & " колонок" SearchColumn = Application.InputBox(Prompt:=strLabel, Title:=strCaption, Default:=SearchColumn, Type:=1)
strLabel = "Введите номер колонки в массиве из которой надо вывести найденный результат." & vbCrLf & _ "Если номер колонки не вводить(нажать ""Отмена""), то в результат будет выведена вся строка из выделенного диапазона." ZnachColumn = Application.InputBox(Prompt:=strLabel, Title:=strCaption, Type:=1) ' Default:=0, Proverka: If MyList Is Nothing Or MyRange Is Nothing Or SearchColumn < 1 Then _ MsgBox "Не введены все обязательные параметры для поиска значений.", vbCritical, "": Exit Sub 'Or ZnachColumn < 1 Dim MeTime As Date, Start!, sMsg$ MeTime = Time Start! = Timer
Dim i&, a As Range, DicSearch As Object, Dic As Object
Set DicSearch = CreateObject("Scripting.Dictionary") Set Dic = CreateObject("Scripting.Dictionary") ' DicSearch.CompareMode = vbTextCompare ' Dic.CompareMode = vbTextCompare 'Что бы сделать ключи не чуствительными к регистру. _ ' vbBinaryCompare - по умолчанию. "File", "FILE" и "file" три разных ключа
On Error Resume Next For Each a In MyList 'Список искомых значений If a.Rows.Hidden = False Then DicSearch.Add CStr(a.Value), a.Value Next a
For i = 1 To MyRange.Rows.Count 'Список найденных значений If DicSearch.Exists(CStr(MyRange.Cells(i, SearchColumn).Value)) Then If ZnachColumn > 0 Then V = CStr(MyRange.Cells(i, ZnachColumn).Value) Else V = i Dic.Add V, CStr(MyRange.Cells(i, SearchColumn).Value) End If Next i
With Workbooks.Add(xlWBATWorksheet).Worksheets(1) 'вывод результатов .Cells(1, 1).Value = "Значения из списка" .Cells(1, 2).Value = "Найденные значение " & Dic.Count iRow = 2 If ZnachColumn > 0 Then .Range(.Cells(iRow, 1), .Cells(Dic.Count + 1, 2)).Value = Application.Transpose(Array(Dic.Items, Dic.Keys)) Else .Range(.Cells(iRow, 1), .Cells(Dic.Count + 1, 1)).Value = Application.Transpose(Array(Dic.Items)) For Each Znach In Dic .Range(.Cells(iRow, 2), .Cells(iRow, MyRange.Columns.Count + 1)).Value = MyRange.Rows(Znach).Value iRow = iRow + 1 Next End If .UsedRange.EntireColumn.AutoFit End With
Sub SearchByList() '' Author: boa '' Written: 20.10.2017 '' Edited: ' Description: Берет данные из заданного диапазона искомых значений(Словаря) и сравнивает их со списком значений, ' если находит совпадения, то переносит все уникальные значения из заданного столбца ' и сопоставленное ему значение из Словаря в новую книгу.
Dim MyList As Range 'Список искомых значений Dim MyRange As Range 'Диапазон для поиска Dim SearchColumn As Integer 'колонка в которой ищем совпадения Dim ZnachColumn As Integer 'колонка из которой нужно вывести значения Dim iRow&, V$, Znach As Variant Dim strCaption$, strLabel$
On Error GoTo Proverka strCaption = "Поиск уникальных значений по списку" strLabel = "Введите ссылку на список значений которые надо найти(Словарь)." & vbCrLf & _ "Будут учитываться только видимы значения из выбранного диапазона." ' Debug.Print ActiveWorkbook.ActiveSheet.Selection.Address Set MyList = Application.InputBox(Prompt:=strLabel, Title:=strCaption, Type:=8) 'Default:=ActiveSheet.Selection.Address, strLabel = "Введите ссылку на диапазон содержащий искомые значения и колонку для сопоставления со Словарем." Set MyRange = Application.InputBox(Prompt:=strLabel, Title:=strCaption, Type:=8) If Not MyRange Is Nothing Then SearchColumn = MyRange.Columns.Count strLabel = "Введите номер колонки от 1 до " & SearchColumn & " в выбранном диапазоне, по которой должен быть произведен поиск значений из Словаря." '& vbCrLf & _ "В выделенном диапазоне " & SearchColumn & " колонок" SearchColumn = Application.InputBox(Prompt:=strLabel, Title:=strCaption, Default:=SearchColumn, Type:=1)
strLabel = "Введите номер колонки в массиве из которой надо вывести найденный результат." & vbCrLf & _ "Если номер колонки не вводить(нажать ""Отмена""), то в результат будет выведена вся строка из выделенного диапазона." ZnachColumn = Application.InputBox(Prompt:=strLabel, Title:=strCaption, Type:=1) ' Default:=0, Proverka: If MyList Is Nothing Or MyRange Is Nothing Or SearchColumn < 1 Then _ MsgBox "Не введены все обязательные параметры для поиска значений.", vbCritical, "": Exit Sub 'Or ZnachColumn < 1 Dim MeTime As Date, Start!, sMsg$ MeTime = Time Start! = Timer
Dim i&, a As Range, DicSearch As Object, Dic As Object
Set DicSearch = CreateObject("Scripting.Dictionary") Set Dic = CreateObject("Scripting.Dictionary") ' DicSearch.CompareMode = vbTextCompare ' Dic.CompareMode = vbTextCompare 'Что бы сделать ключи не чуствительными к регистру. _ ' vbBinaryCompare - по умолчанию. "File", "FILE" и "file" три разных ключа
On Error Resume Next For Each a In MyList 'Список искомых значений If a.Rows.Hidden = False Then DicSearch.Add CStr(a.Value), a.Value Next a
For i = 1 To MyRange.Rows.Count 'Список найденных значений If DicSearch.Exists(CStr(MyRange.Cells(i, SearchColumn).Value)) Then If ZnachColumn > 0 Then V = CStr(MyRange.Cells(i, ZnachColumn).Value) Else V = i Dic.Add V, CStr(MyRange.Cells(i, SearchColumn).Value) End If Next i
With Workbooks.Add(xlWBATWorksheet).Worksheets(1) 'вывод результатов .Cells(1, 1).Value = "Значения из списка" .Cells(1, 2).Value = "Найденные значение " & Dic.Count iRow = 2 If ZnachColumn > 0 Then .Range(.Cells(iRow, 1), .Cells(Dic.Count + 1, 2)).Value = Application.Transpose(Array(Dic.Items, Dic.Keys)) Else .Range(.Cells(iRow, 1), .Cells(Dic.Count + 1, 1)).Value = Application.Transpose(Array(Dic.Items)) For Each Znach In Dic .Range(.Cells(iRow, 2), .Cells(iRow, MyRange.Columns.Count + 1)).Value = MyRange.Rows(Znach).Value iRow = iRow + 1 Next End If .UsedRange.EntireColumn.AutoFit End With