Страницы: 1
RSS
Отбор данных без повтора из нескольких таблиц
 
Здравствуйте! В файлике Пример 2 нужно из пяти таблиц отобрать данные по наименованию в столбик, выделенный желтым цветом, без повторов с помощью формулы. В формуле как правильно прописать диапазон выбора данных ?
=ЕСЛИОШИБКА(ИНДЕКС($A$3:$I$25;НАИМЕНЬШИЙ(ЕСЛИ(СЧЁТЕСЛИ($A$29:A29($A$3:$I$25)=0;СТРОКА($A$2:$I$26));1));"")
Изменено: nura28 - 24.07.2016 06:16:10
 
Код
Sub qwe()
Dim a(), i As Integer, j As Integer, rng As Range, cll As Range
Set dic = CreateObject("Scripting.Dictionary")
 Set rng = Range("A3:A12,D3:D12,G3:G12,A16:A25,D16:D25")
For Each cll In rng
    Key = cll.Value
    If Not dic.Exists(Key) Then dic.Add Key, 1
Next
For i = 0 To dic.Count - 1
Cells(30 + i, 1).Value = dic.Keys()(i)
Next i
End Sub
 
А куда этот код вставить и как его сохранить?
 
Цитата
nura28 написал:
В файлике Пример 2 нужно...
Ни здрастье, ни помогите, ни пожалуйста...
 
Здравствуйте. А для чего Вы так разбросали данные, для того чтобы потом мучатся собирая их? Ведите данные в одной плоской таблице, а на её основе составьте сводную. При необходимости в сводной или в таблице - базе автофильтром можно выбрать любые магазины для сравнения.
Изменено: gling - 24.07.2016 08:00:53
 
Цитата
nura28 написал: А куда этот код вставить и как его сохранить?
Вы видите приложенный мной файл?
 
Да, вижу, У меня с помощью другой программы в таком виде будут выгружаться данные по разным магазинам. А у вас в файле только сам результат. У меня может быть до 20 тыс позиций.
 
Цитата
nura28 написал: У меня может быть до 20 тыс позиций.
вправо или вниз?
можно ли все таблицы выгрузить сверху вниз одну за другой?
иначе прыгать по ячейкам "Наименование" пробуйте сами ( сначала вправо, потом вниз, потом снова вправо и т.д.) через функцию .Find
- выделяя разные (нужные диапазоны), тогда код от VideoAlex под приложенный пример (если первая яч задана жёстко, а последняя плавающая) - будет выглядеть примерно так...
Код
Sub qwe()
Dim a(), i As Integer, j As Integer, R1, R2, R3, R4, R5, rng As Range, cll As Range
Set dic = CreateObject("Scripting.Dictionary")
With Sheets("Лист1")
    Set R1 = .Range("A3:A" & .[A3].End(xlDown).Row)
    Set R2 = .Range("D3:D" & .[D3].End(xlDown).Row)
    Set R3 = .Range("G3:G" & .[G3].End(xlDown).Row)
    Set R4 = .Range("A16:A" & .[A16].End(xlDown).Row)
    Set R5 = .Range("D16:D" & .[D16].End(xlDown).Row)
End With 
Set rng = Union(R1, R2, R3, R4, R5)
For Each cll In rng
    Key = cll.Value
    If Not dic.Exists(Key) Then dic.Add Key, 1
Next
For i = 0 To dic.Count - 1
Cells(30 + i, 1).Value = dic.Keys()(i)
Next i
End Sub
НО собирать разбросанный диапазон для обработки макросом - много лишних строк кода! через привязку к каждой найденной ячейке, примерно
Код
'Set FIRSTCELL = .Range("A1:A" & .Cells(.Rows.Count, "A").End(xlUp).Row).Find("Наименование", LookIn:=xlValues)
и далее .FindNext... хотя и зациклить всё это можно, но я пас... верю, что вы сами задумаетесь об оптимальности вашей выгрузки для дальнейшей обработки инфо, чтобы запустить код от VideoAlex, либо пишите предварительно код для сбора всех диапазонов в один обрабатываемый фрагмент... как указала, либо через .Find и .FindNext (примеры есть на форуме), либо (если опорные ячейки известны - начала таблиц, - то, как я показала, с поиском последней строки по диапазону одного магазина)... если хотите макрос под ключ - раздел Работа  ;)
p.s. алгоритмически вариант со словарём, предложенный  VideoAlex, оптимальный для данного рода задач... но под все ваши нюансы - пробуйте допилить... либо меняйте выгрузку - все таблицы друг под другом, как указала, - сразу зададите один диапазон - 1-ый столбец - для обработки макросом (без собирания по кусочкам)... успехов
Изменено: JeyCi - 24.07.2016 19:18:25
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Страницы: 1
Наверх