Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 26.02.2018
Сообщений: 5
1
Excel

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

23.07.2018, 17:42. Показов 1938. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, уважаемые ГУРУ VBA!

Задача заключается в следующем, есть книга с двумя листами Лист 1 - Справочник Банков ЦБ (общедоступный банковский справочник), Лист 2 - некая отчетная ведомость, которая также содержит наименование банка и самое главное уникальный КОД (регистрационный номер). Соответственно, требуется сравнить Лист 1 по столбцу D c Листом 2 по столбцу I и из несовпавший строк на новый лист вывести только Наименование банка (столбец B) и Реегистрационный № (столбец D) из справочника.
Перерыл просторы данного чудного ресурса, нашел такое решение, но никак не могу под себя запилить
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Option Explicit
 
Sub compare2()
    Dim a, b, c, d, t$, i&, ii&, iii&, x&, k
    Dim Dic1 As Object
 
    Application.ScreenUpdating = False
 
    '1.
 
    a = Sheets("СПРАВОЧНИК").[d5].CurrentRegion.Value
    b = Sheets("ОТЧЕТЫ").[i3].CurrentRegion.Value
 
    '2.
    ReDim c(1 To UBound(a), 1 To UBound(a, 2))
    ReDim d(1 To UBound(b), 1 To UBound(b, 2))
 
    '3.
    Set Dic1 = CreateObject("Scripting.Dictionary")
 
    With Dic1
        For i = 1 To UBound(a)
            t = a(i, 1)
            .Item(t) = i
        Next
 
        '4.
        For i = 1 To UBound(b)
            t = b(i, 1)
 
            If .exists(t) Then
                .Item(t) = 0
            Else
                iii = iii + 1
                For x = 1 To UBound(b, 2)
                    d(iii, x) = b(i, x)
                Next
            End If
        Next
 
        
        For Each k In .keys
            If .Item(k) <> 0 Then
                i = .Item(k): ii = ii + 1
 
                For x = 1 To UBound(a, 2)
                    c(ii, x) = a(i, x)
                Next
            End If
        Next
    End With
 
    '5.
    With Worksheets.Add(After:=Sheets(Sheets.Count))
        .Name = "НЕТ ОТЧЕТА" & Sheets.Count
        .[a2].Resize(ii, 3) = c
    End With
 
    Application.ScreenUpdating = True
 
