0 / 0 / 0
Регистрация: 15.04.2013
Сообщений: 7
1

Сравнить две таблицы

15.04.2013, 15:20. Показов 2530. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Необходимо сравнить две таблички, в первом листе в одном столбике неповторяющееся номера, а в следующих трех столбах цены, которые соответствуют номерам, во втором листе то же самое, нужно сравнить таблицы, чтобы в третьем листе было совпавшие номера и все 6 цен для них. Табличка прилагается.
Вложения
Тип файла: xlsx Лист Microsoft Excel.xlsx (11.4 Кб, 36 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.04.2013, 15:20
Ответы с готовыми решениями:

Сравнить две таблицы Excel
Ребят подскажите. Хочу немного упростить себе задачу, а точней автоматизировать сравнение столбцов...

Сравнить две таблицы на листе в Excel
Форумчане, доброго времяни суток) Ковыряясь в Excel VBA сталкнулся с проблемкой для себя,и...

Сравнить в Excel две таблицы по разным параметрам
Добрый всем день! помогите пожалуйста, есть две таблицы с разным кол-вом столбцов (14 и 8) и...

Как сравнить две таблицы и совпадающие элементы перенести в другую таблицу
Помогите пожалуйста! ни как не могу сообразить! Необходимо написать макрос который сравнивает две...

14
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,518
16.04.2013, 07:38 2
Для работы кода, нужно в VBA подключить библиотеку:
Tools - References... - Microsoft Scripting Runtime.

Кликните здесь для просмотра всего текста
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
Sub Procedure_1()
    
    'Для работы кода нужно подключить библиотеку:
    'Tools - References... - Microsoft Scripting Runtime.
    
    Dim myArray() As Variant
    Dim myDictionary As New Scripting.Dictionary
    Dim myLastRow As Long
    Dim myDictionaryNumber As Long
    Dim i As Long, j As Long
    
    '1. Берём данные из первого Excel-листа в массив "myArray"
        '(в некоторых случаях быстрее работать с VBA-массивом,
        'чем с Excel-ячейками).
    '1.1. Определяем, сколько данных взять. Для этого определяем
        'последнюю строку с данными на Excel-листе. Определять
        'последнюю строку с данными буду по столбцу "A".
        'Код сделает действие как в программе "Excel",
        'если перейти в последнюю ячейку столбца "A" и
        'нажать сочетание клавиш "Ctrl + Стрелка вверх".
    myLastRow = Worksheets(1).Range("A" & Rows.Count).End(xlUp).Row
    '1.2. Берём данные в массив.
    myArray() = Worksheets(1).Range("A1:A" & myLastRow).Value
 
    '2. Берём данные из второго Excel-листа в словарь "myDictionary"
        '(в некоторых случаях быстрее работать со словарём, чем с VBA-массивом).
    '2.1. Определяем, сколько данных взять.
    myLastRow = Worksheets(2).Range("A" & Rows.Count).End(xlUp).Row
    '2.2. Берём данные в словарь.
        'В "Item" формируем порядковые номера, которые понадобятся, чтобы
        'брать данные из Excel-листа из нужных строк.
    For i = 1 To myLastRow Step 1
        myDictionary.Add Key:=Worksheets(2).Cells(i, "A").Value, Item:=i
    Next i
    
    '3. Дальше переменную "myLastRow" буду использовать, чтобы
        'заносить данные на третий Excel-лист.
    myLastRow = 2
    
    '4. Проходимся по всем элементам массива "myArray" и смотрим,
        'встречаются ли в словаре такие же данные.
    '"Ubound" - в данном случае это количество строк в VBA-массиве.
    For i = 1 To UBound(myArray) Step 1
        'Смотрим, есть ли такие же данные в словаре.
        If myDictionary.Exists(Key:=myArray(i, 1)) = True Then
        
            'Для удобства написания кода, берём порядковый номер
                'в переменную.
            myDictionaryNumber = myDictionary.Item(Key:=myArray(i, 1))
        
            'Если есть, то переносим данные на третий Excel-лист.
            
                Worksheets(3).Range("A" & myLastRow & ":D" & myLastRow).Value = _
                    Worksheets(1).Range("A" & i & ":D" & i).Value
            
                Worksheets(3).Range("E" & myLastRow & ":G" & myLastRow).Value = _
                    Worksheets(2).Range("B" & myDictionaryNumber & ":D" & myDictionaryNumber).Value
                
            'Переход к следующей строке на третьем листе.
            myLastRow = myLastRow + 1
            
        End If
    Next i
    
End Sub



