Добрый день! Подскажите, пожалуйста, вот с помощью следующего кода, я ВПРю данные:
[vba]
Код
Sub ВПР_с_через_СЛОВАРЬ() 'Очень важно! запуск макроса начинать из файла, куда будем записывать данные Dim Artikuli() As String Dim Tablica2 As Range Dim Artikul As Range Dim Artikul_column As Long, Artikul2_column As Long, Iskomoe_znachenie_column As Long Dim Nomer_stolbca As Integer Dim Nomer_stolbca1 As Range Dim s As Integer Dim Artikuli_ As String Dim tablica As Object Dim Tablica_ As String Dim Udalit As String Dim i_n As Long, i2_n As Long, x As Long, n As String Dim key As String Dim ActWB As Workbook Set ActWB = ActiveWorkbook Set tablica = CreateObject("Scripting.Dictionary") 'udalit = 0 ' = 1 если надо удалять в артикулах доп символы и необращать на них внимание ' и = 0 если не надо этого делать. Set Artikul = Application.InputBox("Укажите столбец-Идентификатор в вашей таблице" & Chr(13) & _ "Важно, чтобы макрос был запущен из файла и листа, куда мы будем записывать данные", "Идентификатор", Type:=8) Set Nomer_stolbca1 = Application.InputBox("Укажите столбец, куда необходимо вывести данные", "Столбец-вывода", Artikul.Worksheet.name & "!A1", Type:=8) Nomer_stolbca = Nomer_stolbca1.Column Artikul_column = Artikul.Column i_n = Cells(Rows.Count, Artikul_column).End(xlUp).Row Set Tablica2 = Application.InputBox("Укажите столбцы таблицы-исходника", "Таблица-исходник", Type:=8) Udalit = Application.InputBox("Необходимо ли модифицировать Идентификатор (удалять служебные символы)" _ & Chr(13) & "Оставьте как есть, если надо или измените (на что угодно)", "Удаление Идентификатора", "1")
Iskomoe_znachenie_column = 1 Artikul2_column = 1 For col = 1 To Tablica2.Columns.Count If col > Iskomoe_znachenie_column Then Iskomoe_znachenie_column = col End If Next col i2_n = Tablica2.Cells(Tablica2.Rows.Count, Artikul2_column).End(xlUp).Row ReDim Artikuli(i_n) Application.ScreenUpdating = False For i = 1 To i_n Artikuli(i) = Artikul.Worksheet.Cells(i, Artikul_column) Next i '_________________________________ модуль поиска артикула с удалением части в скобках или после "_" конец If Udalit = 1 Then For i = 1 To i_n For s = 1 To Len(Artikuli(i)) If Mid(Artikuli(i), s, 1) Like "[(_]" = True Then Exit For Else Artikuli_ = Artikuli_ & Mid(Artikuli(i), s, 1) End If Next s Artikuli(i) = Artikuli_ Artikuli_ = "" Next i End If '_________________________________ модуль поиска артикула с удалением части в скобках или после "_" конец i2_s = IIf(IsEmpty(Tablica2.Cells(1, Artikul2_column)), (Tablica2.Cells(1, Artikul2_column).End(xlDown).Row), 1) For i2 = i2_s To i2_n key = Tablica2.Cells(i2, Artikul2_column) If Not tablica.exists(key) Then tablica.Add key, Tablica2.Cells(i2, Iskomoe_znachenie_column) End If Next i2 For i = 1 To i_n n = 0 If tablica.exists(Artikuli(i)) Then Nomer_stolbca1.Worksheet.Cells(i, Nomer_stolbca) = tablica.Item(Artikuli(i)) End If If Not tablica.exists(Artikuli(i)) Then For x = 1 To 4 If tablica.exists(n & Artikuli(i)) Then: Exit For n = n & "0" Next x Nomer_stolbca1.Worksheet.Cells(i, Nomer_stolbca) = tablica.Item(n & Artikuli(i)) End If Next i Application.ScreenUpdating = True Application.Windows(ActWB.name).Activate End Sub
[/vba]
Запускаю из той книги, в которой у меня есть "Идетификатор" и куда мне нужно по нему получить данные из таблицы (в другой книге). Далее выбираю файл с данными, откуда я переношу информацию в свой файл, выделяю там диапазон от столбца-идетификатора до столбца искомой информации. В общем, хочу, чтобы после отработки кода, выделялась книга, из которой я его запустил. А у меня получается остаётся выделенной книга, в которой я выделял столбцы последними.
Добрый день! Подскажите, пожалуйста, вот с помощью следующего кода, я ВПРю данные:
[vba]
Код
Sub ВПР_с_через_СЛОВАРЬ() 'Очень важно! запуск макроса начинать из файла, куда будем записывать данные Dim Artikuli() As String Dim Tablica2 As Range Dim Artikul As Range Dim Artikul_column As Long, Artikul2_column As Long, Iskomoe_znachenie_column As Long Dim Nomer_stolbca As Integer Dim Nomer_stolbca1 As Range Dim s As Integer Dim Artikuli_ As String Dim tablica As Object Dim Tablica_ As String Dim Udalit As String Dim i_n As Long, i2_n As Long, x As Long, n As String Dim key As String Dim ActWB As Workbook Set ActWB = ActiveWorkbook Set tablica = CreateObject("Scripting.Dictionary") 'udalit = 0 ' = 1 если надо удалять в артикулах доп символы и необращать на них внимание ' и = 0 если не надо этого делать. Set Artikul = Application.InputBox("Укажите столбец-Идентификатор в вашей таблице" & Chr(13) & _ "Важно, чтобы макрос был запущен из файла и листа, куда мы будем записывать данные", "Идентификатор", Type:=8) Set Nomer_stolbca1 = Application.InputBox("Укажите столбец, куда необходимо вывести данные", "Столбец-вывода", Artikul.Worksheet.name & "!A1", Type:=8) Nomer_stolbca = Nomer_stolbca1.Column Artikul_column = Artikul.Column i_n = Cells(Rows.Count, Artikul_column).End(xlUp).Row Set Tablica2 = Application.InputBox("Укажите столбцы таблицы-исходника", "Таблица-исходник", Type:=8) Udalit = Application.InputBox("Необходимо ли модифицировать Идентификатор (удалять служебные символы)" _ & Chr(13) & "Оставьте как есть, если надо или измените (на что угодно)", "Удаление Идентификатора", "1")
Iskomoe_znachenie_column = 1 Artikul2_column = 1 For col = 1 To Tablica2.Columns.Count If col > Iskomoe_znachenie_column Then Iskomoe_znachenie_column = col End If Next col i2_n = Tablica2.Cells(Tablica2.Rows.Count, Artikul2_column).End(xlUp).Row ReDim Artikuli(i_n) Application.ScreenUpdating = False For i = 1 To i_n Artikuli(i) = Artikul.Worksheet.Cells(i, Artikul_column) Next i '_________________________________ модуль поиска артикула с удалением части в скобках или после "_" конец If Udalit = 1 Then For i = 1 To i_n For s = 1 To Len(Artikuli(i)) If Mid(Artikuli(i), s, 1) Like "[(_]" = True Then Exit For Else Artikuli_ = Artikuli_ & Mid(Artikuli(i), s, 1) End If Next s Artikuli(i) = Artikuli_ Artikuli_ = "" Next i End If '_________________________________ модуль поиска артикула с удалением части в скобках или после "_" конец i2_s = IIf(IsEmpty(Tablica2.Cells(1, Artikul2_column)), (Tablica2.Cells(1, Artikul2_column).End(xlDown).Row), 1) For i2 = i2_s To i2_n key = Tablica2.Cells(i2, Artikul2_column) If Not tablica.exists(key) Then tablica.Add key, Tablica2.Cells(i2, Iskomoe_znachenie_column) End If Next i2 For i = 1 To i_n n = 0 If tablica.exists(Artikuli(i)) Then Nomer_stolbca1.Worksheet.Cells(i, Nomer_stolbca) = tablica.Item(Artikuli(i)) End If If Not tablica.exists(Artikuli(i)) Then For x = 1 To 4 If tablica.exists(n & Artikuli(i)) Then: Exit For n = n & "0" Next x Nomer_stolbca1.Worksheet.Cells(i, Nomer_stolbca) = tablica.Item(n & Artikuli(i)) End If Next i Application.ScreenUpdating = True Application.Windows(ActWB.name).Activate End Sub
[/vba]
Запускаю из той книги, в которой у меня есть "Идетификатор" и куда мне нужно по нему получить данные из таблицы (в другой книге). Далее выбираю файл с данными, откуда я переношу информацию в свой файл, выделяю там диапазон от столбца-идетификатора до столбца искомой информации. В общем, хочу, чтобы после отработки кода, выделялась книга, из которой я его запустил. А у меня получается остаётся выделенной книга, в которой я выделял столбцы последними.Roman777
Udalit = Application.InputBox("Необходимо ли модифицировать Идентификатор (удалять служебные символы)" _ & Chr(13) & "Оставьте как есть, если надо или измените (на что угодно)", "Удаление Идентификатора", "1")
[/vba] нажимаю "ОК" выделяется кратковременно нужная книга, но когда отпускаю кнопку "ОК", почему-то обратно возвращает на книгу с данными, а не на ту что мне нужно.
Manyasha, пробую. Когда выскакивает окошко [vba]
Код
Udalit = Application.InputBox("Необходимо ли модифицировать Идентификатор (удалять служебные символы)" _ & Chr(13) & "Оставьте как есть, если надо или измените (на что угодно)", "Удаление Идентификатора", "1")
[/vba] нажимаю "ОК" выделяется кратковременно нужная книга, но когда отпускаю кнопку "ОК", почему-то обратно возвращает на книгу с данными, а не на ту что мне нужно.Roman777
Set ActWB = ActiveWorkbook ... Application.Windows(ActWB.name).Activate
[/vba] У меня остается активной та книга, из которой я запустила макрос. Неважно, гда я выбираю данные, хоть во все инпуты пихаю разные источники, все равно потом активируется книга, где я запустила макрос. У Вас не так или я чего-то не поняла?
Проглядела, у Вас уже есть [vba]
Код
Set ActWB = ActiveWorkbook ... Application.Windows(ActWB.name).Activate
[/vba] У меня остается активной та книга, из которой я запустила макрос. Неважно, гда я выбираю данные, хоть во все инпуты пихаю разные источники, все равно потом активируется книга, где я запустила макрос. У Вас не так или я чего-то не поняла?Manyasha
Manyasha, я правильно понял, что у Вас и без изменений, мой макрос отработал так как вы описали? У меня и в моём макросе, и с изменениями, как вы предлагали, всегда после отрабатывания макроса, активным окно остаётся именно второго файла, не из которого я запускаю(
Manyasha, я правильно понял, что у Вас и без изменений, мой макрос отработал так как вы описали? У меня и в моём макросе, и с изменениями, как вы предлагали, всегда после отрабатывания макроса, активным окно остаётся именно второго файла, не из которого я запускаю(Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Пятница, 04.09.2015, 14:00
Да Может у Вас есть еще какие-то макросы, например на изменение листа, и там активируется другая книга? Попробуйте поставить брэйкпоинт на последнюю строчку макроса, активируется нужная книга? Если да, то дальше по f8 пройдитесь, что будет происходить? На каком моменте активируется "ненужная" книга?
Да Может у Вас есть еще какие-то макросы, например на изменение листа, и там активируется другая книга? Попробуйте поставить брэйкпоинт на последнюю строчку макроса, активируется нужная книга? Если да, то дальше по f8 пройдитесь, что будет происходить? На каком моменте активируется "ненужная" книга?Manyasha
Manyasha, к сожалению проблема остаётся... вставил так:
[vba]
Код
Sub ВПР_с_через_СЛОВАРЬ() 'Очень важно! запуск макроса начинать из файла, куда будем записывать данные Dim Artikuli() As String Dim Tablica2 As Range Dim Artikul As Range Dim Artikul_column As Long, Artikul2_column As Long, Iskomoe_znachenie_column As Long Dim Nomer_stolbca As Integer Dim Nomer_stolbca1 As Range Dim s As Integer Dim Artikuli_ As String Dim tablica As Object Dim Tablica_ As String Dim Udalit As String Dim i_n As Long, i2_n As Long, x As Long, n As String Dim key As String Set tablica = CreateObject("Scripting.Dictionary") Application.EnableEvents = False 'udalit = 0 ' = 1 если надо удалять в артикулах доп символы и необращать на них внимание ' и = 0 если не надо этого делать. Set Artikul = Application.InputBox("Укажите столбец-Идентификатор в вашей таблице" & Chr(13) & _ "Важно, чтобы макрос был запущен из файла и листа, куда мы будем записывать данные", "Идентификатор", Type:=8) Set Nomer_stolbca1 = Application.InputBox("Укажите столбец, куда необходимо вывести данные", "Столбец-вывода", Artikul.Worksheet.name & "!A1", Type:=8) Nomer_stolbca = Nomer_stolbca1.Column Artikul_column = Artikul.Column i_n = Cells(Rows.Count, Artikul_column).End(xlUp).Row Set Tablica2 = Application.InputBox("Укажите столбцы таблицы-исходника", "Таблица-исходник", Type:=8) Udalit = Application.InputBox("Необходимо ли модифицировать Идентификатор (удалять служебные символы)" _ & Chr(13) & "Оставьте как есть, если надо или измените (на что угодно)", "Удаление Идентификатора", "1") Iskomoe_znachenie_column = 1 Artikul2_column = 1 For col = 1 To Tablica2.Columns.Count If col > Iskomoe_znachenie_column Then Iskomoe_znachenie_column = col End If Next col i2_n = Tablica2.Cells(Tablica2.Rows.Count, Artikul2_column).End(xlUp).Row ReDim Artikuli(i_n) Application.ScreenUpdating = False For i = 1 To i_n Artikuli(i) = Artikul.Worksheet.Cells(i, Artikul_column) Next i '_________________________________ модуль поиска артикула с удалением части в скобках или после "_" конец If Udalit = 1 Then For i = 1 To i_n For s = 1 To Len(Artikuli(i)) If Mid(Artikuli(i), s, 1) Like "[(_]" = True Then Exit For Else Artikuli_ = Artikuli_ & Mid(Artikuli(i), s, 1) End If Next s Artikuli(i) = Artikuli_ Artikuli_ = "" Next i End If '_________________________________ модуль поиска артикула с удалением части в скобках или после "_" конец i2_s = IIf(IsEmpty(Tablica2.Cells(1, Artikul2_column)), (Tablica2.Cells(1, Artikul2_column).End(xlDown).Row), 1) For i2 = i2_s To i2_n key = Tablica2.Cells(i2, Artikul2_column) If Not tablica.exists(key) Then tablica.Add key, Tablica2.Cells(i2, Iskomoe_znachenie_column) End If Next i2 For i = 1 To i_n n = 0 If tablica.exists(Artikuli(i)) Then Nomer_stolbca1.Worksheet.Cells(i, Nomer_stolbca) = tablica.Item(Artikuli(i)) End If If Not tablica.exists(Artikuli(i)) Then For x = 1 To 4 If tablica.exists(n & Artikuli(i)) Then: Exit For n = n & "0" Next x Nomer_stolbca1.Worksheet.Cells(i, Nomer_stolbca) = tablica.Item(n & Artikuli(i)) End If Next i Application.ScreenUpdating = True Artikul.Parent.Parent.Activate Application.EnableEvents = True End Sub
[/vba]
Manyasha, к сожалению проблема остаётся... вставил так:
[vba]
Код
Sub ВПР_с_через_СЛОВАРЬ() 'Очень важно! запуск макроса начинать из файла, куда будем записывать данные Dim Artikuli() As String Dim Tablica2 As Range Dim Artikul As Range Dim Artikul_column As Long, Artikul2_column As Long, Iskomoe_znachenie_column As Long Dim Nomer_stolbca As Integer Dim Nomer_stolbca1 As Range Dim s As Integer Dim Artikuli_ As String Dim tablica As Object Dim Tablica_ As String Dim Udalit As String Dim i_n As Long, i2_n As Long, x As Long, n As String Dim key As String Set tablica = CreateObject("Scripting.Dictionary") Application.EnableEvents = False 'udalit = 0 ' = 1 если надо удалять в артикулах доп символы и необращать на них внимание ' и = 0 если не надо этого делать. Set Artikul = Application.InputBox("Укажите столбец-Идентификатор в вашей таблице" & Chr(13) & _ "Важно, чтобы макрос был запущен из файла и листа, куда мы будем записывать данные", "Идентификатор", Type:=8) Set Nomer_stolbca1 = Application.InputBox("Укажите столбец, куда необходимо вывести данные", "Столбец-вывода", Artikul.Worksheet.name & "!A1", Type:=8) Nomer_stolbca = Nomer_stolbca1.Column Artikul_column = Artikul.Column i_n = Cells(Rows.Count, Artikul_column).End(xlUp).Row Set Tablica2 = Application.InputBox("Укажите столбцы таблицы-исходника", "Таблица-исходник", Type:=8) Udalit = Application.InputBox("Необходимо ли модифицировать Идентификатор (удалять служебные символы)" _ & Chr(13) & "Оставьте как есть, если надо или измените (на что угодно)", "Удаление Идентификатора", "1") Iskomoe_znachenie_column = 1 Artikul2_column = 1 For col = 1 To Tablica2.Columns.Count If col > Iskomoe_znachenie_column Then Iskomoe_znachenie_column = col End If Next col i2_n = Tablica2.Cells(Tablica2.Rows.Count, Artikul2_column).End(xlUp).Row ReDim Artikuli(i_n) Application.ScreenUpdating = False For i = 1 To i_n Artikuli(i) = Artikul.Worksheet.Cells(i, Artikul_column) Next i '_________________________________ модуль поиска артикула с удалением части в скобках или после "_" конец If Udalit = 1 Then For i = 1 To i_n For s = 1 To Len(Artikuli(i)) If Mid(Artikuli(i), s, 1) Like "[(_]" = True Then Exit For Else Artikuli_ = Artikuli_ & Mid(Artikuli(i), s, 1) End If Next s Artikuli(i) = Artikuli_ Artikuli_ = "" Next i End If '_________________________________ модуль поиска артикула с удалением части в скобках или после "_" конец i2_s = IIf(IsEmpty(Tablica2.Cells(1, Artikul2_column)), (Tablica2.Cells(1, Artikul2_column).End(xlDown).Row), 1) For i2 = i2_s To i2_n key = Tablica2.Cells(i2, Artikul2_column) If Not tablica.exists(key) Then tablica.Add key, Tablica2.Cells(i2, Iskomoe_znachenie_column) End If Next i2 For i = 1 To i_n n = 0 If tablica.exists(Artikuli(i)) Then Nomer_stolbca1.Worksheet.Cells(i, Nomer_stolbca) = tablica.Item(Artikuli(i)) End If If Not tablica.exists(Artikuli(i)) Then For x = 1 To 4 If tablica.exists(n & Artikuli(i)) Then: Exit For n = n & "0" Next x Nomer_stolbca1.Worksheet.Cells(i, Nomer_stolbca) = tablica.Item(n & Artikuli(i)) End If Next i Application.ScreenUpdating = True Artikul.Parent.Parent.Activate Application.EnableEvents = True End Sub
Sub Proverka() Dim A As Range Dim B As Range Application.EnableEvents = False Set A = Application.InputBox("A", "A-A", Type:=8) Set B = Application.InputBox("B", "B-B", Type:=8) MsgBox (A.Parent.Parent.name) MsgBox (B.Parent.Parent.name) A.Parent.Parent.Activate Application.EnableEvents = True End Sub
[/vba] Точно так же не отрабатывает... активным остаётся вторая книга, не из которой был запущен макрос (запускаю макрос, выбираю любую ячейку книги, из которого запустил макрос, далее перехожу во вторую книгу и там выделяю тоже любую ячейку, после отрабатывания кода, активным остаётся окно второй книги, хотя сообщения msgbox верно выводят информацию)
Создал простой проверочный код: [vba]
Код
Sub Proverka() Dim A As Range Dim B As Range Application.EnableEvents = False Set A = Application.InputBox("A", "A-A", Type:=8) Set B = Application.InputBox("B", "B-B", Type:=8) MsgBox (A.Parent.Parent.name) MsgBox (B.Parent.Parent.name) A.Parent.Parent.Activate Application.EnableEvents = True End Sub
[/vba] Точно так же не отрабатывает... активным остаётся вторая книга, не из которой был запущен макрос (запускаю макрос, выбираю любую ячейку книги, из которого запустил макрос, далее перехожу во вторую книгу и там выделяю тоже любую ячейку, после отрабатывания кода, активным остаётся окно второй книги, хотя сообщения msgbox верно выводят информацию)Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Пятница, 04.09.2015, 15:08
Manyasha, не пойму... вот упрощённый код из 13 сообщения при обычном запуске не оставляет активным книгу из которой инициирую макрос, а когда F8 прошёлся, то отработал всё как надо ... кроме того, мой изначальный макрос (ВПР) таким методом тоже отработал как надо...
Manyasha, не пойму... вот упрощённый код из 13 сообщения при обычном запуске не оставляет активным книгу из которой инициирую макрос, а когда F8 прошёлся, то отработал всё как надо ... кроме того, мой изначальный макрос (ВПР) таким методом тоже отработал как надо...Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Пятница, 04.09.2015, 15:16
А если скопировать этот макрос в новую книгу и закрыть personal, как макрос отработает? (2-я книга, к которой обращаетесь пусть тоже новая будет)
Roman777, файл можете сюда выложить?
А если скопировать этот макрос в новую книгу и закрыть personal, как макрос отработает? (2-я книга, к которой обращаетесь пусть тоже новая будет)Manyasha
nilem, так и нужно, макрос отрабатывая, должен активировать окно книги той из которой был запущен. Я пока не понял в чём проблема, но у меня во всех перечисленных тут случаях активным остаётся вторая книга, которую в процессе выскакивания сообщения "Set B = Application.InputBox("B", "B-B", Type:=8)" я выбираю, чтобы указать область. Если перехожу в пошаговый режим и с помощью "F8" отрабатываю макрос, он делает всё и на последнем шаге "A.Parent.Parent.Activate" активирует окно той книги из которой был запущен. Получается при обычном запуске макроса, он словно бы даже не видит A.Parent.Parent.Activate, а когда жамкаю "F8" всё чётко...
nilem, так и нужно, макрос отрабатывая, должен активировать окно книги той из которой был запущен. Я пока не понял в чём проблема, но у меня во всех перечисленных тут случаях активным остаётся вторая книга, которую в процессе выскакивания сообщения "Set B = Application.InputBox("B", "B-B", Type:=8)" я выбираю, чтобы указать область. Если перехожу в пошаговый режим и с помощью "F8" отрабатываю макрос, он делает всё и на последнем шаге "A.Parent.Parent.Activate" активирует окно той книги из которой был запущен. Получается при обычном запуске макроса, он словно бы даже не видит A.Parent.Parent.Activate, а когда жамкаю "F8" всё чётко...Roman777
nilem, Ваши оба макроса сработали и при обычном запуске, я пока не понял что-то принципиальной разницы с остальными... разница в том, что у Вас прописана автоматическая активация другой книги после выбора области в первой? Всё же разница не велика, почему же тогда этот макрос не работает в обычном запуске как надо?
[vba]
Код
Sub Proverka() Dim A As Range Dim B As Range Application.EnableEvents = False Set A = Application.InputBox("A", "A-A", Type:=8) Set B = Application.InputBox("B", "B-B", Type:=8) MsgBox (A.Parent.Parent.name) MsgBox (B.Parent.Parent.name) A.Parent.Parent.Activate Application.EnableEvents = True End Sub
[/vba]
nilem, Ваши оба макроса сработали и при обычном запуске, я пока не понял что-то принципиальной разницы с остальными... разница в том, что у Вас прописана автоматическая активация другой книги после выбора области в первой? Всё же разница не велика, почему же тогда этот макрос не работает в обычном запуске как надо?
[vba]
Код
Sub Proverka() Dim A As Range Dim B As Range Application.EnableEvents = False Set A = Application.InputBox("A", "A-A", Type:=8) Set B = Application.InputBox("B", "B-B", Type:=8) MsgBox (A.Parent.Parent.name) MsgBox (B.Parent.Parent.name) A.Parent.Parent.Activate Application.EnableEvents = True End Sub
Попробуйте этот код - я добавил процедуру выбора другой книги со списка...
[vba]
Код
Sub ВПР_с_через_СЛОВАРЬ() 'Очень важно! запуск макроса начинать из файла, куда будем записывать данные Dim Artikuli() As String Dim Tablica2 As Range Dim Artikul As Range Dim Artikul_column As Long, Artikul2_column As Long, Iskomoe_znachenie_column As Long Dim Nomer_stolbca As Integer Dim Nomer_stolbca1 As Range Dim s As Integer Dim Artikuli_ As String Dim tablica As Object Dim Tablica_ As String Dim Udalit As String Dim i_n As Long, i2_n As Long, x As Long, n As String Dim key As String Dim ActWB As Workbook, ash As Worksheet, WB As Workbook Set ActWB = ActiveWorkbook
'udalit = 0 ' = 1 если надо удалять в артикулах доп символы и необращать на них внимание ' и = 0 если не надо этого делать. Set Artikul = Application.InputBox("Укажите столбец-Идентификатор в вашей таблице" & Chr(13) & _ "Важно, чтобы макрос был запущен из файла и листа, куда мы будем записывать данные", "Идентификатор", Type:=8) If Artikul Is Nothing Then Exit Sub Set ash = Artikul.Worksheet
Set Nomer_stolbca1 = Application.InputBox("Укажите столбец, куда необходимо вывести данные", "Столбец-вывода", Artikul.Offset(0, 1).Address, Type:=8) Nomer_stolbca = Nomer_stolbca1.Column Artikul_column = Artikul.Column i_n = Cells(Rows.Count, Artikul_column).End(xlUp).Row
Set WB = GetAnotherWorkbook WB.Activate
Set Tablica2 = Application.InputBox("Укажите столбцы таблицы-исходника", "Таблица-исходник", Type:=8) If Tablica2 Is Nothing Then Exit Sub
Set tablica = CreateObject("Scripting.Dictionary") Udalit = Application.InputBox("Необходимо ли модифицировать Идентификатор (удалять служебные символы)" _ & Chr(13) & "Оставьте как есть, если надо или измените (на что угодно)", "Удаление Идентификатора", "1") Iskomoe_znachenie_column = 1 Artikul2_column = 1 For col = 1 To Tablica2.Columns.Count If col > Iskomoe_znachenie_column Then Iskomoe_znachenie_column = col End If Next col i2_n = Tablica2.Cells(Tablica2.Rows.Count, Artikul2_column).End(xlUp).Row ReDim Artikuli(i_n) Application.ScreenUpdating = False For i = 1 To i_n Artikuli(i) = Artikul.Worksheet.Cells(i, Artikul_column) Next i '_________________________________ модуль поиска артикула с удалением части в скобках или после "_" конец If Udalit = 1 Then For i = 1 To i_n For s = 1 To Len(Artikuli(i)) If Mid(Artikuli(i), s, 1) Like "[(_]" = True Then Exit For Else Artikuli_ = Artikuli_ & Mid(Artikuli(i), s, 1) End If Next s Artikuli(i) = Artikuli_ Artikuli_ = "" Next i End If '_________________________________ модуль поиска артикула с удалением части в скобках или после "_" конец i2_s = IIf(IsEmpty(Tablica2.Cells(1, Artikul2_column)), (Tablica2.Cells(1, Artikul2_column).End(xlDown).Row), 1) For i2 = i2_s To i2_n key = Tablica2.Cells(i2, Artikul2_column) If Not tablica.Exists(key) Then tablica.Add key, Tablica2.Cells(i2, Iskomoe_znachenie_column) End If Next i2 For i = 1 To i_n n = 0 If tablica.Exists(Artikuli(i)) Then Nomer_stolbca1.Worksheet.Cells(i, Nomer_stolbca) = tablica.Item(Artikuli(i)) End If If Not tablica.Exists(Artikuli(i)) Then For x = 1 To 4 If tablica.Exists(n & Artikuli(i)) Then: Exit For n = n & "0" Next x Nomer_stolbca1.Worksheet.Cells(i, Nomer_stolbca) = tablica.Item(n & Artikuli(i)) End If Next i Application.ScreenUpdating = True Application.Windows(ActWB.Name).Activate End Sub
Private Function GetAnotherWorkbook() As Workbook ' если в данный момент открыто 2 книги, функция возвратит вторую открытую книгу ' если помимо текущей, открыто более одной книги - будет предоставлен выбор On Error Resume Next Dim coll As New Collection, WB As Workbook For Each WB In Workbooks 'If WB.Name <> ThisWorkbook.Name Then If Windows(WB.Name).Visible Then coll.Add CStr(WB.Name) ' End If Next WB Select Case coll.Count Case 0 ' нет других открытых книг MsgBox "Нет других открытых книг", vbCritical, "Function GetAnotherWorkbook" Case 1 ' открыта ещё только одна книга - её и возвращаем Set GetAnotherWorkbook = Workbooks(coll(1)) Case Else ' открыто несколько книг - предоставляем выбор For i = 1 To coll.Count txt = txt & i & vbTab & coll(i) & vbNewLine If coll(i) = ActiveWorkbook.Name Then n = i Next i msg = "Выберите одну из открытых книг, и введите её порядковый номер:" & _ vbNewLine & vbNewLine & txt res = InputBox(msg, "Открыто более двух книг", n) If IsNumeric(res) Then Set GetAnotherWorkbook = Workbooks(coll(Val(res))) End Select End Function
[/vba]
Странно - с этой процедурой - потом возвращается в 1-ю книгу без нее - нет Наверно это очередной баг 2013-го офиса
Попробуйте этот код - я добавил процедуру выбора другой книги со списка...
[vba]
Код
Sub ВПР_с_через_СЛОВАРЬ() 'Очень важно! запуск макроса начинать из файла, куда будем записывать данные Dim Artikuli() As String Dim Tablica2 As Range Dim Artikul As Range Dim Artikul_column As Long, Artikul2_column As Long, Iskomoe_znachenie_column As Long Dim Nomer_stolbca As Integer Dim Nomer_stolbca1 As Range Dim s As Integer Dim Artikuli_ As String Dim tablica As Object Dim Tablica_ As String Dim Udalit As String Dim i_n As Long, i2_n As Long, x As Long, n As String Dim key As String Dim ActWB As Workbook, ash As Worksheet, WB As Workbook Set ActWB = ActiveWorkbook
'udalit = 0 ' = 1 если надо удалять в артикулах доп символы и необращать на них внимание ' и = 0 если не надо этого делать. Set Artikul = Application.InputBox("Укажите столбец-Идентификатор в вашей таблице" & Chr(13) & _ "Важно, чтобы макрос был запущен из файла и листа, куда мы будем записывать данные", "Идентификатор", Type:=8) If Artikul Is Nothing Then Exit Sub Set ash = Artikul.Worksheet
Set Nomer_stolbca1 = Application.InputBox("Укажите столбец, куда необходимо вывести данные", "Столбец-вывода", Artikul.Offset(0, 1).Address, Type:=8) Nomer_stolbca = Nomer_stolbca1.Column Artikul_column = Artikul.Column i_n = Cells(Rows.Count, Artikul_column).End(xlUp).Row
Set WB = GetAnotherWorkbook WB.Activate
Set Tablica2 = Application.InputBox("Укажите столбцы таблицы-исходника", "Таблица-исходник", Type:=8) If Tablica2 Is Nothing Then Exit Sub
Set tablica = CreateObject("Scripting.Dictionary") Udalit = Application.InputBox("Необходимо ли модифицировать Идентификатор (удалять служебные символы)" _ & Chr(13) & "Оставьте как есть, если надо или измените (на что угодно)", "Удаление Идентификатора", "1") Iskomoe_znachenie_column = 1 Artikul2_column = 1 For col = 1 To Tablica2.Columns.Count If col > Iskomoe_znachenie_column Then Iskomoe_znachenie_column = col End If Next col i2_n = Tablica2.Cells(Tablica2.Rows.Count, Artikul2_column).End(xlUp).Row ReDim Artikuli(i_n) Application.ScreenUpdating = False For i = 1 To i_n Artikuli(i) = Artikul.Worksheet.Cells(i, Artikul_column) Next i '_________________________________ модуль поиска артикула с удалением части в скобках или после "_" конец If Udalit = 1 Then For i = 1 To i_n For s = 1 To Len(Artikuli(i)) If Mid(Artikuli(i), s, 1) Like "[(_]" = True Then Exit For Else Artikuli_ = Artikuli_ & Mid(Artikuli(i), s, 1) End If Next s Artikuli(i) = Artikuli_ Artikuli_ = "" Next i End If '_________________________________ модуль поиска артикула с удалением части в скобках или после "_" конец i2_s = IIf(IsEmpty(Tablica2.Cells(1, Artikul2_column)), (Tablica2.Cells(1, Artikul2_column).End(xlDown).Row), 1) For i2 = i2_s To i2_n key = Tablica2.Cells(i2, Artikul2_column) If Not tablica.Exists(key) Then tablica.Add key, Tablica2.Cells(i2, Iskomoe_znachenie_column) End If Next i2 For i = 1 To i_n n = 0 If tablica.Exists(Artikuli(i)) Then Nomer_stolbca1.Worksheet.Cells(i, Nomer_stolbca) = tablica.Item(Artikuli(i)) End If If Not tablica.Exists(Artikuli(i)) Then For x = 1 To 4 If tablica.Exists(n & Artikuli(i)) Then: Exit For n = n & "0" Next x Nomer_stolbca1.Worksheet.Cells(i, Nomer_stolbca) = tablica.Item(n & Artikuli(i)) End If Next i Application.ScreenUpdating = True Application.Windows(ActWB.Name).Activate End Sub
Private Function GetAnotherWorkbook() As Workbook ' если в данный момент открыто 2 книги, функция возвратит вторую открытую книгу ' если помимо текущей, открыто более одной книги - будет предоставлен выбор On Error Resume Next Dim coll As New Collection, WB As Workbook For Each WB In Workbooks 'If WB.Name <> ThisWorkbook.Name Then If Windows(WB.Name).Visible Then coll.Add CStr(WB.Name) ' End If Next WB Select Case coll.Count Case 0 ' нет других открытых книг MsgBox "Нет других открытых книг", vbCritical, "Function GetAnotherWorkbook" Case 1 ' открыта ещё только одна книга - её и возвращаем Set GetAnotherWorkbook = Workbooks(coll(1)) Case Else ' открыто несколько книг - предоставляем выбор For i = 1 To coll.Count txt = txt & i & vbTab & coll(i) & vbNewLine If coll(i) = ActiveWorkbook.Name Then n = i Next i msg = "Выберите одну из открытых книг, и введите её порядковый номер:" & _ vbNewLine & vbNewLine & txt res = InputBox(msg, "Открыто более двух книг", n) If IsNumeric(res) Then Set GetAnotherWorkbook = Workbooks(coll(Val(res))) End Select End Function
[/vba]
Странно - с этой процедурой - потом возвращается в 1-ю книгу без нее - нет Наверно это очередной баг 2013-го офиса SLAVICK