Страницы: 1
RSS
Макрос сведение 2-х таблиц в одну но по определенному критерию
 
Привет всем, я далека от написания макросов. Если кто-то поможет решить мою проблемку, буду безмерно счастлива и благодарна. Даны 2 таблицы... из них мне нужно сформировать третью таблицу, в которую войдут некоторые столбцы из первой таблицы и некоторые столбцы со второй... но не все .. мне нужно чтобы третья табличка строилась по критерию "Чья территория" (см. приложение)... в 2-х исходных табличках уникальным значением является код (он не повторяется)... т. е мне нужно чтобы я получила таблицу отдельно по Лучинскому...отдельно  по Кобелеву и данные будут браться: из 2-й табл. - код, ФИО владельца и паспортные данные, а с 1-й наименование фирмы. И еще все таблицы расположены в разных файлах... Можно использовать Функцию ВПР, но это занимает множество времени, так как это упрощенный вариант моего запроса, в действительности таблицы более обширные...Жду ответа
 
Привет! Я тоже издалека :-) Для решения Вашего вопроса нужно знать следующее:  
1. Исходные таблицы находятся на одном листе, или на разных?  
2. В каких столбцах расположены эти исходные таблицы?  
3. Создавать отчёт (третью таблицу) нужно на отдельном листе?  
4. Каким образом будет задаваться эти Лучинский/Кобелев/другие...?  
Лучше показать небольшой фрагмент реального файла с исходными таблицами.
 
Про разные файлы сразу не заметил. Нужны эти два разных файла. Вопрос по способу выбора смотрящего остаётся.
 
Подготовлю таблички исходные как они есть на самом деле и выложу... спасибо за участие
 
Привет!  
У меня есть инструмент, который Вам поможет всё это сделать самой с небольшой долей ручного труда, но зато под полным Вашим контролем.  
Тем более, что данные в разных файлах.  
Просто в копию одного из файлов одним кликом копируете недостающие данные из другого, затем ставите автофильтр на "Чья территория" и отбираете, кого надо. Отобранное целиком копируете в новый файл, в данном случае ещё надо вручную поменять порядок колонок, удалить лишнее, натянуть рамки. Но главное - сопоставить две таблицы по ключевым полям - уже сделано.  
Файл с макросом - http://hugo.nxt.ru/CompareFiles.Find.rar  
Настройки (на Вашем файле, но можно запускать на разных):  
 
Файл - приёмник: c:\Temp\Новичок\post_147467.xls  
Файл - источник: c:\Temp\Новичок\post_147467.xls  
Столбцы сравнения в приёмнике: a  
Столбцы сравнения в источнике: a  
Лист - приёмник (№): 3  
Лист - источник (№): 2  
Столбцы - приёмники данных копирования: e,f,g  
Столбцы - источники данных копирования: a,b,c  
 
Здесь сравнение по коду, но можно сравнивать сразу по коду и фамилии (a,b с a,c), если например на одном коде разные люди.  
 
Результат с вручную добавленным автофильтром на 3-м листе.
 
Уточняю условие...Даны три таблицы, вообще это 3 разные книги (базы) я для примера сделала как отдельные листы…мне нужно сделать табл 3, основываясь на первые 2… по критерию «Торговый представитель»… то есть по каждому торговому сформировать базу по точкам: все берется со второй таблицы, отсортированное по каждому конкретному торговому, а паспортные данные (т.к. их нет во второй таблице) с табл.1. Таблица 1 – основная.. там может содержаться информация к примеру по 20 000 точкам (база всех существующих точек), во второй таблице представляется информация по торговым точкам , которые выполнили план…т. е. примерно 5000 точек…, которые относятся к 50 торговым представителям… и для каждого из 50 торговых нужно сделать табличку с его точками, которые выполнили план… как показано в табл.3. столбцы в табличках соответсвуют своим адресам, как есть в реальности
 
