Всем хорошего дня. Нужна Ваша помощь в следующем: Есть столбец с буквено-численными значениями по типу: MRKU06928955 и МSCU4789555 Нужен макрос, который сможет найти значения, у которых совпадают 4 числовых значения подряд, как в примере MRKU06928955 и МSCU4789555 Именно числовые, не буквенные. Для таких значений, в столбце правее нужно добавить порядковый номер. Т.е. для первой группы ячеек с 4мя повторяющимися цифрами - 1. Для следующей группы - 2 и т.д. Если есть совпадения через группы, то в ячейке правее должен быть порядковый номер 1,2 или 2,3 соответственно. Выделение цветом не подходит, т.к. на печати этого не будет видно. Спасибо заранее!!!
Всем хорошего дня. Нужна Ваша помощь в следующем: Есть столбец с буквено-численными значениями по типу: MRKU06928955 и МSCU4789555 Нужен макрос, который сможет найти значения, у которых совпадают 4 числовых значения подряд, как в примере MRKU06928955 и МSCU4789555 Именно числовые, не буквенные. Для таких значений, в столбце правее нужно добавить порядковый номер. Т.е. для первой группы ячеек с 4мя повторяющимися цифрами - 1. Для следующей группы - 2 и т.д. Если есть совпадения через группы, то в ячейке правее должен быть порядковый номер 1,2 или 2,3 соответственно. Выделение цветом не подходит, т.к. на печати этого не будет видно. Спасибо заранее!!!maxx801
Пока ТС еще только уточняет задачу, мы уже почти готовы к ее решению Набросал запрос SQL, выделяющий по 4 цифры из каждого кода (несколько раз, "внахлест черепицей") и сортирующий затем получившийся список по полю с этими 4 цифрами, так что одинаковые оказываются рядом и можно с ними в соседней колонке что-то поделать, когда будет окончательно понятно ЧТО именно. См. получившуюся картину в файле на Лист2.
[vba]
Код
Sub io() Dim rst Dim sql As String
Set rst = CreateObject("ADODB.Recordset")
sql = sql & "SELECT F1, F2 FROM ( " sql = sql & "SELECT F1, Trim(Mid(F1, 1,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 2,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 3,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 4,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 5,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 6,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 7,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 8,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 9,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1,10,4)) AS F2 FROM [Лист1$] " sql = sql & ") WHERE F2 Like '[0-9][0-9][0-9][0-9]' " sql = sql & "ORDER BY F2 "
[/vba] Внимание! Чтобы макрос работал, книгу надо сначала сохранить у себя на диске, иначе ThisWorkbook.FullName вернет непонятно что из интернета.
Пока ТС еще только уточняет задачу, мы уже почти готовы к ее решению Набросал запрос SQL, выделяющий по 4 цифры из каждого кода (несколько раз, "внахлест черепицей") и сортирующий затем получившийся список по полю с этими 4 цифрами, так что одинаковые оказываются рядом и можно с ними в соседней колонке что-то поделать, когда будет окончательно понятно ЧТО именно. См. получившуюся картину в файле на Лист2.
[vba]
Код
Sub io() Dim rst Dim sql As String
Set rst = CreateObject("ADODB.Recordset")
sql = sql & "SELECT F1, F2 FROM ( " sql = sql & "SELECT F1, Trim(Mid(F1, 1,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 2,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 3,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 4,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 5,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 6,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 7,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 8,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 9,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1,10,4)) AS F2 FROM [Лист1$] " sql = sql & ") WHERE F2 Like '[0-9][0-9][0-9][0-9]' " sql = sql & "ORDER BY F2 "
[/vba] Внимание! Чтобы макрос работал, книгу надо сначала сохранить у себя на диске, иначе ThisWorkbook.FullName вернет непонятно что из интернета.Gustav
Но почему тогда в строке 8 1,3 а в строке 2 только 1? Ведь проверять надо все элементы?! Тогда и во второй строке должно быть что-то типа 3, 1
Но почему тогда в строке 8 1,3 а в строке 2 только 1? Ведь проверять надо все элементы?! Тогда и во второй строке должно быть что-то типа 3, 1alex77755
Для решения задачки нужно составить справочник уникальных четверок, которые встречаются более одного раза на Лист2 в моём файле в сообщении 4. Затем эти четверки пронумеровать и прописать через запятую на Лист1, используя связи четверок и исходных кодов с Лист2. Нормально объяснил? Сейчас нет времени, чуть позже могу проделать, если до этого никто еще не сделает.
Для решения задачки нужно составить справочник уникальных четверок, которые встречаются более одного раза на Лист2 в моём файле в сообщении 4. Затем эти четверки пронумеровать и прописать через запятую на Лист1, используя связи четверок и исходных кодов с Лист2. Нормально объяснил? Сейчас нет времени, чуть позже могу проделать, если до этого никто еще не сделает.Gustav
Ну, как-то так. На листе 5 - те номера, кого коснулась процедура. На листе 3 - справочник "четверок" (повторен также вручную на листе 5 - для удобства проверки). На листах 1-5 последовательно представлены все этапы трансформации.
[vba]
Код
Sub io() Dim rst Dim sql As String Dim connString As String Dim prev As String Dim curr As String Dim collect As String Dim arr() Dim i
'находим все возможные четверки чисел sql = "" sql = sql & "SELECT F1, F2 FROM ( " sql = sql & "SELECT F1, Trim(Mid(F1, 1,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 2,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 3,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 4,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 5,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 6,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 7,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 8,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 9,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1,10,4)) AS F2 FROM [Лист1$] " sql = sql & ") WHERE F2 Like '[0-9][0-9][0-9][0-9]' " sql = sql & "ORDER BY F2 "
'нумеруем уникальные четверки With [Лист3!A1].CurrentRegion.Offset(0, 1) .Formula = "=ROW()" .Value = .Value End With Call saveThisWorkbook
'привязываем номера уникальных четверок к записям Лист2 sql = "" sql = sql & "SELECT L.F1, L.F2, R.F2 FROM [Лист2$] AS L LEFT JOIN [Лист3$] AS R " sql = sql & "ON L.F2 = R.F1 WHERE R.F1 Is Not Null ORDER BY 1, 3"
'прописываем номера четверок через запятую rst.Open sql, connString
ReDim arr(1 To [Лист4!A1].CurrentRegion.Rows.Count, 1 To 2)
prev = "" collect = "" i = 0
Do While Not rst.EOF curr = rst(0) If curr <> prev Then 'прерываем цепочку и записываем в массив If collect <> "" Then i = i + 1 arr(i, 1) = prev arr(i, 2) = Left(collect, Len(collect) - 1) End If 'начинаем новую цепочку collect = rst(2) & "," Else 'продолжаем цепочку collect = collect & rst(2) & "," End If prev = curr rst.MoveNext Loop 'заключительная цепочка If collect <> "" Then i = i + 1 arr(i, 1) = prev arr(i, 2) = Left(collect, Len(collect) - 1) End If
rst.Close
'выгружаем массив на Лист5 [Лист5!A1].Resize(i, 2) = arr Call saveThisWorkbook
End Sub
Sub saveThisWorkbook() Application.DisplayAlerts = False ThisWorkbook.Save Application.DisplayAlerts = True End Sub
[/vba]
Ну, как-то так. На листе 5 - те номера, кого коснулась процедура. На листе 3 - справочник "четверок" (повторен также вручную на листе 5 - для удобства проверки). На листах 1-5 последовательно представлены все этапы трансформации.
[vba]
Код
Sub io() Dim rst Dim sql As String Dim connString As String Dim prev As String Dim curr As String Dim collect As String Dim arr() Dim i
'находим все возможные четверки чисел sql = "" sql = sql & "SELECT F1, F2 FROM ( " sql = sql & "SELECT F1, Trim(Mid(F1, 1,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 2,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 3,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 4,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 5,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 6,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 7,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 8,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1, 9,4)) AS F2 FROM [Лист1$] UNION ALL " sql = sql & "SELECT F1, Trim(Mid(F1,10,4)) AS F2 FROM [Лист1$] " sql = sql & ") WHERE F2 Like '[0-9][0-9][0-9][0-9]' " sql = sql & "ORDER BY F2 "
'нумеруем уникальные четверки With [Лист3!A1].CurrentRegion.Offset(0, 1) .Formula = "=ROW()" .Value = .Value End With Call saveThisWorkbook
'привязываем номера уникальных четверок к записям Лист2 sql = "" sql = sql & "SELECT L.F1, L.F2, R.F2 FROM [Лист2$] AS L LEFT JOIN [Лист3$] AS R " sql = sql & "ON L.F2 = R.F1 WHERE R.F1 Is Not Null ORDER BY 1, 3"
'прописываем номера четверок через запятую rst.Open sql, connString
ReDim arr(1 To [Лист4!A1].CurrentRegion.Rows.Count, 1 To 2)
prev = "" collect = "" i = 0
Do While Not rst.EOF curr = rst(0) If curr <> prev Then 'прерываем цепочку и записываем в массив If collect <> "" Then i = i + 1 arr(i, 1) = prev arr(i, 2) = Left(collect, Len(collect) - 1) End If 'начинаем новую цепочку collect = rst(2) & "," Else 'продолжаем цепочку collect = collect & rst(2) & "," End If prev = curr rst.MoveNext Loop 'заключительная цепочка If collect <> "" Then i = i + 1 arr(i, 1) = prev arr(i, 2) = Left(collect, Len(collect) - 1) End If
rst.Close
'выгружаем массив на Лист5 [Лист5!A1].Resize(i, 2) = arr Call saveThisWorkbook
End Sub
Sub saveThisWorkbook() Application.DisplayAlerts = False ThisWorkbook.Save Application.DisplayAlerts = True End Sub
Gustav, Теорию, вроде, описал правильно. Я такую же реализовывал. Реализацию не проверял, но с результатами не согласен Почему в последнем нет значений? Там же 3 четвёрки Сорри запутался в листах. Для проверки вставлял данные в лист 5 В результатах не показывается строка где нет совпадений МSCU0789065
Gustav, Теорию, вроде, описал правильно. Я такую же реализовывал. Реализацию не проверял, но с результатами не согласен Почему в последнем нет значений? Там же 3 четвёрки Сорри запутался в листах. Для проверки вставлял данные в лист 5 В результатах не показывается строка где нет совпадений МSCU0789065alex77755
Public Function GetMyText(txt, Optional pattern As String = "[A-Za-zА-Яа-яЁё]") As String Dim M As String, i As Long, S For i = 1 To Len(txt) M = Mid(txt, i, 1) If M Like pattern Then S = S & M Next i GetMyText = S End Function
Private Sub CommandButton1_Click() Dim M(), LR, R, i, j, T, K, L, C, ii Dim D: Set D = CreateObject("Scripting.Dictionary") Range("B1:J500").ClearContents
LR = Cells(Rows.Count, 1).End(xlUp).Row M = Range("A1").Resize(LR, 2) For R = 1 To LR M(R, 2) = "" Next R For R = 1 To LR T = GetMyText(M(R, 1), "[0-9]") If Len(T) > 4 Then For i = 1 To Len(T) - 3 j = "'" & Mid(T, i, 4) D(j) = D(j) + 1 Next i End If Next R For Each C In D.keys If D(C) < 2 Then D.Remove C Next C i = 0 For Each C In D.keys i = i + 1 D(C) = i Next C Range("F1").Resize(D.Count) = Application.Transpose(D.items) Range("G1").Resize(D.Count) = Application.Transpose(D.keys) For R = 1 To LR For Each C In D.keys If InStr(1, M(R, 1), Replace(C, "'", "")) Then M(R, 2) = IIf(M(R, 2) = "", D(C), M(R, 2) & "," & D(C)) End If Next C Next R Range("A1").Resize(LR, 2) = M End Sub
[/vba]
Мой вариант
[vba]
Код
Option Explicit
Public Function GetMyText(txt, Optional pattern As String = "[A-Za-zА-Яа-яЁё]") As String Dim M As String, i As Long, S For i = 1 To Len(txt) M = Mid(txt, i, 1) If M Like pattern Then S = S & M Next i GetMyText = S End Function
Private Sub CommandButton1_Click() Dim M(), LR, R, i, j, T, K, L, C, ii Dim D: Set D = CreateObject("Scripting.Dictionary") Range("B1:J500").ClearContents
LR = Cells(Rows.Count, 1).End(xlUp).Row M = Range("A1").Resize(LR, 2) For R = 1 To LR M(R, 2) = "" Next R For R = 1 To LR T = GetMyText(M(R, 1), "[0-9]") If Len(T) > 4 Then For i = 1 To Len(T) - 3 j = "'" & Mid(T, i, 4) D(j) = D(j) + 1 Next i End If Next R For Each C In D.keys If D(C) < 2 Then D.Remove C Next C i = 0 For Each C In D.keys i = i + 1 D(C) = i Next C Range("F1").Resize(D.Count) = Application.Transpose(D.items) Range("G1").Resize(D.Count) = Application.Transpose(D.keys) For R = 1 To LR For Each C In D.keys If InStr(1, M(R, 1), Replace(C, "'", "")) Then M(R, 2) = IIf(M(R, 2) = "", D(C), M(R, 2) & "," & D(C)) End If Next C Next R Range("A1").Resize(LR, 2) = M End Sub
но с результатами не согласен Почему в последнем нет значений? Там же 3 четвёрки
У меня колонка А отсортирована, поэтому то, что называется "последним" у меня в строке 6 и там действительно 3 четверки. Пустые, которых не коснулась процедура, как я уже сказал, не отображал. При желании можно подтянуть данные с Лист5 на Лист1 при помощи ВПР - художнику это уже было не интересно
но с результатами не согласен Почему в последнем нет значений? Там же 3 четвёрки
У меня колонка А отсортирована, поэтому то, что называется "последним" у меня в строке 6 и там действительно 3 четверки. Пустые, которых не коснулась процедура, как я уже сказал, не отображал. При желании можно подтянуть данные с Лист5 на Лист1 при помощи ВПР - художнику это уже было не интересно Gustav