Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/40: Рейтинг темы: голосов - 40, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 41

Сравнение двух списков и вывод разницы между ними

27.08.2013, 17:14. Показов 8583. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть два списка. на первом листе ФИО и дата рождения и на втором листе ФИО и дата рождения. Надо сравнить эти списки по всей строке и на третий лист вывести разницу между ними. желательно макросом. помогите.

Добавлено через 1 час 5 минут
смог написать только для вывода одинаковых строк, т.е. строка на первом и на втором листе совпадает, и если совпала, то выводиться на третий.

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
Sub Поиск()
 
Dim i As Long
Dim j As Long
Dim y As Long
Dim p As Long
 
Dim List1Count As Long, List2Count As Long
List1Count = Sheet1.UsedRange.Rows.Count
List2Count = Sheet2.UsedRange.Rows.Count
 
y = 0 
p = 0
 
For i = 1 To List2Count 
p = 0
    For j = 1 To List1Count 
        
        If LCase(Sheet2.Cells(i, 1)) = LCase(Sheet1.Cells(j, 1)) And _
           LCase(Sheet2.Cells(i, 2)) = LCase(Sheet1.Cells(j, 2)) And _
           LCase(Sheet2.Cells(i, 3)) = LCase(Sheet1.Cells(j, 3)) And _
           LCase(Sheet2.Cells(i, 4)) = LCase(Sheet1.Cells(j, 4)) And _
           LCase(Sheet2.Cells(i, 3)) = LCase(Sheet1.Cells(j, 3)) Then
        y = y + 1
        
            Sheet3.Cells(y, 1) = Sheet2.Cells(i, 1)
            Sheet3.Cells(y, 2) = Sheet2.Cells(i, 2)
            Sheet3.Cells(y, 3) = Sheet2.Cells(i, 3)
            Sheet3.Cells(y, 4) = Sheet2.Cells(i, 4)
            Sheet3.Cells(y, 5) = Sheet2.Cells(i, 5)
            
         End If 
  Next j
  
Sheet3.Cells(1, 11) = CSng(i * 100 / List2Count)
DoEvents
Next i 
 
MsgBox "Список верен!"
End Sub
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.08.2013, 17:14
Ответы с готовыми решениями:

Сравнение двух дат и вывод дат находящихся между ними
Здравствуйте! Тут такое дело, вводятся две определенные ДАТЫ в Edit1 и Edit2 в формате ДД.ММ.ГГГГ, нужно найти все ДАТЫ, которые...

Сравнение двух текстовых переменных и вывод их разницы в виде текста что отличается в двух массивах
Есть две текстовых переменных типа string. Необходимо вывести в третью переменную, разницу этих двух переменных т.е. первая переменная =...

Сравнение двух текстовых списков с выводом "разницы"
Здравствуйте! VBA знаю плохо, на уровне создания элементарных макросов и редактирования чужих. Есть два списка слов: Список1 и...

15
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
27.08.2013, 17:47
Пример приложи в строк 50, проще тестировать или считаете, что основу сами набивать будем?
0
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 41
27.08.2013, 17:58  [ТС]
вот основа
Вложения
Тип файла: xlsx Книга2.xlsx (17.8 Кб, 54 просмотров)
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
27.08.2013, 18:08
Может достаточно сверку вести по коду в колонке А?
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
27.08.2013, 18:16
В общем случае UsedRange.Rows.Count не равно последней строке. Может быть меньше.
Это в общем случае. Тут возможно равно. Но может быть и намного больше. В любом случае не нужно привыкать так писать.
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,736
Записей в блоге: 14
27.08.2013, 18:37
Можно ли считать, что ФИО и дата рождения записаны строкой по одной в ячейке? Если да, то нужно использовать словарь.

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
Sub compRanges(Rg1 As Range, Rg2 As Range)
Dim Dict As Scripting.Dictionary
Dim w    As Range
 
    Set Dict = New Dictionary
    
    '::: Грузим весь первый в словарь
    
    n& = 0
    
    For Each w In Rg1
        Dict.Add CStr(w.Value), n&
        n& = n& + 1
    Next
    
    '::: Проверяем второй
    
    For Each w In Rg2
        If Not Dict.Exists(CStr(w.Value)) Then Debug.Print "Нет в первом, есть во втором: "; w.Value
    Next
    
    Dict.RemoveAll
        
    '::: Грузим весь второй в словарь
    
    n& = 0
    
    For Each w In Rg2
        Dict.Add CStr(w.Value), n&
        n& = n& + 1
    Next
    
    '::: Проверяем первый
    
    For Each w In Rg1
        If Not Dict.Exists(CStr(w.Value)) Then Debug.Print "Нет во втором, есть в первом: "; w.Value
    Next
        
    Set Dict = Nothing
 
End Sub
 
Sub Test()
Dim Rg1 As Range
Dim Rg2 As Range
 
    Set Rg1 = Range("A1:A7")
    Set Rg2 = Range("B1:B7")
    
    compRanges Rg1, Rg2
 
End Sub
Расхождения здесь выводятся в окно Immediate, но никто не мешает занести их на лист.
0
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 41
28.08.2013, 08:57  [ТС]
нет, фио и дата рождения это все разные ячейки. Фамилия -1 ячейка, Имя - вторая ячейка, отчество - третья, а дата рождения 4 ячейка соответсвенно

Добавлено через 1 минуту
toiai, можно и по колонке А. мне хоть как-нить.
0
 Аватар для Апострофф
9908 / 3928 / 742
Регистрация: 11.10.2011
Сообщений: 5,908
28.08.2013, 09:14
Lander13, поясните, что есть разница между списками?
0
28.08.2013, 09:15

Не по теме:

Апострофф, он имел ввиду "отличия списков", наверное.

0
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 41
28.08.2013, 09:46  [ТС]
Апострофф, что есть в одном списке, но нету в другом.
0
 Аватар для Апострофф
9908 / 3928 / 742
Регистрация: 11.10.2011
Сообщений: 5,908
28.08.2013, 10:04
А если есть в другом, но нет в первом - тогда что делать?
Можно сформулировать вопрос более доступно?
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
28.08.2013, 10:38
Лучший ответ Сообщение было отмечено как решение

Решение

5 шагов на словаре/массивах:
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
Option Explicit
 
