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

Вход

Регистрация

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

 

= Мир MS Excel/копирование данных между книгами - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
копирование данных между книгами
emkub Дата: Пятница, 03.02.2017, 17:50 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Здравствуйте.
Помогите пожалуйста доработать макрос.
Есть два файла. Файл "А" - это список телефонов и в нём же макрос. Второй файл - "Б" база, в которой встречаются телефоны из первого файла.
Сейчас макрос удаляет из файла "Б" строки, телефон в которых встречается в файле "А".
Нужно доделать так, чтобы при удалении, в файл "А" копировалась дата из файла "Б", в соседнюю ячейку возле совпадающего телефона.
Для наглядности приложу картинку.


Сам код:
[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]

Оба файла приложены.
Спасибо всем откликнувшимся!
К сообщению приложен файл: 6993324.xlsm (15.2 Kb) · 0605692.xlsx (8.2 Kb)


Сообщение отредактировал emkub - Пятница, 03.02.2017, 18:05
 
Ответить
СообщениеЗдравствуйте.
Помогите пожалуйста доработать макрос.
Есть два файла. Файл "А" - это список телефонов и в нём же макрос. Второй файл - "Б" база, в которой встречаются телефоны из первого файла.
Сейчас макрос удаляет из файла "Б" строки, телефон в которых встречается в файле "А".
Нужно доделать так, чтобы при удалении, в файл "А" копировалась дата из файла "Б", в соседнюю ячейку возле совпадающего телефона.
Для наглядности приложу картинку.


