Здравствуйте! В файлике Пример 2 нужно из пяти таблиц отобрать данные по наименованию в столбик, выделенный желтым цветом, без повторов с помощью формулы. В формуле как правильно прописать диапазон выбора данных ? =ЕСЛИОШИБКА(ИНДЕКС($A$3:$I$25;НАИМЕНЬШИЙ(ЕСЛИ(СЧЁТЕСЛИ($A$29:A29($A$3:$I$25)=0;СТРОКА($A$2:$I$26));1));"")
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
Здравствуйте. А для чего Вы так разбросали данные, для того чтобы потом мучатся собирая их? Ведите данные в одной плоской таблице, а на её основе составьте сводную. При необходимости в сводной или в таблице - базе автофильтром можно выбрать любые магазины для сравнения.
Да, вижу, У меня с помощью другой программы в таком виде будут выгружаться данные по разным магазинам. А у вас в файле только сам результат. У меня может быть до 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
НО собирать разбросанный диапазон для обработки макросом - много лишних строк кода! через привязку к каждой найденной ячейке, примерно
и далее .FindNext... хотя и зациклить всё это можно, но я пас... верю, что вы сами задумаетесь об оптимальности вашей выгрузки для дальнейшей обработки инфо, чтобы запустить код от VideoAlex, либо пишите предварительно код для сбора всех диапазонов в один обрабатываемый фрагмент... как указала, либо через .Find и .FindNext (примеры есть на форуме), либо (если опорные ячейки известны - начала таблиц, - то, как я показала, с поиском последней строки по диапазону одного магазина)... если хотите макрос под ключ - раздел Работа p.s. алгоритмически вариант со словарём, предложенный VideoAlex, оптимальный для данного рода задач... но под все ваши нюансы - пробуйте допилить... либо меняйте выгрузку - все таблицы друг под другом, как указала, - сразу зададите один диапазон - 1-ый столбец - для обработки макросом (без собирания по кусочкам)... успехов
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)