Здравствуйте... Встала нетривиальная задача... Есть исходный файл в котором 3 столбца - логин, фио, регион. Требуется с 2 других листа вывести данные следующим образом.
1 лист. Если в столбце с логинами некоторые логины почти совпадают (например, ivanov и ivanov6464), то нужно их вывести в столбец
2 лист. Если в столбце с логинами некоторые логины почти совпадают, как в примере выше, а так же полностью совпададает регион, то вывести в листе в 1 столбце логин, во втором - регион для данного логина.
Честно говоря, не знаю, с чего даже начать... Буду признателен за помощь. Наглядный пример прикладываю.
Здравствуйте... Встала нетривиальная задача... Есть исходный файл в котором 3 столбца - логин, фио, регион. Требуется с 2 других листа вывести данные следующим образом.
1 лист. Если в столбце с логинами некоторые логины почти совпадают (например, ivanov и ivanov6464), то нужно их вывести в столбец
2 лист. Если в столбце с логинами некоторые логины почти совпадают, как в примере выше, а так же полностью совпададает регион, то вывести в листе в 1 столбце логин, во втором - регион для данного логина.
Честно говоря, не знаю, с чего даже начать... Буду признателен за помощь. Наглядный пример прикладываю.Chertyozhnik
Может, я что-то не понимаю, но, на мой взгляд, все Ваши задачи решаются элементарными сортировками: * Частичное совпадение логина - отсортируйте список по полю Логин * Част. совпад логина + регион - отсортируйте список по полям Регион (1-й ключ), Логин (2-й ключ)
Лично я бы сортировал сразу по 3 полям: Регион (1-й ключ), ФИО (2-й ключ), Логин (3-й ключ) - многое бы сразу прояснилось и наглядно выстроилось.
И хорошо бы развернуть понятие "частичное совпадение" - выделяем буквы до первой цифры и на их основе что-то анализируем? А то ведь бывают, например, Иванов и Ивашкин - вроде тоже по первым трем буквам "частичное совпадение"...
Может, я что-то не понимаю, но, на мой взгляд, все Ваши задачи решаются элементарными сортировками: * Частичное совпадение логина - отсортируйте список по полю Логин * Част. совпад логина + регион - отсортируйте список по полям Регион (1-й ключ), Логин (2-й ключ)
Лично я бы сортировал сразу по 3 полям: Регион (1-й ключ), ФИО (2-й ключ), Логин (3-й ключ) - многое бы сразу прояснилось и наглядно выстроилось.
И хорошо бы развернуть понятие "частичное совпадение" - выделяем буквы до первой цифры и на их основе что-то анализируем? А то ведь бывают, например, Иванов и Ивашкин - вроде тоже по первым трем буквам "частичное совпадение"...Gustav
на мой взгляд, все Ваши задачи решаются элементарными сортировками
Решались бы, если бы логинов было 5, как в примере... В реальности их около 15 000. И при условии, что сделать фильтр по логинам - потом придется 15000 ячеек пролистывать и искать совпадения глазками )). Что просто нереально ). Поэтому и хотелось вывести их в отдельный лист, чтобы были сразу.
на мой взгляд, все Ваши задачи решаются элементарными сортировками
Решались бы, если бы логинов было 5, как в примере... В реальности их около 15 000. И при условии, что сделать фильтр по логинам - потом придется 15000 ячеек пролистывать и искать совпадения глазками )). Что просто нереально ). Поэтому и хотелось вывести их в отдельный лист, чтобы были сразу.Chertyozhnik
А в файле ещё две формулы с функцией СЧЁТЕСЛИМН. И, соответственно, всего 3 дополнительных аналитических столбца к трём основным. Думаю, с таким хозяйством можно будет достаточно эффективно посортироваться и пофильтроваться даже на таких массивах данных, которыми Вы нас пугаете.
И, наверное, критерием попадания строки на 2-й лист "Частичное совпадение логина" должно быть значение >1 в столбце "счёт логин", а на 3-й лист "Част. совпад логина + регион" - значение >1 в столбце "счёт логин+регион".
А в файле ещё две формулы с функцией СЧЁТЕСЛИМН. И, соответственно, всего 3 дополнительных аналитических столбца к трём основным. Думаю, с таким хозяйством можно будет достаточно эффективно посортироваться и пофильтроваться даже на таких массивах данных, которыми Вы нас пугаете.
И, наверное, критерием попадания строки на 2-й лист "Частичное совпадение логина" должно быть значение >1 в столбце "счёт логин", а на 3-й лист "Част. совпад логина + регион" - значение >1 в столбце "счёт логин+регион".Gustav
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]
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
Макрос - идеальный ). Прямо то, что нужно. Осталось разобраться, как вы это сделали, ибо если в формулах я хоть какие-то знания уже имею благодаря вашему ресурсу, то макросы это вообще темный лес. На уровне того, что Земля плоская или стоит на трех китах ))
Спасибо огромное за помощь!
Manyasha, здравствуйте.
Макрос - идеальный ). Прямо то, что нужно. Осталось разобраться, как вы это сделали, ибо если в формулах я хоть какие-то знания уже имею благодаря вашему ресурсу, то макросы это вообще темный лес. На уровне того, что Земля плоская или стоит на трех китах ))
Да неужели?? Фильтр ">1" включаете по одному из счётных полей и отфильтрованное сортируете по логину или по логину+регион. В обоих случаях наборы записей - как у Марины макросом.
Да неужели?? Фильтр ">1" включаете по одному из счётных полей и отфильтрованное сортируете по логину или по логину+регион. В обоих случаях наборы записей - как у Марины макросом.Gustav