Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.09.2013, 15:32   #1
zontique
 
Регистрация: 12.08.2013
Сообщений: 6
Вопрос Сравнения столбцов с последующим копированием

Здравствуйте,

помогите пожалуйста составить макрос для сравнение столбцов с последующим копированием совпадений на новый лист.

Попробую объяснить более подробно, нужно чтоб макрос брал данные из столбца "A" с первого листа и сравнивал их с данными из столбца "A" со второго листа, и при случае совпадения копировал строку со второго листа на новый лист.

Надеюсь, что смог все объяснить и буду благодарен вам если вы поможете мне в этом вопросе.


--------- примечание модератора - вдруг кому пригодится --------------
Цитата:
Надстройка LOOKUP предназначена для сравнения и подстановки значений в таблицах Excel.

Если вам надо сравнить 2 таблицы (по одному столбцу, или по нескольким),
и для совпадающих строк скопировать значения выбранных столбцов из одной таблицы в другую,
надстройка «Lookup» поможет сделать это нажатием одной кнопки.


В настройках программы можно задать:
  • где искать сравниваемые файлы (использовать уже открытый файл, загружать файл по заданному пути, или же выводить диалоговое окно выбора файла)
  • с каких листов брать данные (варианты: активный лист, лист с заданным номером или названием)
  • какие столбцы сравнивать (можно задать несколько столбцов)
  • значения каких столбцов надо копировать в найденные строки (также можно указать несколько столбцов)

Скачать надстройку для сравнения таблиц Excel и копирования данных из одинаковых строк


Последний раз редактировалось EducatedFool; 30.09.2013 в 09:41.
zontique вне форума Ответить с цитированием
Старый 02.09.2013, 15:45   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Т.е. все те строки второго листа (или только данные строк?), значения из столбца A которых есть в столбце A первого листа (полностью совпадают) нужно скопировать на другой лист?
Возможно в версиях выше 2003 это можно сделать фильтром, нет возможности сейчас проверить.

Макросом сделать несложно - но нужен пример данных. От этого зависит вариант решения.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 02.09.2013, 15:55   #3
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

вот макрос, который решит задачу, как я ее понял (не факт что я угадал, понятие "сравнить данные листа 1 и 2" четко не определено)
Код:
Sub Copy2Last()
  Dim r1 As Long, r2 As Long
  With Worksheets.Add(after:=Worksheets(Worksheets.Count))
    For r1 = 1 To Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row
      If Worksheets(1).Cells(r1, 1) = Worksheets(2).Cells(r1, 1) Then
        r2 = r2 + 1
        Worksheets(2).Rows(r1).Copy Destination:=.Cells(r2, 1)
      End If
    Next
    .Activate
  End With
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 02.09.2013, 16:01   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

На словаре будет быстрее.
Сперва один диапазон запоминаем в словаре, затем второй проверяем по словарю - в зависимости от результат действуем.
Но т.к. ничего конкретного не видим - ничего конкретного не пишу. Да и вообще таких кодов здесь вероятно уже не одна сотня...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 03.09.2013, 08:37   #5
zontique
 
Регистрация: 12.08.2013
Сообщений: 6
По умолчанию Сравнения столбцов с последующим копированием

К сожалению сам файл я выложить не могу, но вот попытался объяснить, что мне нужно во вложении.
Спасибо, что откликнулись.
Вложения
Тип файла: zip programmersforum.zip (8.5 Кб, 7 просмотров)
zontique вне форума Ответить с цитированием
Старый 03.09.2013, 09:58   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Я угадал точнее

Код:
Sub tt()
    Dim a(), i&, ii&

    Application.ScreenUpdating = False

    Worksheets(3).UsedRange.Clear

    With CreateObject("Scripting.Dictionary")
        a = Worksheets(1).[a1].CurrentRegion.Value
        For i = 1 To UBound(a): .Item(a(i, 1)) = 0&: Next
        a = Worksheets(2).[a1].CurrentRegion.Value
        For i = 1 To UBound(a)
            If .exists(a(i, 1)) Then
                ii = ii + 1: a(ii, 1) = a(i, 1): a(ii, 2) = a(i, 2)
            End If
        Next
        Worksheets(3).[a1].Resize(ii, 2) = a
    End With

    Application.ScreenUpdating = True
End Sub
Все листы должны быть как в примере - код писался именно под такой файл.
Рамку рисовать не стал - если очень нужно, то можно добавить.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 09.09.2013, 10:44   #7
zontique
 
Регистрация: 12.08.2013
Сообщений: 6
По умолчанию

Спасибо за макрос, а можно сделать его более универсальным? чтоб листы были не только как в примере?
zontique вне форума Ответить с цитированием
Старый 09.09.2013, 11:39   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Почти абсолютно универсально

Код:
Sub ttt()
    Dim r As Range, a(), i&, ii&

    On Error Resume Next
    With CreateObject("Scripting.Dictionary")

        Set r = Application.InputBox(Prompt:="Выделите первый диапазон для сравнения (1 столбец)", Type:=8)
        If r Is Nothing Then Exit Sub
        a = r.Value
        For i = 1 To UBound(a): .Item(a(i, 1)) = 0&: Next

        Set r = Application.InputBox(Prompt:="Выделите второй диапазон для сравнения (2 смежных столбца!)", Type:=8)
        If r Is Nothing Then Exit Sub
        a = r.Value
        For i = 1 To UBound(a)
            If .exists(a(i, 1)) Then
                ii = ii + 1: a(ii, 1) = a(i, 1): a(ii, 2) = a(i, 2)
            End If
        Next

    End With

    If ii > 0 Then Workbooks.Add(1).Sheets(1).[a1].Resize(ii, 2) = a

End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 09.09.2013, 13:20   #9
zontique
 
Регистрация: 12.08.2013
Сообщений: 6
По умолчанию

Спасибо большое.
zontique вне форума Ответить с цитированием
Старый 12.09.2013, 13:56   #10
zontique
 
Регистрация: 12.08.2013
Сообщений: 6
По умолчанию

Без вашей помощи мне не обойтись, помогите пожалуйста сделать так, чтоб он брал всю строку, а не только 2 столбца.
zontique вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сравнение столбцов excel с последующим добавлением записей из второго списка Николя Microsoft Office Excel 13 01.03.2013 10:36
Удаление повторов с последующим копированием нужной инфы ujen Microsoft Office Excel 4 07.07.2011 01:21
вывод номеров столбцов матрицы и подсчитать количество этих столбцов Vitalina69 Помощь студентам 2 15.02.2011 21:52
Формула для сравнения двух столбцов с выводом результат в третьем ramiras777 Microsoft Office Excel 23 19.03.2010 20:52
Помогите с копированием столбцов. sergiksergik Microsoft Office Excel 6 01.02.2009 22:11