Примечание

В код можно добавить команды для ускорения работы кода, которые отключат обновление монитора, пересчёт формул, обработку событий. После работы кода можно всё обратно включить с помощью самого кода.
2
0 / 0 / 0
Регистрация: 15.04.2013
Сообщений: 7
16.04.2013, 11:05  [ТС] 3
Спасибо, попробую.

Добавлено через 31 минуту
Всё работает, очень выручил, ещё раз спасибо.

Добавлено через 2 часа 30 минут
Что нужно поменять в коде, чтобы поиск осуществлялся и в буквах. У меня некоторые номера были одновременно с наименованиями и когда я запускал макрос, выдавало ошибку.
0
Модератор
Эксперт MS Access
11956 / 4824 / 779
Регистрация: 07.08.2010
Сообщений: 14,128
Записей в блоге: 4
16.04.2013, 11:25 4
а не подскажете, как получить объединение этих листов
111111111 11 12 13 21 21 23
111111112 11 12 13 ** ** **
111111113 ** ** ** 21 22 23
111111114 11 12 13 21 22 23
чтобы видеть
--что было и ушло
--что прибавилось
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,518
16.04.2013, 15:38 5
Zzz666, выложите Excel-книгу с примерными данными и на основе выложенной книги поясните, что нужно сделать.


shanemac51, выложите пример Excel-книги, без книги не понятно, что вам нужно.
0
0 / 0 / 0
Регистрация: 15.04.2013
Сообщений: 7
18.04.2013, 08:33  [ТС] 6
Вот табличка.
Вложения
Тип файла: rar Лист Microsoft Excel.rar (19.6 Кб, 20 просмотров)
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,518
18.04.2013, 08:44 7
Zzz666, а что неправильно делает код из сообщения #2 в Excel-книге из сообщения #6?
0
Модератор
Эксперт MS Access
11956 / 4824 / 779
Регистрация: 07.08.2010
Сообщений: 14,128
Записей в блоге: 4
18.04.2013, 09:02 8
Цитата Сообщение от Скрипт Посмотреть сообщение
shanemac51, выложите пример Excel-книги, без книги не понятно, что вам нужно.
вот пример
Вложения
Тип файла: xls 130418em.xls (19.5 Кб, 18 просмотров)
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,518
18.04.2013, 09:48 9
shanemac51, код без сортировки, для книги, которую я выложил. Результат выводится на третий лист.

Кликните здесь для просмотра всего текста
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
Sub Procedure_1()
    
    'Для работы кода нужно подключить библиотеку:
    'Tools - References... - Microsoft Scripting Runtime.
    
    Dim myArray() As Variant
    Dim myDictionary As New Scripting.Dictionary
    Dim myLastRow As Long
    Dim myDictionaryNumber As Long
    Dim i As Long, j As Long
    
    '1. Берём данные из первого Excel-листа в массив "myArray"
        '(в некоторых случаях быстрее работать с VBA-массивом,
        'чем с Excel-ячейками).
    '1.1. Определяем, сколько данных взять. Для этого определяем
        'последнюю строку с данными на Excel-листе. Определять
        'последнюю строку с данными буду по столбцу "A".
        'Код сделает действие как в программе "Excel",
        'если перейти в последнюю ячейку столбца "A" и
        'нажать сочетание клавиш "Ctrl + Стрелка вверх".
    myLastRow = Worksheets(1).Range("A" & Rows.Count).End(xlUp).Row
    '1.2. Берём данные в массив.
    myArray() = Worksheets(1).Range("A1:A" & myLastRow).Value
 
    '2. Берём данные из второго Excel-листа в словарь "myDictionary"
        '(в некоторых случаях быстрее работать со словарём, чем с VBA-массивом).
    '2.1. Определяем, сколько данных взять.
    myLastRow = Worksheets(2).Range("A" & Rows.Count).End(xlUp).Row
    '2.2. Берём данные в словарь.
        'В "Item" формируем порядковые номера, которые понадобятся, чтобы
        'брать данные из Excel-листа из нужных строк.
    For i = 1 To myLastRow Step 1
        myDictionary.Add Key:=Worksheets(2).Cells(i, "A").Value, Item:=i
    Next i
    
    '3. Дальше переменную "myLastRow" буду использовать, чтобы
        'заносить данные на третий Excel-лист.
    myLastRow = 1
    
    '4. Проходимся по всем элементам массива "myArray" и смотрим,
        'встречаются ли в словаре такие же данные.
    '"Ubound" - в данном случае это количество строк в VBA-массиве.
    For i = 1 To UBound(myArray) Step 1
    
        '4.1. Переносим данные из первого листа на третий лист.
        Worksheets(3).Range("A" & myLastRow & ":D" & myLastRow).Value = _
            Worksheets(1).Range("A" & i & ":D" & i).Value
            
        '4.2. Смотрим, есть ли такие же данные в словаре.
        If myDictionary.Exists(Key:=myArray(i, 1)) = True Then
        
            '4.2. Для удобства написания кода, берём порядковый номер
                'в переменную.
            myDictionaryNumber = myDictionary.Item(Key:=myArray(i, 1))
        
            '4.3. Если есть, то переносим данные на третий Excel-лист.
                Worksheets(3).Range("E" & myLastRow & ":G" & myLastRow).Value = _
                    Worksheets(2).Range("B" & myDictionaryNumber & ":D" & myDictionaryNumber).Value
                    
            '4.4. Удаляем обработанный элемент словаря.
                'Затем оставшиеся элементы просто перенесём на третий лист.
            myDictionary.Remove Key:=myArray(i, 1)
                
        End If
                
        '5. Переход к следующей строке на третьем листе.
        myLastRow = myLastRow + 1
            
    Next i
    
    '6. Переносим данные из словаря.
    For i = 0 To myDictionary.Count - 1 Step 1
        
        '6.1. Для удобства написания кода, берём порядковый номер
            'в переменную.
        myDictionaryNumber = myDictionary.Items(i)
        
        '6.2. Переносим данные.
        'Обратите внимание, что доступ по порядковому номеру можно получить
            'только через объект "Keys", а не "Key".
        Worksheets(3).Range("A" & myLastRow).Value = myDictionary.Keys(i)
        
        'Обратите внимание, что доступ по порядковому номеру можно получить
            'только через объект "Items", а не "Item".
        Worksheets(3).Range("E" & myLastRow & ":G" & myLastRow).Value = _
            Worksheets(2).Range("B" & myDictionaryNumber & ":D" & myDictionaryNumber).Value
            
        '6.3. Переход к следующей строке.
        myLastRow = myLastRow + 1
        
    Next i
    
