Задача: Необходимо с помощью макроса вставить в свободный столбец из заполненных ячеек только мобильные номера телефонов, исключая городские. Текст: Имеются файлы (по количеству около 900 тыс.строк, объемы большие у всех файлов), там записан макрос, который при поиске нужной информации вставляет в свободный столбец номер мобильного телефона. Т.е. в столбцах H и K есть данные, в столбец А вставляются каждый раз новые данные, при помощи макроса если есть совпадения ячейки А с H, то номер мобильного телефона из K копируется в столбец F. Но возникла проблема: в столбце К присутствуют теперь номера какие-то со скобками, какие-то без, и коды городов тоже бывают и трехзначные и четырехзначные. И мне макрос выдает только мобильные номера, которые без скобок, а также еще городские номера. Задача состоит в том, чтобы изменить макрос в соответствии с новыми данными, т.е. мне надо, чтобы в столбец F попадали только мобильные номера, никаких городских телефонов там не должно быть. Очень прошу подсказать, как это сделать. Файл-образец прикладываю и макрос отдельно тоже. [vba]
Код
Sub Telefon() Dim arr(), arr2(), Dic As Object, i&, iKey$ With Worksheets("Лист1")
arr = .Range("H2:L" & .Cells(.Rows.Count, "K").End(xlUp).Row).Value Set Dic = CreateObject("Scripting.Dictionary"): Dic.comparemode = 1 For i = 1 To UBound(arr) Dic.Item(Trim(arr(i, 1)) & "|" & Trim(arr(i, 2)) & "|" & Trim(arr(i, 3))) = Trim(arr(i, 4)) Next
arr = .Range("A2:C" & .Cells(.Rows.Count, "A").End(xlUp).Row).Value ReDim arr2(1 To UBound(arr, 1), 1 To 1) For i = 1 To UBound(arr) iKey = Trim(arr(i, 1)) & "|" & Trim(arr(i, 2)) & "|" & Trim(arr(i, 3)) If Dic.exists(iKey) Then
arr2(i, 1) = Telefon_sotov(Dic.Item(iKey)) End If Next
.[F2].Resize(UBound(arr2), 1) = arr2 End With End Sub
Public Function Telefon_sotov(Text As String)
Set objRegExp = CreateObject("VBScript.RegExp") objRegExp.Pattern = "\+7\s\d{3}\s\d{3}-\d{2}-\d{2}" objRegExp.Global = True Str1 = Text Set objMatches = objRegExp.Execute(Str1) For i = 0 To objMatches.Count - 1 If rez = "" Then rez = objMatches.Item(i) Else rez = rez & Chr(10) & objMatches.Item(i) Next Telefon_sotov = rez
End Function
[/vba]
Задача: Необходимо с помощью макроса вставить в свободный столбец из заполненных ячеек только мобильные номера телефонов, исключая городские. Текст: Имеются файлы (по количеству около 900 тыс.строк, объемы большие у всех файлов), там записан макрос, который при поиске нужной информации вставляет в свободный столбец номер мобильного телефона. Т.е. в столбцах H и K есть данные, в столбец А вставляются каждый раз новые данные, при помощи макроса если есть совпадения ячейки А с H, то номер мобильного телефона из K копируется в столбец F. Но возникла проблема: в столбце К присутствуют теперь номера какие-то со скобками, какие-то без, и коды городов тоже бывают и трехзначные и четырехзначные. И мне макрос выдает только мобильные номера, которые без скобок, а также еще городские номера. Задача состоит в том, чтобы изменить макрос в соответствии с новыми данными, т.е. мне надо, чтобы в столбец F попадали только мобильные номера, никаких городских телефонов там не должно быть. Очень прошу подсказать, как это сделать. Файл-образец прикладываю и макрос отдельно тоже. [vba]
Код
Sub Telefon() Dim arr(), arr2(), Dic As Object, i&, iKey$ With Worksheets("Лист1")
arr = .Range("H2:L" & .Cells(.Rows.Count, "K").End(xlUp).Row).Value Set Dic = CreateObject("Scripting.Dictionary"): Dic.comparemode = 1 For i = 1 To UBound(arr) Dic.Item(Trim(arr(i, 1)) & "|" & Trim(arr(i, 2)) & "|" & Trim(arr(i, 3))) = Trim(arr(i, 4)) Next
arr = .Range("A2:C" & .Cells(.Rows.Count, "A").End(xlUp).Row).Value ReDim arr2(1 To UBound(arr, 1), 1 To 1) For i = 1 To UBound(arr) iKey = Trim(arr(i, 1)) & "|" & Trim(arr(i, 2)) & "|" & Trim(arr(i, 3)) If Dic.exists(iKey) Then
arr2(i, 1) = Telefon_sotov(Dic.Item(iKey)) End If Next
.[F2].Resize(UBound(arr2), 1) = arr2 End With End Sub
Public Function Telefon_sotov(Text As String)
Set objRegExp = CreateObject("VBScript.RegExp") objRegExp.Pattern = "\+7\s\d{3}\s\d{3}-\d{2}-\d{2}" objRegExp.Global = True Str1 = Text Set objMatches = objRegExp.Execute(Str1) For i = 0 To objMatches.Count - 1 If rez = "" Then rez = objMatches.Item(i) Else rez = rez & Chr(10) & objMatches.Item(i) Next Telefon_sotov = rez
2. Повторюсь: Обратитесь к автору макроса. 3. Обратитесь в раздел фриланс 4. Ждите когда у желающих появится интерес разобрать работу макроса и изменить под ваши "хотелки". 5. Преобразовать данные в вид для котрого написан этот макрос.
чтобы в столбец F попадали только мобильные номера
6. На мой взгляд всё так и происходит. Вы видите в столбце F номера со скобками или 4 цифры после +7 ? Я такие номера в столбце F не вижу. Опишите конкретнее, вы что хотите и что вас не удовлетворяет? Покажите на данных которые обработал макрос, как он их обработал и как бы вы хотели бы чтобы он их обработал.
2. Повторюсь: Обратитесь к автору макроса. 3. Обратитесь в раздел фриланс 4. Ждите когда у желающих появится интерес разобрать работу макроса и изменить под ваши "хотелки". 5. Преобразовать данные в вид для котрого написан этот макрос.
чтобы в столбец F попадали только мобильные номера
6. На мой взгляд всё так и происходит. Вы видите в столбце F номера со скобками или 4 цифры после +7 ? Я такие номера в столбце F не вижу. Опишите конкретнее, вы что хотите и что вас не удовлетворяет? Покажите на данных которые обработал макрос, как он их обработал и как бы вы хотели бы чтобы он их обработал.gling
ЯД-41001506838083
Сообщение отредактировал gling - Вторник, 08.12.2020, 20:02
мне надо, чтобы в столбец F попадали только мобильные номера, никаких городских телефонов там не должно быть
Чем чужой код разбирать проще свой написать [vba]
Код
Sub Sotiki() Application.ScreenUpdating = False Dim r&, i&, s$, a r = Cells(Rows.Count, 1).End(xlUp).Row + 1 a = Range(Cells(2, 1), Cells(r, 11)) For i = 1 To UBound(a) s = Mid(Cells(i, 11), 4, 1) If a(i, 1) = a(i, 8) And s = "9" Then Cells(i, 6).Resize(1).Value = Mid(Cells(i, 11).Value, 1, 16) End If Next Application.ScreenUpdating = True End Sub
[/vba] Из ячеек с несколькими телефонами берется только первый, но это лучше чем вообще ничего, пробуйте на Ваших таблицах
мне надо, чтобы в столбец F попадали только мобильные номера, никаких городских телефонов там не должно быть
Чем чужой код разбирать проще свой написать [vba]
Код
Sub Sotiki() Application.ScreenUpdating = False Dim r&, i&, s$, a r = Cells(Rows.Count, 1).End(xlUp).Row + 1 a = Range(Cells(2, 1), Cells(r, 11)) For i = 1 To UBound(a) s = Mid(Cells(i, 11), 4, 1) If a(i, 1) = a(i, 8) And s = "9" Then Cells(i, 6).Resize(1).Value = Mid(Cells(i, 11).Value, 1, 16) End If Next Application.ScreenUpdating = True End Sub
[/vba] Из ячеек с несколькими телефонами берется только первый, но это лучше чем вообще ничего, пробуйте на Ваших таблицах _Igor_61
_Igor_61, Спасибо огромное за помощь. Но, к сожалению, это не совсем подходит, т.к. всё-таки теряются мобильные номера из ячеек, кроме первых, а их там иногда очень много. Я решила эту проблему путем "найти-заменить". Отфильтровала, оставила скобки где мне надо (это городские номера), ну и потом воспользовалась своим макросом. Всё получилось идеально. Я думала, что можно какие-то правки внести в макрос, чтобы это автоматом было, но до сих пор никто не предложил никаких вариантов решения задач, так что немного пришлось вручную сделать. Все равно спасибо.
_Igor_61, Спасибо огромное за помощь. Но, к сожалению, это не совсем подходит, т.к. всё-таки теряются мобильные номера из ячеек, кроме первых, а их там иногда очень много. Я решила эту проблему путем "найти-заменить". Отфильтровала, оставила скобки где мне надо (это городские номера), ну и потом воспользовалась своим макросом. Всё получилось идеально. Я думала, что можно какие-то правки внести в макрос, чтобы это автоматом было, но до сих пор никто не предложил никаких вариантов решения задач, так что немного пришлось вручную сделать. Все равно спасибо.Alina80
Здравствуйте. Ваш макрос ищет телефоны регуляркой, ее и нужно править. Во вложении вариант, срабатывающий на все российские мобильные номера. Если нужны и другие номера. Пишите.
PS У Вас в примере столбы B,C, I,J пустые, но в макросе присутствует обработка ячеек в этих столбах. Если у Вас по 900 тыс. строк в каждом файле, то это получается 3,6 миллиона впустую обработанных ячеек. Оно Вам надо?
Здравствуйте. Ваш макрос ищет телефоны регуляркой, ее и нужно править. Во вложении вариант, срабатывающий на все российские мобильные номера. Если нужны и другие номера. Пишите.
PS У Вас в примере столбы B,C, I,J пустые, но в макросе присутствует обработка ячеек в этих столбах. Если у Вас по 900 тыс. строк в каждом файле, то это получается 3,6 миллиона впустую обработанных ячеек. Оно Вам надо?CaramelManiac
CaramelManiac, Добрый день! Ваш вариант макроса идеально подходит под мои данные. Огромное спасибо, что откликнулись. А что касается столбцов B,C,I,J - то да, действительно раньше там были данные, которые тоже использовались, а теперь эти данные не требуются. И конечно они мне теперь не нужны. Как мне корректно убрать эти столбцы из макроса, будьте добры подскажите? Очень вам благодарна.)))
CaramelManiac, Добрый день! Ваш вариант макроса идеально подходит под мои данные. Огромное спасибо, что откликнулись. А что касается столбцов B,C,I,J - то да, действительно раньше там были данные, которые тоже использовались, а теперь эти данные не требуются. И конечно они мне теперь не нужны. Как мне корректно убрать эти столбцы из макроса, будьте добры подскажите? Очень вам благодарна.)))Alina80
CaramelManiac, Да, подсказали, в макросе всё подробно расписали, что и как, это как раз для таких тупых как я.))) Спасибо большое. Я только учусь с макросами работать, стараюсь сама разбираться. Но Ваша помощь оказалась очень полезной.
CaramelManiac, Да, подсказали, в макросе всё подробно расписали, что и как, это как раз для таких тупых как я.))) Спасибо большое. Я только учусь с макросами работать, стараюсь сама разбираться. Но Ваша помощь оказалась очень полезной.Alina80