hugo, ваше предложение мне понятно... моя задача оптимизировать процесс... я хочу чтобы выполнение данной задачи у меня занимало не полдня а  то и день... копирование... фильтрация, использование функции ВПР... а пару часов максимум чтобы формирование табл.3 по каждому торговому представителю ускорялось с помощью макроса...))) еще хочеться отметить, что в таблице 2, после тех столбцов, что привела я есть еще несколько столбцов…. «План».. «факт».. «отклонение»… в табл 3… кроме имеющихся в примере.. столбцы «подпись»… «Денежное вознаграждение» (но мне туда ничего вносить не нужно, а оставить пустыми, потом данные в эти столбцы будут вноситься обычной шариковой ручкой). Т. е я не могу добавить в табл. 2 паспортные данные и потом фильтровать по конкретному торговому…. Мне нужно занести нужные данные именно в табл 3 и я хочу чтобы меняя только фамилию у меня с помощью макроса данные сами подтягивались.. не знаю реально ли это… я сильно не сильна в этом, но идея такая возникла))))
 
Понятно.  
Ну я ведь не предлагаю Вам портить саму табл.2 :) Сделайте её копию, из копии удалите ненужные № п/п Страна, вообще сделайте подобие табл.3, только без того, чего пока нет - без паспортных данных, для них отставьте место. Столбец "торговый представитель" сразу перенесите на своё место, затем удалите уже ненужные "ФИО ответственных лиц". Это займёт минуту-две. Затем запускаете мой код - в эту заготовку подтягиваются по номеру регистрации паспортные данные.  
Да, на 20000х5000 будет думать может минут 10, но в статусбаре процесс работы отображается.  
Теперь ставите автофильтр на "ФИО торгового представителя"  и печатаете по-одному. Вот для именно печати можно спецмакрос написать, это просто, чтоб вручную 50 раз не фильтровать и не распечатывать.  
Можно конечно всю эту процедуру делать специально написанным макросом, и работать он будет быстрее (если мастер напишет), но работа это непростая, а при малейшем изменении в структуре таблиц макрос придётся исправлять. А в моём Вы сами замените в настройках столбцы.  
Да и наверное такого вида задачи ещё есть - сделайте несколько копиий файла с макросом с разными настройками и используйте.
 
Вопрос ещё акутален?
 
все варианты рассматриваю))) конечно актуален
 
Проверьте.  
1. Список смотрящих в столбце Z (его можно скрыть). Пустых строк в списке быть не должно.  
2. Все три файла должны находиться в одной (любой) папке.  
3. Других файлов в папке быть не должно.
 
Юрий, надо было на массивах делать, там ведь 20000х5000. А так скорость будет как у меня.
 
{quote}{login=Hugo}{date=21.08.2010 04:45}{thema=}{post}Юрий, надо было на массивах делать{/post}{/quote}  
Согласен, но с массивами у меня совсем худо... Немного подправил код: ячейки расположены вразнобой, поэтому сначала копировал каждую. Сейчас увидел, что можно хоть немного увеличить скорость.
 
У меня такое работает, если удалить слияние ячеек в заголовках и разместить их в одной строке:  
 
Option Explicit  
'---------------------------------------------------------------------------------------  
' Procedure : Build_List  
' Author    : KL  
' Date      : 21/08/2010  
' Purpose   :  
' Comments  : Reference to Microsoft ActiveX Data Objects Library  
'             is required to execute this code.  
'---------------------------------------------------------------------------------------  
Sub Build_List()  
   Dim Con As ADODB.Connection  
   Dim RS As ADODB.Recordset  
   Dim Sql As String  
     
   Application.ScreenUpdating = False  
     
   Set Con = New ADODB.Connection  
   With Con  
     .Provider = "Microsoft.Jet.OLEDB.4.0"  
     .ConnectionString = "Data Source=" & "C:\Temp\Tab1.xls" & ";Extended Properties=Excel 8.0;"  
     .Open  
   End With  
     
   Set RS = New ADODB.Recordset  
         
   Sql = _  
       "SELECT Tab1.[Город], Tab1.[Номер регистрации], Tab1.[Название фирмы], " & _
       "Tab1.[Фамилия], Tab1.[Имя], Tab1.[Отчество], Tab1.[серия], Tab1.[номер], " & _
       "Tab1.[дата], Tab1.[кем выдан], Tab2.[торговый представитель] " & _
       "FROM [табл 1$] AS Tab1 INNER JOIN `C:\Temp\Tab2.xls`.[табл 2$] AS Tab2 " & _
       "ON Tab1.[Номер регистрации] = Tab2.[Номер регистрации] " & _
       "ORDER BY 11;"  
         
   RS.Open Sql, Con  
   With ThisWorkbook.Sheets(1)  
       .Range("a1").CopyFromRecordset RS  
   End With  
   Con.Close: Set RS = Nothing: Set Con = Nothing  
End Sub
KL
 
Ну вот - а я уже собрался массивы прикручивать :-)    
Хорошо, что Кирилл спас.
 
Кирилл, а через MSQuery можно это дело провернуть? Чтоб весь запрос в одном *.dqy файле разместить?
 
{quote}{login=Hugo}{date=22.08.2010 01:28}{thema=}{post}Кирилл, а через MSQuery можно это дело провернуть? Чтоб весь запрос в одном *.dqy файле разместить?{/post}{/quote}  
Несомненно. Только придется вручную пути к файлам указывать или писать обработчик события открытия файла с актуализацией пути в команде SQL.
KL
 
Вот подчищенный код:  
 
Option Explicit  
'---------------------------------------------------------------------------------------  
' Procedure : Build_List  
' Author    : KL  
' Date      : 21/08/2010  
' Purpose   :  
' Comments  : Reference to Microsoft ActiveX Data Objects Library  
'             is required to execute this code.  
'---------------------------------------------------------------------------------------  
Sub Build_List()  
   Dim Con As ADODB.Connection  
   Dim RS As ADODB.Recordset  
   Dim Sql As String, strPath As String, strRep As String  
   Dim strFile1 As String, strFile2 As String, strTab1 As String, strTab2 As String  
     
   strPath = ThisWorkbook.Path  
   strFile1 = strPath & "\Tab1.xls"  
   strFile2 = strPath & "\Tab2.xls"  
   strTab1 = "табл 1"  
   strTab2 = "табл 2"  
   strRep = "Кобелев"  
     
   Application.ScreenUpdating = False  
     
   Set Con = New ADODB.Connection  
   With Con  
     .Provider = "Microsoft.Jet.OLEDB.4.0"  
     .ConnectionString = "Data Source=" & strFile1 & ";Extended Properties=Excel 8.0;"  
     .Open  
   End With  
     
   Set RS = New ADODB.Recordset  
         
   Sql = _  
       "SELECT Tab1.[Город], Tab1.[Номер регистрации], Tab1.[Название фирмы], " & _
       "Tab1.[Фамилия], Tab1.[Имя], Tab1.[Отчество], Tab1.[серия], Tab1.[номер], " & _
       "Tab1.[дата], Tab1.[кем выдан], Tab2.[торговый представитель] " & _
       "FROM [" & strTab1 & "$] AS Tab1 INNER JOIN `" & strFile2 & "`.[" & strTab2 & "$] AS Tab2 " & _
       "ON Tab1.[Номер регистрации] = Tab2.[Номер регистрации] " & _
       "WHERE Tab2.[торговый представитель] = '" & strRep & "' "
       '"ORDER BY 11;"  
         
   RS.Open Sql, Con  
   With ThisWorkbook.Sheets(1)  
       .Range("A1").CopyFromRecordset RS  
   End With  
   Con.Close: Set RS = Nothing: Set Con = Nothing  
End Sub
KL
 
{quote}{login=KL}{date=22.08.2010 02:47}{thema=Re: }{post}{quote}{login=Hugo}{date=22.08.2010 01:28}{thema=}{post}Кирилл, а через MSQuery можно это дело провернуть? Чтоб весь запрос в одном *.dqy файле разместить?{/post}{/quote}  
Несомненно. Только придется вручную пути к файлам указывать или писать обработчик события открытия файла с актуализацией пути в команде SQL.{/post}{/quote}  
Пример такого *.dqy, который тянет из двух таблиц разных файлов (как в этой задаче) не дадите? У мня никак не получается сделать, не пойму...
 
{quote}{login=Hugo}{date=22.08.2010 08:50}{thema=Re: Re: }{post}Пример такого *.dqy, который тянет из двух таблиц разных файлов (как в этой задаче) не дадите? У мня никак не получается сделать, не пойму...{/post}{/quote}  
Вот это у меня работает, если в папке C:\Temp\ находятся прилагаемые файлы  
Tab1.xls с листом "табл 1"  
Tab2.xls с листом "табл 2"  
Заголовки столбцов данных должны быть в одну строку (строка 1) и без слитых ячеек.
KL
Страницы: 1
Читают тему
Наверх