Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Поиск одновременно по нескольким столбцам - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск одновременно по нескольким столбцам (Макросы/Sub)
Поиск одновременно по нескольким столбцам
Elhust Дата: Пятница, 20.07.2018, 15:57 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 178
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
Добрый день хочу уточнить как можно производить поиск значения вот по такой логике ...
Есть три столбца
Начинаем с "А" там стоит имя Иванов запоминаем его смотрим какие имена стоят в столбце B и C запоминаем их
Потом фильтруем каждый из столбцов на эти три сохранённых значения и смотрим стоят ли в соседних столбцах другие имена
Если да то это имя фильтруем по каждому столбцу если находим опять другое имя в строчке то фильтруем его и так пока все не кончатся а потом нужно создать группу как в примере
К сообщению приложен файл: New.xls(28.0 Kb)


Каждый сам выбирает правила игры
 
Ответить
СообщениеДобрый день хочу уточнить как можно производить поиск значения вот по такой логике ...
Есть три столбца
Начинаем с "А" там стоит имя Иванов запоминаем его смотрим какие имена стоят в столбце B и C запоминаем их
Потом фильтруем каждый из столбцов на эти три сохранённых значения и смотрим стоят ли в соседних столбцах другие имена
Если да то это имя фильтруем по каждому столбцу если находим опять другое имя в строчке то фильтруем его и так пока все не кончатся а потом нужно создать группу как в примере

Автор - Elhust
Дата добавления - 20.07.2018 в 15:57
Hugo Дата: Суббота, 21.07.2018, 09:53 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2837
Репутация: 639 ±
Замечаний: 0% ±

Берём массив из трёх фамилий (делаем одномерный), сортируем, заносим как ключ в словарь с присвоением номера группы.
А если такой ключ уже есть в словаре - извлекаем и прописываем номер.
Вместо словаря в данном случае можно использовать коллекцию.
И никаких сортировок - сразу решаем главную задачу. И сразу всем сотрудникам/группам.
Код писать пока некогда.


excel@nxt.ru
webmoney: E265281470651 R418926282008 Z422237915069
 
Ответить
СообщениеБерём массив из трёх фамилий (делаем одномерный), сортируем, заносим как ключ в словарь с присвоением номера группы.
А если такой ключ уже есть в словаре - извлекаем и прописываем номер.
Вместо словаря в данном случае можно использовать коллекцию.
И никаких сортировок - сразу решаем главную задачу. И сразу всем сотрудникам/группам.
Код писать пока некогда.

Автор - Hugo
Дата добавления - 21.07.2018 в 09:53
Elhust Дата: Воскресенье, 22.07.2018, 10:01 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 178
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
HugoПрошу прощения я не правильно пример составил , можете ещё раз описать механизм алгоритма :facepalm: :(
К сообщению приложен файл: 7944324.xls(30.5 Kb)


Каждый сам выбирает правила игры

Сообщение отредактировал Elhust - Воскресенье, 22.07.2018, 12:42
 
Ответить
СообщениеHugoПрошу прощения я не правильно пример составил , можете ещё раз описать механизм алгоритма :facepalm: :(

Автор - Elhust
Дата добавления - 22.07.2018 в 10:01
RAN Дата: Воскресенье, 22.07.2018, 16:19 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4817
Репутация: 968 ±
Замечаний: 0% ±

2010
[vba]
Код
Sub мяу()
Dim odic As Object, i&, j&, tmp, s$, a()
    Set odic = CreateObject("Scripting.Dictionary")
    For i = 2 To 13
        ReDim a(2)
        a(0) = Cells(i, 1).Value
        a(1) = Cells(i, 4).Value
        a(2) = Cells(i, 8).Value
        For j = 0 To 1
            If a(j) > a(j + 1) Then
                tmp = a(j): a(j) = a(j + 1): a(j + 1) = tmp
            End If
        Next
        s = Join(a, "|")
        If odic.exists(s) Then
            Cells(i, 9).Value = odic.Item(s)
        Else
            odic.Item(s) = odic.Count + 1
            Cells(i, 9).Value = odic.Item(s)
        End If
    Next
End Sub
[/vba]

PS Пытался сочинить замудреное, не вышло. А когда выложил, что вышло, смотрю - как пошагово инструкцию Игоря выполнял. :D


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Воскресенье, 22.07.2018, 16:25
 
Ответить
Сообщение[vba]
Код
Sub мяу()
Dim odic As Object, i&, j&, tmp, s$, a()
    Set odic = CreateObject("Scripting.Dictionary")
    For i = 2 To 13
        ReDim a(2)
        a(0) = Cells(i, 1).Value
        a(1) = Cells(i, 4).Value
        a(2) = Cells(i, 8).Value
        For j = 0 To 1
            If a(j) > a(j + 1) Then
                tmp = a(j): a(j) = a(j + 1): a(j + 1) = tmp
            End If
        Next
        s = Join(a, "|")
        If odic.exists(s) Then
            Cells(i, 9).Value = odic.Item(s)
        Else
            odic.Item(s) = odic.Count + 1
            Cells(i, 9).Value = odic.Item(s)
        End If
    Next
End Sub
[/vba]

PS Пытался сочинить замудреное, не вышло. А когда выложил, что вышло, смотрю - как пошагово инструкцию Игоря выполнял. :D

Автор - RAN
Дата добавления - 22.07.2018 в 16:19
Hugo Дата: Воскресенье, 22.07.2018, 19:16 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2837
Репутация: 639 ±
Замечаний: 0% ±

Привет Андрей :)
Оказывается нужно что-то совсем другое, а что - я так и не понял по второму примеру...


excel@nxt.ru
webmoney: E265281470651 R418926282008 Z422237915069
 
Ответить
СообщениеПривет Андрей :)
Оказывается нужно что-то совсем другое, а что - я так и не понял по второму примеру...

Автор - Hugo
Дата добавления - 22.07.2018 в 19:16
Elhust Дата: Понедельник, 23.07.2018, 08:03 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 178
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
RAN, Hugo, Спасибо большое за содействие ! и помощь но немного не то получилось всё никак объяснить не могу (
Вот я вложил пример уже 3 ... (( Там группа не правильно создаётся у вас каждая строчка получается новая группа а они формируются примерно так
Запоминаем первую строчку и ищем каждое значение в каждом столбце если нашли совпадения то ищем новые имена в строчке совпадения и это группа
К сообщению приложен файл: New2.xlsm(10.0 Kb)


Каждый сам выбирает правила игры
 
Ответить
СообщениеRAN, Hugo, Спасибо большое за содействие ! и помощь но немного не то получилось всё никак объяснить не могу (
Вот я вложил пример уже 3 ... (( Там группа не правильно создаётся у вас каждая строчка получается новая группа а они формируются примерно так
Запоминаем первую строчку и ищем каждое значение в каждом столбце если нашли совпадения то ищем новые имена в строчке совпадения и это группа

Автор - Elhust
Дата добавления - 23.07.2018 в 08:03
RAN Дата: Понедельник, 23.07.2018, 19:21 | Сообщение № 7
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4817
Репутация: 968 ±
Замечаний: 0% ±

2010
[vba]
Код
Sub мяв()
    Dim odic As Object, i&, flag As Boolean
    Set odic = CreateObject("Scripting.Dictionary")
    odic.Item(Cells(2, 1).Value) = 1
    odic.Item(Cells(2, 4).Value) = 1
    odic.Item(Cells(2, 8).Value) = 1
    Cells(2, 9) = 1
    For i = 2 To 12
        flag = False
        If Not odic.exists(Cells(i, 1).Value) Then
            If Not odic.exists(Cells(i, 4).Value) Then
                If Not odic.exists(Cells(i, 8).Value) Then
                    flag = True
                End If
            End If
        End If
        If flag = False Then
            odic.Item(Cells(i, 1).Value) = 1
            odic.Item(Cells(i, 4).Value) = 1
            odic.Item(Cells(i, 8).Value) = 1
            Cells(i, 9) = 1
        End If
    Next
End Sub
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение[vba]
Код
Sub мяв()
    Dim odic As Object, i&, flag As Boolean
    Set odic = CreateObject("Scripting.Dictionary")
    odic.Item(Cells(2, 1).Value) = 1
    odic.Item(Cells(2, 4).Value) = 1
    odic.Item(Cells(2, 8).Value) = 1
    Cells(2, 9) = 1
    For i = 2 To 12
        flag = False
        If Not odic.exists(Cells(i, 1).Value) Then
            If Not odic.exists(Cells(i, 4).Value) Then
                If Not odic.exists(Cells(i, 8).Value) Then
                    flag = True
                End If
            End If
        End If
        If flag = False Then
            odic.Item(Cells(i, 1).Value) = 1
            odic.Item(Cells(i, 4).Value) = 1
            odic.Item(Cells(i, 8).Value) = 1
            Cells(i, 9) = 1
        End If
    Next
End Sub
[/vba]

Автор - RAN
Дата добавления - 23.07.2018 в 19:21
Elhust Дата: Вторник, 24.07.2018, 13:44 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 178
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
RAN, Большая благодарность ! понял что нужно капать в сторону как их называют умные массивы .. ни когда не пользовался этим инструментом .. буду стараться расставить группу два и так далее
на сколько понимаю чтобы он создавал след группу нужно всё это засунуть в цикл но по уникальному списку столбца "А" а так как мы ищем в каждом столбце то этот список должен ещё и пополнятся в процессе становления группы чтобы при след итерации учесть все наименования что входят в группу ... а ещё думаю что нужно научиться более ясно выражать свои мысли ..


Каждый сам выбирает правила игры
 
Ответить
СообщениеRAN, Большая благодарность ! понял что нужно капать в сторону как их называют умные массивы .. ни когда не пользовался этим инструментом .. буду стараться расставить группу два и так далее
на сколько понимаю чтобы он создавал след группу нужно всё это засунуть в цикл но по уникальному списку столбца "А" а так как мы ищем в каждом столбце то этот список должен ещё и пополнятся в процессе становления группы чтобы при след итерации учесть все наименования что входят в группу ... а ещё думаю что нужно научиться более ясно выражать свои мысли ..

Автор - Elhust
Дата добавления - 24.07.2018 в 13:44
Elhust Дата: Четверг, 26.07.2018, 16:34 | Сообщение № 9
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 178
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
RAN, Сделал расстановку всех группу но появилась трудность , если одна из трёх ячеек в страке пустая то всё ломается ...
К сообщению приложен файл: 2279577.xlsm(24.4 Kb)


Каждый сам выбирает правила игры
 
Ответить
СообщениеRAN, Сделал расстановку всех группу но появилась трудность , если одна из трёх ячеек в страке пустая то всё ломается ...

Автор - Elhust
Дата добавления - 26.07.2018 в 16:34
RAN Дата: Четверг, 26.07.2018, 20:15 | Сообщение № 10
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4817
Репутация: 968 ±
Замечаний: 0% ±

2010
1. Не писать с словарь пустые
[vba]
Код
If Not Isempty(Cells(i, 1)) then
[/vba]
2. Ветвить проверку с учетом проверки на Empty.
[vba]
Код
If Not odic.exists(Cells(i, 1).Value) And Not Isempty(Cells(i, 1)) then
или
If Not odic.exists(Cells(i, 1).Value) And Len(Cells(i, 1)) then
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение1. Не писать с словарь пустые
[vba]
Код
If Not Isempty(Cells(i, 1)) then
[/vba]
2. Ветвить проверку с учетом проверки на Empty.
[vba]
Код
If Not odic.exists(Cells(i, 1).Value) And Not Isempty(Cells(i, 1)) then
или
If Not odic.exists(Cells(i, 1).Value) And Len(Cells(i, 1)) then
[/vba]

Автор - RAN
Дата добавления - 26.07.2018 в 20:15
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск одновременно по нескольким столбцам (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс цитирования
© 2010-2018 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!