Sub compare()
    Dim a, b, c, t$, i&, ii&, x&, k
 
    '1.
 
    a = Sheets(1).[a1].CurrentRegion.Value
    b = Sheets(2).[a1].CurrentRegion.Value
 
    '2.
    ReDim c(1 To UBound(a) + UBound(b), 1 To UBound(a, 2))
 
    '3.
    With CreateObject("Scripting.Dictionary")
        For i = 1 To UBound(a)
            t = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4) & "|" & a(i, 5)
            .Item(t) = i
        Next
 
        '4.
        For i = 1 To UBound(b)
            t = b(i, 1) & "|" & b(i, 2) & "|" & b(i, 3) & "|" & b(i, 4) & "|" & b(i, 5)
 
            If .exists(t) Then
                .Item(t) = 0
            Else
                ii = ii + 1
                For x = 1 To UBound(b, 2)
                    c(ii, 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 Sheets(3)
    .[e1].Resize(ii).NumberFormat = "@"
    .[a1].Resize(ii, 5) = c
    End With
End Sub
4
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,736
Записей в блоге: 14
28.08.2013, 11:25
Цитата Сообщение от Lander13 Посмотреть сообщение
нет, фио и дата рождения это все разные ячейки. Фамилия -1 ячейка, Имя - вторая ячейка, отчество - третья, а дата рождения 4 ячейка соответсвенно
- так мой код можно модифицировать и на этот случай.
1
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
28.08.2013, 19:07
Лучший ответ Сообщение было отмечено как решение

Решение

Осмелюсь предложить вариант с использованием запросов, сравнение по первой колонке:
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
Sub ViborDataList()
    Dim sCon$, rs As Object, cn As Object
    Dim sSQL$
    Set cn = CreateObject("ADODB.Connection")
    Select Case CLng(Split(Application.Version, ".")(0))
        Case Is < 12
            sCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName _
              & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
        Case Is >= 12
            sCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName _
            & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
    End Select
 
    sSQL = "SELECT a.* " _
        & " FROM [Лист1$A:E] AS a" _
        & " WHERE a.Kod NOT IN (SELECT b.Kod FROM [Лист2$A:E] AS b)"
    cn.Open sCon
    Set rs = cn.Execute(sSQL)
    With Sheets("Лист3")
        .Cells(.UsedRange.Rows.Count + 1, 1).CopyFromRecordset rs
    End With
    Set rs = Nothing
    cn.Close
    sSQL = "SELECT b.* " _
        & " FROM [Лист2$A:E] AS b" _
        & " WHERE b.Kod NOT IN (SELECT a.Kod FROM [Лист1$A:E] AS a)"
    cn.Open sCon
    Set rs = cn.Execute(sSQL)
    With Sheets("Лист3")
        .Cells(.UsedRange.Rows.Count + 1, 1).CopyFromRecordset rs
    End With
End Sub
Пытался объединить запросы в один, но не получилось...
Вложения
Тип файла: zip Книга2_ выбор данных из листов.zip (25.3 Кб, 49 просмотров)
3
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,736
Записей в блоге: 14
28.08.2013, 19:46
Не понимаю, чего париться?.. Вот код:

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
62
63
64
65
66
67
68
69
70
71
72
73
'::: Sh1 - лист с первым списком
'::: aC1() - массив из 4-х элементов с номерами колонок 1-го списка
'::: b1,e1 - первая и последняя строки 1-го списка
 
'::: Sh2 - лист со вторым списком
'::: aC2() - массив из 4-х элементов с номерами колонок 2-го списка
'::: b2,e2 - первая и последняя строки 2-го списка
 
'::: Не забудьте установить ссылку на Microsoft.Scripting
 
Sub compRanges(sh1 As Worksheet, aC1() As Integer, b1 As Long, e1 As Long, _
               sh2 As Worksheet, aC2() As Integer, b2 As Long, e2 As Long)
Dim Dict As Scripting.Dictionary
    Set Dict = New Dictionary
    '::: Грузим весь первый в словарь
    n& = 0
    For i& = b1 To e1
        Key$ = ""
        For j% = 1 To 4
            Key$ = Key$ & Trim$(sh1.Cells(i&, aC1(j%))) & " "
        Next j%
        Dict.Add CStr(Key$), n&
        n& = n& + 1
    Next
    '::: Проверяем второй
    For i& = b2 To e2
        Key$ = ""
        For j% = 1 To 4
            Key$ = Key$ & Trim$(sh2.Cells(i&, aC2(j%))) & " "
        Next j%
        If Not Dict.Exists(Key$) Then Debug.Print "Нет в первом, есть во втором: "; Key$
    Next i&
    Dict.RemoveAll
    '::: Грузим весь второй в словарь
    n& = 0
    For i& = b2 To e2
        Key$ = ""
        For j% = 1 To 4
            Key$ = Key$ & Trim$(sh1.Cells(i&, aC2(j%))) & " "
        Next j%
        Dict.Add CStr(Key$), n&
        n& = n& + 1
    Next
    '::: Проверяем первый
    For i& = b1 To e1
        Key$ = ""
        For j% = 1 To 4
            Key$ = Key$ & Trim$(sh2.Cells(i&, aC1(j%))) & " "
        Next j%
        If Not Dict.Exists(Key$) Then Debug.Print "Нет во втором, есть в первом: "; Key$
    Next i&
    Set Dict = Nothing
End Sub
 
Sub Test()
Dim C1(1 To 4) As Integer
Dim C2(1 To 4) As Integer
    C1(1) = 1
    C1(2) = 2
    C1(3) = 3
    C1(4) = 4
    C2(1) = 7
    C2(2) = 8
    C2(3) = 9
    C2(4) = 10
 
    '::: Сравниваем списки с третьего листа: 
    '::: первый - в колонках 1-4; второй - в 7-10
 
    compRanges Sheets(3), C1(), 1, 5, _
               Sheets(3), C2(), 1, 5
 
End Sub
Все работает. См. картинки:
Миниатюры
Сравнение двух списков и вывод разницы между ними   Сравнение двух списков и вывод разницы между ними  
1
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
28.08.2013, 21:37
Лучший ответ Сообщение было отмечено как решение

Решение

Ребята, очень понравились ваши решения!

Решил добавить от себя еще одно - с использованием метода ColumnDifferences.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub ListDifferencesWithColumnDifferences()
    Dim s(2) As Worksheet, r(2) As Range
    For i = 0 To 2
        Set s(i) = Sheets(i + 1)
        Set r(i) = s(i).Range(s(i).Cells(1), s(i).Cells(65535, 1).End(xlUp))
    Next i
    For i = 0 To 1
        With r(i).Offset(, 5)
            .FormulaR1C1 = "=ISNA(VLOOKUP(RC1," & s(1 - i).Name _
            & "!" & r(1 - i).Address(ReferenceStyle:=xlR1C1) & ",1,0))"
            .Value = .Value
            .Cells(1) = False
            .ColumnDifferences(.Cells(1)).EntireRow.Copy r(2).Offset(1).EntireRow
            .ClearContents
            Set r(2) = r(2).End(xlDown)
        End With
    Next i
    s(2).Columns(6).ClearContents
End Sub
С уважением,
Aksima
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.08.2013, 21:37
Помогаю со студенческими работами здесь

Объединение, сечение, разницы, симметричной разности двух списков
Здравствуйте, помогите пожалуйста написать программу... сроки поджимают. Задача состоит в следующем: Создать списки L1 и L2,...

ПО для сопоставления файлов, определения разницы между ними, выделения Delta/Diff
Добрый вечер! Ищу программу, под Windows 7/10, которая сможет прожевать стопку из 20-30 файлов по 3-5 гигабайт, и сделать из них...

Вывод на экран в одну строку двух строк из текстового файла со вставленной между ними заданной строкой
Здравствуйте. Нубский вопрос, но вменяемый ответ найти не получилось. Суть дела такова: есть текстовый файл в котором записаны 2...

Сравнение двух таблиц с записью разницы в первую VBA
Прошу помощи! Две таблицы (для удобства можете разбить на два файла или же запихнуть обе на один лист). Нужно: 1) сравнить...

Сравнение двух книг с записью разницы значений в третью книгу
Доброго времени суток. С VBA познакомился неделю назад, и поэтому следующая задача оказалась для меня трудноватой. Итак: существует файл...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru