Здравствуйте. Помогите пожалуйста доработать макрос. Есть два файла. Файл "А" - это список телефонов и в нём же макрос. Второй файл - "Б" база, в которой встречаются телефоны из первого файла. Сейчас макрос удаляет из файла "Б" строки, телефон в которых встречается в файле "А". Нужно доделать так, чтобы при удалении, в файл "А" копировалась дата из файла "Б", в соседнюю ячейку возле совпадающего телефона. Для наглядности приложу картинку.
Сам код: [vba]
Код
Sub Макрос1() ' lCol = 4 'Val(InputBox("D", "Запрос параметра", 4)) If lCol = 0 Then Exit Sub 'Application.ScreenUpdating = 0 - поставил в самом начале lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count 'Имя листа с диапазоном значений на удаление With Workbooks("АН.xlsm").Worksheets("Лист1") avArr = .Range(.Cells(1, 3), .Cells(.Rows.Count, 1).End(xlUp)) End With 'удаляем For lr = 1 To UBound(avArr, 1) sSubStr = avArr(lr, 1) For li = lLastRow To 1 Step -1 'If CStr(Cells(li, lCol)) = sSubStr Then Rows(li).Delete If -(InStr(Cells(li, lCol), sSubStr) > 0) <> lMet Then Rows(li).Delete
Next li Next lr ' End Sub
[/vba]
Оба файла приложены. Спасибо всем откликнувшимся!
Здравствуйте. Помогите пожалуйста доработать макрос. Есть два файла. Файл "А" - это список телефонов и в нём же макрос. Второй файл - "Б" база, в которой встречаются телефоны из первого файла. Сейчас макрос удаляет из файла "Б" строки, телефон в которых встречается в файле "А". Нужно доделать так, чтобы при удалении, в файл "А" копировалась дата из файла "Б", в соседнюю ячейку возле совпадающего телефона. Для наглядности приложу картинку.
Сам код: [vba]
Код
Sub Макрос1() ' lCol = 4 'Val(InputBox("D", "Запрос параметра", 4)) If lCol = 0 Then Exit Sub 'Application.ScreenUpdating = 0 - поставил в самом начале lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count 'Имя листа с диапазоном значений на удаление With Workbooks("АН.xlsm").Worksheets("Лист1") avArr = .Range(.Cells(1, 3), .Cells(.Rows.Count, 1).End(xlUp)) End With 'удаляем For lr = 1 To UBound(avArr, 1) sSubStr = avArr(lr, 1) For li = lLastRow To 1 Step -1 'If CStr(Cells(li, lCol)) = sSubStr Then Rows(li).Delete If -(InStr(Cells(li, lCol), sSubStr) > 0) <> lMet Then Rows(li).Delete
Next li Next lr ' End Sub
[/vba]
Оба файла приложены. Спасибо всем откликнувшимся!emkub
Sub uuu() Dim fp$, k$ Dim a() Dim i&, p&, d& Dim sd As Object '-------------------- p = 4 'столбец с телефоном d = 6 'столбец с датой With Application.FileDialog(msoFileDialogFilePicker)'выбираем базу .Filters.Clear .Filters.Add "Microsoft Excel files", "*.xls*" .AllowMultiSelect = False .InitialFileName = ThisWorkbook.Path If .Show = 0 Then Exit Sub fp = .SelectedItems(1) End With With ThisWorkbook.ActiveSheet Application.ScreenUpdating = False Application.DisplayAlerts = False a = .UsedRange.Value 'берём в массив диапазон (телефоны) Set sd = CreateObject("Scripting.Dictionary") 'создаём словарь For i = 1 To UBound(a) 'проходим по массиву If a(i, 1) <> "" Then sd.Item(a(i, 1)) = i 'собираем в словарь пары телефон/номер строки Next ReDim Preserve a(1 To UBound(a), 1 To UBound(a, 2) + 1) 'расширяем массив на 1 столбец Workbooks.Open fp 'открываем базу With ActiveWorkbook With .ActiveSheet For i = .UsedRange.Rows.Count To 1 Step -1 'проходим от последней строки базы к 1й k = .Cells(i, p).Value 'ключ для поиска в словаре - телефон из базы If sd.Exists(k) Then 'если ключ существует то a(sd.Item(k), UBound(a, 2)) = .Cells(i, d).Value 'вносим в телефоны дату из базы .Rows(i).Delete 'удаляем строку в базе End If Next End With .Close True 'закрываем базу с сохранением изменений End With .Columns(1).NumberFormat = "@" 'делаем текстовым формат в телефонах (чтобы ведущие нули не убежали) .Cells(1, 1).Resize(UBound(a), UBound(a, 2)) = a 'выгружаем массив обратно на лист End With Application.DisplayAlerts = True Application.ScreenUpdating = True Beep MsgBox "Готово!" End Sub
[/vba]
[vba]
Код
Sub uuu() Dim fp$, k$ Dim a() Dim i&, p&, d& Dim sd As Object '-------------------- p = 4 'столбец с телефоном d = 6 'столбец с датой With Application.FileDialog(msoFileDialogFilePicker)'выбираем базу .Filters.Clear .Filters.Add "Microsoft Excel files", "*.xls*" .AllowMultiSelect = False .InitialFileName = ThisWorkbook.Path If .Show = 0 Then Exit Sub fp = .SelectedItems(1) End With With ThisWorkbook.ActiveSheet Application.ScreenUpdating = False Application.DisplayAlerts = False a = .UsedRange.Value 'берём в массив диапазон (телефоны) Set sd = CreateObject("Scripting.Dictionary") 'создаём словарь For i = 1 To UBound(a) 'проходим по массиву If a(i, 1) <> "" Then sd.Item(a(i, 1)) = i 'собираем в словарь пары телефон/номер строки Next ReDim Preserve a(1 To UBound(a), 1 To UBound(a, 2) + 1) 'расширяем массив на 1 столбец Workbooks.Open fp 'открываем базу With ActiveWorkbook With .ActiveSheet For i = .UsedRange.Rows.Count To 1 Step -1 'проходим от последней строки базы к 1й k = .Cells(i, p).Value 'ключ для поиска в словаре - телефон из базы If sd.Exists(k) Then 'если ключ существует то a(sd.Item(k), UBound(a, 2)) = .Cells(i, d).Value 'вносим в телефоны дату из базы .Rows(i).Delete 'удаляем строку в базе End If Next End With .Close True 'закрываем базу с сохранением изменений End With .Columns(1).NumberFormat = "@" 'делаем текстовым формат в телефонах (чтобы ведущие нули не убежали) .Cells(1, 1).Resize(UBound(a), UBound(a, 2)) = a 'выгружаем массив обратно на лист End With Application.DisplayAlerts = True Application.ScreenUpdating = True Beep MsgBox "Готово!" End Sub
Зачем его понимать. Запускаете. Выбираете файл с базой. Ждёте пару секунд. Готово. На 40000 телефонах и 15000 базе у меня отработало за секунд 5-6. Что мешает вам проверить?
Зачем его понимать. Запускаете. Выбираете файл с базой. Ждёте пару секунд. Готово. На 40000 телефонах и 15000 базе у меня отработало за секунд 5-6. Что мешает вам проверить?wild_pig
Мне, если честно, фиолетово, чем они у вас открываются. Подгоняйте под себя, если устраивает скорость обработки, если нет то для чего все эти разговоры. Моё дело предложить.
Мне, если честно, фиолетово, чем они у вас открываются. Подгоняйте под себя, если устраивает скорость обработки, если нет то для чего все эти разговоры. Моё дело предложить.wild_pig
Скачайте свои же примеры, замените свой код на мой. Книгу, которая база не открывайте. Запустили код. Выбрали файл в диалоге. Подождали сообщения о выполнении. Готово.
Скачайте свои же примеры, замените свой код на мой. Книгу, которая база не открывайте. Запустили код. Выбрали файл в диалоге. Подождали сообщения о выполнении. Готово.wild_pig