Сам код:
[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
Дата добавления - 03.02.2017 в 17:50
wild_pig Дата: Пятница, 03.02.2017, 20:53 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 518
Репутация: 97 ±
Замечаний: 0% ±

2003, 2013
Сколько строк бывает в реальных в файлах?
 
Ответить
СообщениеСколько строк бывает в реальных в файлах?

Автор - wild_pig
Дата добавления - 03.02.2017 в 20:53
emkub Дата: Пятница, 03.02.2017, 21:24 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Сколько строк бывает в реальных в файлах?

список телефонов - 40000; в базе - 10000-15000

А вопрос касательно быстродействия или нет?


Сообщение отредактировал emkub - Пятница, 03.02.2017, 21:46
 
Ответить
Сообщение
Сколько строк бывает в реальных в файлах?

список телефонов - 40000; в базе - 10000-15000

А вопрос касательно быстродействия или нет?

Автор - emkub
Дата добавления - 03.02.2017 в 21:24
emkub Дата: Пятница, 03.02.2017, 21:37 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Меня заинтересовала такая конструкция:
[vba]
Код
Dim bkBook_1 As Excel.Workbook
    Dim bkBook_2 As Excel.Workbook
    
    'Даём имена книгам. Через эти имена можно обращаться к книгам.
    Set bkBook_1 = ActiveWorkbook
    Set bkBook_2 = Workbooks(2)
[/vba]

Скажите, в моём случае это можно использовать? Или есть более правильные варианты?


Сообщение отредактировал emkub - Пятница, 03.02.2017, 21:38
 
Ответить
СообщениеМеня заинтересовала такая конструкция:
[vba]
Код
Dim bkBook_1 As Excel.Workbook
    Dim bkBook_2 As Excel.Workbook
    
    'Даём имена книгам. Через эти имена можно обращаться к книгам.
    Set bkBook_1 = ActiveWorkbook
    Set bkBook_2 = Workbooks(2)
[/vba]

Скажите, в моём случае это можно использовать? Или есть более правильные варианты?

Автор - emkub
Дата добавления - 03.02.2017 в 21:37
wild_pig Дата: Пятница, 03.02.2017, 22:04 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 518
Репутация: 97 ±
Замечаний: 0% ±

2003, 2013
[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
[/vba]


Сообщение отредактировал wild_pig - Пятница, 03.02.2017, 23:07
 
Ответить
Сообщение[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
[/vba]

Автор - wild_pig
Дата добавления - 03.02.2017 в 22:04
wild_pig Дата: Пятница, 03.02.2017, 22:06 | Сообщение № 6
Группа: Проверенные
Ранг: Обитатель
Сообщений: 518
Репутация: 97 ±
Замечаний: 0% ±

2003, 2013
Скажите, в моём случае это можно использовать

Можно! А вот надо ли это не ко мне.
 
Ответить
Сообщение
Скажите, в моём случае это можно использовать

Можно! А вот надо ли это не ко мне.

Автор - wild_pig
Дата добавления - 03.02.2017 в 22:06
emkub Дата: Пятница, 03.02.2017, 22:43 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Мне сложно сразу понять ваш код...
А скажите пожалуйста, Алексей, какой из них быстрее должен работать мой или ваш? чисто теоретически
 
Ответить
СообщениеМне сложно сразу понять ваш код...
А скажите пожалуйста, Алексей, какой из них быстрее должен работать мой или ваш? чисто теоретически

Автор - emkub
Дата добавления - 03.02.2017 в 22:43
wild_pig Дата: Пятница, 03.02.2017, 22:55 | Сообщение № 8
Группа: Проверенные
Ранг: Обитатель
Сообщений: 518
Репутация: 97 ±
Замечаний: 0% ±

2003, 2013
Зачем его понимать. Запускаете. Выбираете файл с базой. Ждёте пару секунд. Готово.
На 40000 телефонах и 15000 базе у меня отработало за секунд 5-6. Что мешает вам проверить?
 
Ответить
СообщениеЗачем его понимать. Запускаете. Выбираете файл с базой. Ждёте пару секунд. Готово.
На 40000 телефонах и 15000 базе у меня отработало за секунд 5-6. Что мешает вам проверить?

Автор - wild_pig
Дата добавления - 03.02.2017 в 22:55
emkub Дата: Пятница, 03.02.2017, 22:59 | Сообщение № 9
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Нууу, стараюсь разобраться, как оно работает :)
есть загвоздка.
на строке [vba]
Код
If .Show = 0 Then Exit Sub
[/vba]
открывается окно "Обзор"...


Сообщение отредактировал emkub - Пятница, 03.02.2017, 23:02
 
Ответить
СообщениеНууу, стараюсь разобраться, как оно работает :)
есть загвоздка.
на строке [vba]
Код
If .Show = 0 Then Exit Sub
[/vba]
открывается окно "Обзор"...

Автор - emkub
Дата добавления - 03.02.2017 в 22:59
wild_pig Дата: Пятница, 03.02.2017, 23:03 | Сообщение № 10
Группа: Проверенные
Ранг: Обитатель
Сообщений: 518
Репутация: 97 ±
Замечаний: 0% ±

2003, 2013
emkub, добавил комментариев в код. Это не загвоздка. Не вижу смысла чтобы все файлы открывать руками, есть диалог для этого.
 
Ответить
Сообщениеemkub, добавил комментариев в код. Это не загвоздка. Не вижу смысла чтобы все файлы открывать руками, есть диалог для этого.

Автор - wild_pig
Дата добавления - 03.02.2017 в 23:03
emkub Дата: Пятница, 03.02.2017, 23:09 | Сообщение № 11
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
мммм...
Два файла у меня открываются планировщиком, и затем макрос тем же планировщиком вызывается сочетанием клавиш.
 
Ответить
Сообщениемммм...
Два файла у меня открываются планировщиком, и затем макрос тем же планировщиком вызывается сочетанием клавиш.

Автор - emkub
Дата добавления - 03.02.2017 в 23:09
wild_pig Дата: Пятница, 03.02.2017, 23:12 | Сообщение № 12
Группа: Проверенные
Ранг: Обитатель
Сообщений: 518
Репутация: 97 ±
Замечаний: 0% ±

2003, 2013
Мне, если честно, фиолетово, чем они у вас открываются. Подгоняйте под себя, если устраивает скорость обработки, если нет то для чего все эти разговоры. Моё дело предложить.
 
Ответить
СообщениеМне, если честно, фиолетово, чем они у вас открываются. Подгоняйте под себя, если устраивает скорость обработки, если нет то для чего все эти разговоры. Моё дело предложить.

Автор - wild_pig
Дата добавления - 03.02.2017 в 23:12
emkub Дата: Суббота, 04.02.2017, 11:15 | Сообщение № 13
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
wild_pig, написал вам сообщение.
 
Ответить
Сообщениеwild_pig, написал вам сообщение.

Автор - emkub
Дата добавления - 04.02.2017 в 11:15
Pelena Дата: Суббота, 04.02.2017, 11:51 | Сообщение № 14
Группа: Админы
Ранг: Местный житель
Сообщений: 19603
Репутация: 4660 ±
Замечаний: ±

Excel 365 & Mac Excel
написал вам сообщение

Это зря. Нарушение п.5о Правил форума


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
Сообщение
написал вам сообщение

Это зря. Нарушение п.5о Правил форума

Автор - Pelena
Дата добавления - 04.02.2017 в 11:51
wild_pig Дата: Суббота, 04.02.2017, 14:03 | Сообщение № 15
Группа: Проверенные
Ранг: Обитатель
Сообщений: 518
Репутация: 97 ±
Замечаний: 0% ±

2003, 2013
Скачайте свои же примеры, замените свой код на мой. Книгу, которая база не открывайте. Запустили код. Выбрали файл в диалоге. Подождали сообщения о выполнении. Готово.
 
Ответить
СообщениеСкачайте свои же примеры, замените свой код на мой. Книгу, которая база не открывайте. Запустили код. Выбрали файл в диалоге. Подождали сообщения о выполнении. Готово.

Автор - wild_pig
Дата добавления - 04.02.2017 в 14:03
  • Страница 1 из 1
  • 1
Поиск:

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