End Sub
Вложения
Тип файла: xls 130418em.xls (37.0 Кб, 18 просмотров)
0
0 / 0 / 0
Регистрация: 15.04.2013
Сообщений: 7
18.04.2013, 11:22  [ТС] 10
Вот это гляньте, по ходу при большом объема строк, код перестает работать.
Вложения
Тип файла: rar Лист Microsoft Excel.rar (35.9 Кб, 11 просмотров)
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,518
18.04.2013, 12:29 11
Zzz666, макрос написан с учётом того, что на втором листе в столбце "A" находятся только уникальные значения.

Ошибка в коде возникает потому, что на втором листе в столбце "A" есть повторящиеся данные.

Нужно переделать код под эти новые условия?
0
0 / 0 / 0
Регистрация: 15.04.2013
Сообщений: 7
18.04.2013, 16:01  [ТС] 12
Если конечно вам не сложно, переделайте пожалуйста.
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,518
18.04.2013, 16:03 13
Zzz666, т.е. если несколько совпадений, то так и продолжать вправо заполнять Excel-лист. Т.е. если два совпадения, то будет 7 столбцов задействовано, если 3 совпадения, то 10 и т.д.?
0
0 / 0 / 0
Регистрация: 15.04.2013
Сообщений: 7
19.04.2013, 10:03  [ТС] 14
Если на втором столбце есть повторы, то лучше продублировать строку с первого листа и забить значения со второго листа повторяющейся позиции.
0
0 / 0 / 0
Регистрация: 15.04.2013
Сообщений: 7
22.04.2013, 10:09  [ТС] 15
Скрипт, забыли про эту тему?
0
22.04.2013, 10:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.04.2013, 10:09
Помогаю со студенческими работами здесь

VBA Access. Сравнить две даты
Как проверить дату, на вхождение в диапазон? Пробовал так: strtimef = CStr(Me.date_fie) + " "...

В две таблицы на оисте добавление строки внизу таблицы
Добрый день! Надеюсь не ошибся с темой! Тема эта изъезженная до нельзя, но решения не смог...

Сравнить столбцы таблицы одной книги со столбцами таблицы другой книги
Здравствуйте! такая проблемка... недавно только работаю с Basic, необходимо решить задачу, а...

Сравнить две таблицы и заполнить в третьей таблицы
Привет всем, скажите как из тех 2 таблицы заполнить в третью таблицу.. В первом таблице(ТП) есть...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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