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

Вход

Регистрация

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

 

= Мир MS Excel/Вывести данные из столбца при частичном или полном совпадени - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Вывести данные из столбца при частичном или полном совпадени
Chertyozhnik Дата: Вторник, 03.10.2017, 16:33 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 79
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Здравствуйте... Встала нетривиальная задача... Есть исходный файл в котором 3 столбца - логин, фио, регион. Требуется с 2 других листа вывести данные следующим образом.

1 лист.
Если в столбце с логинами некоторые логины почти совпадают (например, ivanov и ivanov6464), то нужно их вывести в столбец

2 лист.
Если в столбце с логинами некоторые логины почти совпадают, как в примере выше, а так же полностью совпададает регион, то вывести в листе в 1 столбце логин, во втором - регион для данного логина.

Честно говоря, не знаю, с чего даже начать... Буду признателен за помощь. Наглядный пример прикладываю.
К сообщению приложен файл: 5691309.xlsx (11.3 Kb)
 
Ответить
СообщениеЗдравствуйте... Встала нетривиальная задача... Есть исходный файл в котором 3 столбца - логин, фио, регион. Требуется с 2 других листа вывести данные следующим образом.

1 лист.
Если в столбце с логинами некоторые логины почти совпадают (например, ivanov и ivanov6464), то нужно их вывести в столбец

2 лист.
Если в столбце с логинами некоторые логины почти совпадают, как в примере выше, а так же полностью совпададает регион, то вывести в листе в 1 столбце логин, во втором - регион для данного логина.

Честно говоря, не знаю, с чего даже начать... Буду признателен за помощь. Наглядный пример прикладываю.

Автор - Chertyozhnik
Дата добавления - 03.10.2017 в 16:33
Gustav Дата: Вторник, 03.10.2017, 18:56 | Сообщение № 2
Группа: Админы
Ранг: Участник клуба
Сообщений: 2843
Репутация: 1194 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Может, я что-то не понимаю, но, на мой взгляд, все Ваши задачи решаются элементарными сортировками:
* Частичное совпадение логина - отсортируйте список по полю Логин
* Част. совпад логина + регион - отсортируйте список по полям Регион (1-й ключ), Логин (2-й ключ)

Лично я бы сортировал сразу по 3 полям: Регион (1-й ключ), ФИО (2-й ключ), Логин (3-й ключ) - многое бы сразу прояснилось и наглядно выстроилось.

И хорошо бы развернуть понятие "частичное совпадение" - выделяем буквы до первой цифры и на их основе что-то анализируем? А то ведь бывают, например, Иванов и Ивашкин - вроде тоже по первым трем буквам "частичное совпадение"...


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеМожет, я что-то не понимаю, но, на мой взгляд, все Ваши задачи решаются элементарными сортировками:
* Частичное совпадение логина - отсортируйте список по полю Логин
* Част. совпад логина + регион - отсортируйте список по полям Регион (1-й ключ), Логин (2-й ключ)

Лично я бы сортировал сразу по 3 полям: Регион (1-й ключ), ФИО (2-й ключ), Логин (3-й ключ) - многое бы сразу прояснилось и наглядно выстроилось.

И хорошо бы развернуть понятие "частичное совпадение" - выделяем буквы до первой цифры и на их основе что-то анализируем? А то ведь бывают, например, Иванов и Ивашкин - вроде тоже по первым трем буквам "частичное совпадение"...

Автор - Gustav
Дата добавления - 03.10.2017 в 18:56
Chertyozhnik Дата: Среда, 04.10.2017, 09:47 | Сообщение № 3
Группа: Пользователи
Ранг: Участник
Сообщений: 79
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Здравствуйте.
выделяем буквы до первой цифры и на их основе что-то анализируем?

да, приблизительно так.

на мой взгляд, все Ваши задачи решаются элементарными сортировками

Решались бы, если бы логинов было 5, как в примере... В реальности их около 15 000. И при условии, что сделать фильтр по логинам - потом придется 15000 ячеек пролистывать и искать совпадения глазками )). Что просто нереально ). Поэтому и хотелось вывести их в отдельный лист, чтобы были сразу.
 
Ответить
СообщениеЗдравствуйте.
выделяем буквы до первой цифры и на их основе что-то анализируем?

да, приблизительно так.

на мой взгляд, все Ваши задачи решаются элементарными сортировками

Решались бы, если бы логинов было 5, как в примере... В реальности их около 15 000. И при условии, что сделать фильтр по логинам - потом придется 15000 ячеек пролистывать и искать совпадения глазками )). Что просто нереально ). Поэтому и хотелось вывести их в отдельный лист, чтобы были сразу.

Автор - Chertyozhnik
Дата добавления - 04.10.2017 в 09:47
Chertyozhnik Дата: Среда, 04.10.2017, 09:49 | Сообщение № 4
Группа: Пользователи
Ранг: Участник
Сообщений: 79
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Немного обманул... Открыл только что файл. Логинов в реальности 160 000 с небольшим )
 
Ответить
СообщениеНемного обманул... Открыл только что файл. Логинов в реальности 160 000 с небольшим )

Автор - Chertyozhnik
Дата добавления - 04.10.2017 в 09:49
Gustav Дата: Среда, 04.10.2017, 12:45 | Сообщение № 5
Группа: Админы
Ранг: Участник клуба
Сообщений: 2843
Репутация: 1194 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Логинов в реальности 160 000 с небольшим

Тогда в помощь Вам формула, выдергивающая буквенное начало логина (массивная, ввод по Ctrl+Shift+Enter):
Код
=ЛЕВСИМВ(A2;МИН(ЕСЛИОШИБКА(ПОИСК({"0";"1";"2";"3";"4";"5";"6";"7";"8";"9"};A2);99))-1)

А в файле ещё две формулы с функцией СЧЁТЕСЛИМН. И, соответственно, всего 3 дополнительных аналитических столбца к трём основным. Думаю, с таким хозяйством можно будет достаточно эффективно посортироваться и пофильтроваться даже на таких массивах данных, которыми Вы нас пугаете.

И, наверное, критерием попадания строки на 2-й лист "Частичное совпадение логина" должно быть значение >1 в столбце "счёт логин", а на 3-й лист "Част. совпад логина + регион" - значение >1 в столбце "счёт логин+регион".
К сообщению приложен файл: 5691309_03.xlsx (12.8 Kb)


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Среда, 04.10.2017, 12:57
 
Ответить
Сообщение
Логинов в реальности 160 000 с небольшим

Тогда в помощь Вам формула, выдергивающая буквенное начало логина (массивная, ввод по Ctrl+Shift+Enter):
Код
=ЛЕВСИМВ(A2;МИН(ЕСЛИОШИБКА(ПОИСК({"0";"1";"2";"3";"4";"5";"6";"7";"8";"9"};A2);99))-1)

А в файле ещё две формулы с функцией СЧЁТЕСЛИМН. И, соответственно, всего 3 дополнительных аналитических столбца к трём основным. Думаю, с таким хозяйством можно будет достаточно эффективно посортироваться и пофильтроваться даже на таких массивах данных, которыми Вы нас пугаете.

И, наверное, критерием попадания строки на 2-й лист "Частичное совпадение логина" должно быть значение >1 в столбце "счёт логин", а на 3-й лист "Част. совпад логина + регион" - значение >1 в столбце "счёт логин+регион".

Автор - Gustav
Дата добавления - 04.10.2017 в 12:45
Manyasha Дата: Среда, 04.10.2017, 13:27 | Сообщение № 6
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 902 ±
Замечаний: 0% ±

Excel 2010, 2016
Chertyozhnik, здравствуйте.
Предлагаю вариант с макросом:
[vba]
Код
Sub test()
    Dim lr&, i&, res$, r&, temp$
    Dim dic1 As Object, dic2 As Object, data, k, login
    Dim sh1 As Worksheet, sh2 As Worksheet, sh3 As Worksheet
    
    Set sh1 = ThisWorkbook.Sheets(1)
    Set sh2 = ThisWorkbook.Sheets(2)
    Set sh3 = ThisWorkbook.Sheets(3)
    
    lr = sh1.Cells(Rows.Count, 1).End(xlUp).Row
    Set dic1 = CreateObject("scripting.dictionary")
    Set dic2 = CreateObject("scripting.dictionary")
    data = sh1.Range("a2:c" & lr).Value
    
    For i = 1 To UBound(data)
        With CreateObject("VBScript.RegExp")
            .Global = True
            .Pattern = "\d+"
            res = .Replace(data(i, 1), "")
        End With
        If dic1.exists(res) Then
            dic1(res) = dic1(res) & "," & data(i, 1)
        Else
            dic1(res) = data(i, 1)
        End If
        temp = res & "|" & Trim(data(i, 3))
        If dic2.exists(temp) Then
            dic2(temp) = dic2(temp) & "," & data(i, 1)
        Else
            dic2(temp) = data(i, 1)
        End If
    Next i
    
    sh2.[a2].CurrentRegion.Offset(1).ClearContents
    sh3.[a2].CurrentRegion.Offset(1).ClearContents
    r = 2
    With sh2
        For Each k In dic1
            If InStr(dic1(k), ",") Then
                For Each login In Split(dic1(k), ",")
                    .Cells(r, 1) = login
                    r = r + 1
                Next login
            End If
        Next k
    End With
    r = 2
    With sh3
        For Each k In dic2
            If InStr(dic2(k), ",") Then
                For Each login In Split(dic2(k), ",")
                    .Cells(r, 1) = login
                    .Cells(r, 2) = Split(k, "|")(1)
                    r = r + 1
                Next login
            End If
        Next k
    End With
End Sub
[/vba]
К сообщению приложен файл: 5691309-1.xlsm (22.5 Kb)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеChertyozhnik, здравствуйте.
Предлагаю вариант с макросом:
[vba]
Код
Sub test()
    Dim lr&, i&, res$, r&, temp$
    Dim dic1 As Object, dic2 As Object, data, k, login
    Dim sh1 As Worksheet, sh2 As Worksheet, sh3 As Worksheet
    
    Set sh1 = ThisWorkbook.Sheets(1)
    Set sh2 = ThisWorkbook.Sheets(2)
    Set sh3 = ThisWorkbook.Sheets(3)
    
    lr = sh1.Cells(Rows.Count, 1).End(xlUp).Row
    Set dic1 = CreateObject("scripting.dictionary")
    Set dic2 = CreateObject("scripting.dictionary")
    data = sh1.Range("a2:c" & lr).Value
    
    For i = 1 To UBound(data)
        With CreateObject("VBScript.RegExp")
            .Global = True
            .Pattern = "\d+"
            res = .Replace(data(i, 1), "")
        End With
        If dic1.exists(res) Then
            dic1(res) = dic1(res) & "," & data(i, 1)
        Else
            dic1(res) = data(i, 1)
        End If
        temp = res & "|" & Trim(data(i, 3))
        If dic2.exists(temp) Then
            dic2(temp) = dic2(temp) & "," & data(i, 1)
        Else
            dic2(temp) = data(i, 1)
        End If
    Next i
    
    sh2.[a2].CurrentRegion.Offset(1).ClearContents
    sh3.[a2].CurrentRegion.Offset(1).ClearContents
    r = 2
    With sh2
        For Each k In dic1
            If InStr(dic1(k), ",") Then
                For Each login In Split(dic1(k), ",")
                    .Cells(r, 1) = login
                    r = r + 1
                Next login
            End If
        Next k
    End With
    r = 2
    With sh3
        For Each k In dic2
            If InStr(dic2(k), ",") Then
                For Each login In Split(dic2(k), ",")
                    .Cells(r, 1) = login
                    .Cells(r, 2) = Split(k, "|")(1)
                    r = r + 1
                Next login
            End If
        Next k
    End With
End Sub
[/vba]

Автор - Manyasha
Дата добавления - 04.10.2017 в 13:27
Chertyozhnik Дата: Среда, 04.10.2017, 17:04 | Сообщение № 7
Группа: Пользователи
Ранг: Участник
Сообщений: 79
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Gustav, здравствуйте, к сожалению не подошла формула. Не тот смысл (
 
Ответить
СообщениеGustav, здравствуйте, к сожалению не подошла формула. Не тот смысл (

Автор - Chertyozhnik
Дата добавления - 04.10.2017 в 17:04
Chertyozhnik Дата: Среда, 04.10.2017, 17:05 | Сообщение № 8
Группа: Пользователи
Ранг: Участник
Сообщений: 79
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Manyasha, здравствуйте.

Макрос - идеальный ). Прямо то, что нужно. Осталось разобраться, как вы это сделали, ибо если в формулах я хоть какие-то знания уже имею благодаря вашему ресурсу, то макросы это вообще темный лес. На уровне того, что Земля плоская или стоит на трех китах ))

Спасибо огромное за помощь!
 
Ответить
СообщениеManyasha, здравствуйте.

Макрос - идеальный ). Прямо то, что нужно. Осталось разобраться, как вы это сделали, ибо если в формулах я хоть какие-то знания уже имею благодаря вашему ресурсу, то макросы это вообще темный лес. На уровне того, что Земля плоская или стоит на трех китах ))

Спасибо огромное за помощь!

Автор - Chertyozhnik
Дата добавления - 04.10.2017 в 17:05
Gustav Дата: Среда, 04.10.2017, 17:52 | Сообщение № 9
Группа: Админы
Ранг: Участник клуба
Сообщений: 2843
Репутация: 1194 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
к сожалению не подошла формула. Не тот смысл (

Да неужели?? Фильтр ">1" включаете по одному из счётных полей и отфильтрованное сортируете по логину или по логину+регион. В обоих случаях наборы записей - как у Марины макросом.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
к сожалению не подошла формула. Не тот смысл (

Да неужели?? Фильтр ">1" включаете по одному из счётных полей и отфильтрованное сортируете по логину или по логину+регион. В обоих случаях наборы записей - как у Марины макросом.

Автор - Gustav
Дата добавления - 04.10.2017 в 17:52
  • Страница 1 из 1
  • 1
Поиск:

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