End Sub
Вложения
Тип файла: xls Пример.xls (50.5 Кб, 34 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.07.2018, 17:42
Ответы с готовыми решениями:

Сравнить две datagridview (два столбца), выделить несовпадения
Всем привет, помогите, пожалуйста с кодом. Мне нужно сравнить две таблицы. Обе datagrid...

Сравнить два столбца на разных листах. Вывести на Лист3 не совпадающие значения
Private Sub CommandButton3_Click() For I = 2 To 250 For j = 1 To 110 ...

Сравнить два столбца в двух разных файлах MS Excel
Добрый день ув.форумчане! Нужна ваша помощь. Передо мной стоит задача написать макрос который...

Копирование строк по условию с нескольких листов на отдельный лист
Уважаемые знатоки-форумчане! Прошу помощи! Просмотрела все возможные форумы, сайты по теме, не...

10
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,086
23.07.2018, 19:58 2
Может так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub compare3()
    Dim a, b, i&
    Application.ScreenUpdating = False
    a = Sheets("Справочник").UsedRange
    b = Sheets("Отчетная форма").UsedRange.Columns("I")
    With CreateObject("Scripting.Dictionary")
        For i = 4 To UBound(a) '4 так, как 1-я строка пустая
            .Item(a(i, 4)) = a(i, 2)
        Next
        For i = 2 To UBound(b) '2 так, как 1-я строка пустая
            If .exists(b(i, 1)) Then .Remove b(i, 1)
        Next
        Sheets.Add
        ActiveSheet.Name = "НЕТ ОТЧЕТА" & Sheets.Count
        If .Count Then Cells(2, 1).Resize(.Count, 2) = Application.Transpose(Array(.keys, .items))
    End With
    Application.ScreenUpdating = True
End Sub
0
0 / 0 / 0
Регистрация: 26.02.2018
Сообщений: 5
24.07.2018, 08:21  [ТС] 3
toiai, спасибо Вам огромное!!!!И код прекрасно оптимизирован.
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
24.07.2018, 17:27 4
Есть только один момент - изготовитель не гарантирует в таком виде совпадение пар ключ-значение! Хотя обычно оно совпадает.
1
0 / 0 / 0
Регистрация: 26.02.2018
Сообщений: 5
25.07.2018, 09:08  [ТС] 5
Hugo121, Спасибо за комментарий, но как это может повлиять на работу макроса? Какие могут быть проблемы? И можно ли этого избежать, так как данных более 10k, не хотелось бы заниматься дополнительным поиском.
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,086
25.07.2018, 12:56 6
Цитата Сообщение от p1r0m4n Посмотреть сообщение
Какие могут быть проблемы
В коде ключ как число (например поле с значением 10 и 010 будет иметь один ключ-10), если сделать его текстовым то будет два ключа 10 и 010.
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
25.07.2018, 12:57 7
На работу никак не повлияет. А вот проблемы могут быть. Ведь вы ожидаете в одной строке увидеть пару ключ-значение, а можете увидеть не пару...
Выход - перебирать в цикле ключи и каждому извлекать его значение.
0
0 / 0 / 0
Регистрация: 26.02.2018
Сообщений: 5
27.07.2018, 17:15  [ТС] 8
Господа, всем огромное спасибо за проявленный интерес к данной теме, и реализованное решение. Но как это бывает задача уже обросла массой доработок, которые я пусть и коряво, но вроде сам реализовал.
Например, появилась необходимость в еще одном столбце, который бы копировался с форматами ячеек с все того же листа Справочник, и фильтрации по убыванию по этому столбцу. Вроде все работает, но столкнулся с проблемой, которую без ваших советов решить никак не могу.
Когда данные вставляются на соответствующий лист из словаря, то происходит автоматическое форматирование ячеек содержащих "/" в формат даты, что не позволяет в дальнейшем использовать эти данные для копирования еще одного столбца. Пример прилагаю...
Один из банков имеет номер "1/9" при вставке данного номера в ячейку из словаря оно встаёт как "09.янв"или 43109....
Как вставить данные из словаря так, чтобы избежать этой проблемы....
Вложения
Тип файла: xls ПРИМЕР.xls (50.0 Кб, 15 просмотров)
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
27.07.2018, 21:09 9
Visual Basic
1
2
3
4
        If .Count Then
         Cells(1, 1).Resize(.Count, 2).NumberFormat = "@"
         Cells(1, 1).Resize(.Count, 2).Value = Application.Transpose(Array(.keys, .items))
        End If
0
0 / 0 / 0
Регистрация: 26.02.2018
Сообщений: 5
30.07.2018, 12:37  [ТС] 10
Hugo121,
Спасибо огромное, как просто!!!!
0
0 / 0 / 0
Регистрация: 06.09.2018
Сообщений: 25
23.01.2019, 16:56 11
toiai, Добрый день! Помогите,пожалуйста! Не могу оптимизировать данный код под свою задачу, хотя она немного схожа.
У меня тоже несколько листов, только сравнивать нужно не столбцы, а одну ячейку со столбцом. В листе "Новый заказ" я ввожу данные (рис.1), затем нажимаю кнопку "готово" и значения переносятся на лист "Клиенты" (рис.2), но нужно так, чтобы данные эти не дублировались, если уже были когда-то там занесены. Проверка осуществляется по значению "VIN" в ячейке C2 лист "Новый заказ" и столбец E лист "Клиенты". Файл с примером я выкладывал в другой теме: Сравнение значений между листами (почему-то сайт не дает вложить этот файл повторно).

Очень надеюсь на Вашу помощь! Заранее спасибо!
Миниатюры
Сравнить два столбца с разных листов и вывести несовпадения на отдельный лист   Сравнить два столбца с разных листов и вывести несовпадения на отдельный лист  
0
23.01.2019, 16:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2019, 16:56
Помогаю со студенческими работами здесь

Выборка со всех листов по условию и копирование на отдельный лист
Здравствуйте. Задача: Имеются 32 листа с разным количеством строк данных (фио, лич.номер, возраст,...

Соединить данные с разных листов в один лист
Добрый день! Очень срочно понадобилось освоить VBA и выполнить определённое задание. Я его...

С разных листов в одной книге собрать данные на новый лист
Добрый день. Прошу помощи. Необходимо с разных листов в одной книге EXCEL, собрать данные на новый...

Отсортировать и вывести на отдельный лист по критерию
Ребята всем привет:) Есть изначальные данные четыре столбца А - Дата; В-Контрагент; С-Товар;...

Вывести столбец с результатами выражения на отдельный лист
Необходимо результат вычисления данных на одном листе представить в виде столбца в другом....

Вывод результатов из одной таблицы и одного столбца в два разных столбца
Ребят помогите, измучалась совсем, не знаю как решить. Есть таблица Таблица t2 Id Pid ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru