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

Вход

Регистрация

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

 

= Мир MS Excel/Сравнение двух таблиц с выделением различий цветом - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Сравнение двух таблиц с выделением различий цветом
ericcom Дата: Среда, 02.02.2022, 16:53 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Коллег, помогите сравнить два листа с таблицами.
Лист S2 - эталон.
Лист S1 - был отредактирован.
Ели были внесены изменения в ячейках - макрос отлично справляется и выделяет цветом строку и ячейку с изменениями.
Но если в таблицу на листе S1 была добавлена новая строка - получается хаус!
Подскажите, как прикрутить вариант, если была добавлена новая строка, чтоб она тоже выделялась?
[vba]
Код

Sub Сравнение()
   Dim i As Long, j As Long, a, b
   Dim t As Date
   Dim Cout_r As Variant
   t = Timer
   a = Sheets("S2").UsedRange
   Application.ScreenUpdating = False
   With Sheets("S1")
      b = .Range(.cells(1), .cells(UBound(a), UBound(a, 2)))
      For i = 1 To UBound(a)
        Cout_r = 1
         For j = 1 To UBound(a, 2)
            If a(i, j) <> b(i, j) Then
                If Cout_r = 1 Then
                    Cout_r = 2
                    .Rows(i).Select
                    With Selection.Interior
                        .Pattern = xlSolid
                        .PatternColorIndex = xlAutomatic
                        .ThemeColor = xlThemeColorAccent2
                        .TintAndShade = 0.599993896298105
                        .PatternTintAndShade = 0
                    End With
                End If
               .cells(i, j).Select
                With Selection.Interior
                .Pattern = xlSolid
                .PatternColorIndex = xlAutomatic
                .ThemeColor = xlThemeColorAccent5
                .TintAndShade = 0.599993896298105
                .PatternTintAndShade = 0
                End With
            End If
         Next j
      Next i
   End With
   Application.ScreenUpdating = True
   Debug.Print Format(Timer - t, "#0.00")
End Sub
[/vba]
 
Ответить
СообщениеКоллег, помогите сравнить два листа с таблицами.
Лист S2 - эталон.
Лист S1 - был отредактирован.
Ели были внесены изменения в ячейках - макрос отлично справляется и выделяет цветом строку и ячейку с изменениями.
Но если в таблицу на листе S1 была добавлена новая строка - получается хаус!
Подскажите, как прикрутить вариант, если была добавлена новая строка, чтоб она тоже выделялась?
[vba]
Код

Sub Сравнение()
   Dim i As Long, j As Long, a, b
   Dim t As Date
   Dim Cout_r As Variant
   t = Timer
   a = Sheets("S2").UsedRange
   Application.ScreenUpdating = False
   With Sheets("S1")
      b = .Range(.cells(1), .cells(UBound(a), UBound(a, 2)))
      For i = 1 To UBound(a)
        Cout_r = 1
         For j = 1 To UBound(a, 2)
            If a(i, j) <> b(i, j) Then
                If Cout_r = 1 Then
                    Cout_r = 2
                    .Rows(i).Select
                    With Selection.Interior
                        .Pattern = xlSolid
                        .PatternColorIndex = xlAutomatic
                        .ThemeColor = xlThemeColorAccent2
                        .TintAndShade = 0.599993896298105
                        .PatternTintAndShade = 0
                    End With
                End If
               .cells(i, j).Select
                With Selection.Interior
                .Pattern = xlSolid
                .PatternColorIndex = xlAutomatic
                .ThemeColor = xlThemeColorAccent5
                .TintAndShade = 0.599993896298105
                .PatternTintAndShade = 0
                End With
            End If
         Next j
      Next i
   End With
   Application.ScreenUpdating = True
   Debug.Print Format(Timer - t, "#0.00")
End Sub
[/vba]

Автор - ericcom
Дата добавления - 02.02.2022 в 16:53
Pelena Дата: Среда, 02.02.2022, 21:35 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 19403
Репутация: 4554 ±
Замечаний: ±

Excel 365 & Mac Excel
Встроенная надстройка Inquire не вариант?


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

Автор - Pelena
Дата добавления - 02.02.2022 в 21:35
ericcom Дата: Четверг, 03.02.2022, 08:20 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Встроенная надстройка Inquire не вариант?


Нет, надстройки не вариант.
 
Ответить
Сообщение
Встроенная надстройка Inquire не вариант?


Нет, надстройки не вариант.

Автор - ericcom
Дата добавления - 03.02.2022 в 08:20
Nic70y Дата: Четверг, 03.02.2022, 08:23 | Сообщение № 4
Группа: Друзья
Ранг: Экселист
Сообщений: 9001
Репутация: 2367 ±
Замечаний: 0% ±

Excel 2010
ericcom, файл-пример-эксель приложите


ЮMoney 41001841029809
 
Ответить
Сообщениеericcom, файл-пример-эксель приложите

Автор - Nic70y
Дата добавления - 03.02.2022 в 08:23
ericcom Дата: Четверг, 03.02.2022, 08:58 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Nic70y, Запуск макроса с листа S1
К сообщению приложен файл: 5806303.xlsm (61.0 Kb)
 
Ответить
СообщениеNic70y, Запуск макроса с листа S1

Автор - ericcom
Дата добавления - 03.02.2022 в 08:58
Nic70y Дата: Четверг, 03.02.2022, 09:47 | Сообщение № 6
Группа: Друзья
Ранг: Экселист
Сообщений: 9001
Репутация: 2367 ±
Замечаний: 0% ±

Excel 2010
[vba]
Код
Sub u_700()
    Application.ScreenUpdating = False
    a = Application.Match("ИТОГО", Range("b:b"), 0) - 1
    For b = 5 To a 'с 5-ой до строки, где ИТОГО (не включая)
        c = Application.Match(Range("b" & b), Sheets("S2").Range("b:b"), 0) '=ПОИСКПОЗ(
        d = Application.IsNumber(c) '=ЕЧИСЛО
        If d Then
            For e = 3 To 34 'с 3-го до 34 столбца
                f = Cells(b, e).Offset(0, -1).Interior.Color
                If Cells(b, e) <> Sheets("S2").Cells(c, e) Then
                    Cells(b, e).Interior.Color = 15652797
                    If f = 16777215 Then Range(Cells(b, 1), Cells(b, e - 1)).Interior.Color = 11389944
                Else
                    If f <> 16777215 Then Cells(b, e).Interior.Color = 11389944
                End If
            Next
        Else
            Range("a" & b & ":ah" & b).Interior.Color = 15652797
        End If
    Next
    Application.ScreenUpdating = False
End Sub
[/vba]
К сообщению приложен файл: 117.xlsm (59.9 Kb)


ЮMoney 41001841029809
 
Ответить
Сообщение[vba]
Код
Sub u_700()
    Application.ScreenUpdating = False
    a = Application.Match("ИТОГО", Range("b:b"), 0) - 1
    For b = 5 To a 'с 5-ой до строки, где ИТОГО (не включая)
        c = Application.Match(Range("b" & b), Sheets("S2").Range("b:b"), 0) '=ПОИСКПОЗ(
        d = Application.IsNumber(c) '=ЕЧИСЛО
        If d Then
            For e = 3 To 34 'с 3-го до 34 столбца
                f = Cells(b, e).Offset(0, -1).Interior.Color
                If Cells(b, e) <> Sheets("S2").Cells(c, e) Then
                    Cells(b, e).Interior.Color = 15652797
                    If f = 16777215 Then Range(Cells(b, 1), Cells(b, e - 1)).Interior.Color = 11389944
                Else
                    If f <> 16777215 Then Cells(b, e).Interior.Color = 11389944
                End If
            Next
        Else
            Range("a" & b & ":ah" & b).Interior.Color = 15652797
        End If
    Next
    Application.ScreenUpdating = False
End Sub
[/vba]

Автор - Nic70y
Дата добавления - 03.02.2022 в 09:47
ericcom Дата: Четверг, 03.02.2022, 13:27 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Nic70y, Классное решение!
Спасибо за помощь!
 
Ответить
СообщениеNic70y, Классное решение!
Спасибо за помощь!

Автор - ericcom
Дата добавления - 03.02.2022 в 13:27
popovvictoru Дата: Пятница, 17.05.2024, 19:36 | Сообщение № 8
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

2016
Помогите, пож-ста, доработать код:
Две таблицы на одном листе, первый столбец является ключом данных (уникальное значение, идентификатор), кол-во столбцов в двух таблицах неизменно, а количество строк может меняться (удаляться и прибавляться)).
Мой код сравнивает построчно, что нужно чтобы сравнение было по массивам?

[vba]
Код
Sub CompareT2()

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Сравнение")

Dim table1 As Range, table2 As Range
Dim keyCol1 As Integer, keyCol2 As Integer
Dim lr1 As Long, lr2 As Long
Dim dict1 As Object, dict2 As Object
Dim cell As Range, key As Variant
Dim r As Long, c As Long
Dim rowIndex As Variant

' Определяем диапазоны таблиц
Set table1 = ws.Range("A1:I300") ' Замените на диапазон вашей первой таблицы
Set table2 = ws.Range("J1:R300") ' Замените на диапазон вашей второй таблицы
table1.Interior.ColorIndex = xlNone
table2.Interior.ColorIndex = xlNone

' Определяем столбцы ключей (1 - это первый столбец в диапазоне)
keyCol1 = 1
keyCol2 = 1

' Создаем словари для хранения ключей и строк
Set dict1 = CreateObject("Scripting.Dictionary")
Set dict2 = CreateObject("Scripting.Dictionary")

' Заполняем словари данными из таблиц
lr1 = table1.Rows.Count
lr2 = table2.Rows.Count

For r = 2 To lr1 ' Начинаем с 2, предполагая, что первая строка - заголовки
key = table1.Cells(r, keyCol1).Value2 & table1.Cells(r, keyCol1 + 1).Value2
dict1(key) = r
Next r

For r = 2 To lr2
key = table2.Cells(r, keyCol2).Value2 & table2.Cells(r, keyCol2 + 1).Value2
dict2(key) = r
Next r

' Сравниваем таблицы и выделяем изменения
For Each key In dict1.Keys
If Not dict2.exists(key) Then
' Удаленные данные - синим цветом
rowIndex = dict1(key)
For c = 1 To table1.Columns.Count
table1.Cells(rowIndex, c).Interior.Color = RGB(0, 0, 255)
Next c
Else
rowIndex = dict1(key)
For c = 1 To table1.Columns.Count
If table1.Cells(rowIndex, c).Value2 <> table2.Cells(dict2(key), c).Value2 Then
' Измененные данные - красным цветом
table1.Cells(rowIndex, c).Interior.Color = RGB(255, 0, 0)
table2.Cells(dict2(key), c).Interior.Color = RGB(255, 0, 0)
End If
Next c
' Строка с изменениями - желтым цветом
ws.Rows(rowIndex).Interior.ColorIndex = 6
dict2.Remove key
End If
Next key

' Новые данные - зеленым цветом
For Each key In dict2.Keys
rowIndex = dict2(key)
For c = 1 To table2.Columns.Count
table2.Cells(rowIndex, c).Interior.Color = RGB(0, 255, 0)
Next c
Next key

' Highlight new data in table2
For Each key In dict2.Keys
rowIndex = dict2(key)
ws.Rows(rowIndex).Interior.ColorIndex = 4
Next key

MsgBox "Сравнение завершено.", vbInformation
End Sub
[/vba]


Сообщение отредактировал popovvictoru - Пятница, 17.05.2024, 19:38
 
Ответить
СообщениеПомогите, пож-ста, доработать код:
Две таблицы на одном листе, первый столбец является ключом данных (уникальное значение, идентификатор), кол-во столбцов в двух таблицах неизменно, а количество строк может меняться (удаляться и прибавляться)).
Мой код сравнивает построчно, что нужно чтобы сравнение было по массивам?

[vba]
Код
Sub CompareT2()

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Сравнение")

Dim table1 As Range, table2 As Range
Dim keyCol1 As Integer, keyCol2 As Integer
Dim lr1 As Long, lr2 As Long
Dim dict1 As Object, dict2 As Object
Dim cell As Range, key As Variant
Dim r As Long, c As Long
Dim rowIndex As Variant

' Определяем диапазоны таблиц
Set table1 = ws.Range("A1:I300") ' Замените на диапазон вашей первой таблицы
Set table2 = ws.Range("J1:R300") ' Замените на диапазон вашей второй таблицы
table1.Interior.ColorIndex = xlNone
table2.Interior.ColorIndex = xlNone

' Определяем столбцы ключей (1 - это первый столбец в диапазоне)
keyCol1 = 1
keyCol2 = 1

' Создаем словари для хранения ключей и строк
Set dict1 = CreateObject("Scripting.Dictionary")
Set dict2 = CreateObject("Scripting.Dictionary")

' Заполняем словари данными из таблиц
lr1 = table1.Rows.Count
lr2 = table2.Rows.Count

For r = 2 To lr1 ' Начинаем с 2, предполагая, что первая строка - заголовки
key = table1.Cells(r, keyCol1).Value2 & table1.Cells(r, keyCol1 + 1).Value2
dict1(key) = r
Next r

For r = 2 To lr2
key = table2.Cells(r, keyCol2).Value2 & table2.Cells(r, keyCol2 + 1).Value2
dict2(key) = r
Next r

' Сравниваем таблицы и выделяем изменения
For Each key In dict1.Keys
If Not dict2.exists(key) Then
' Удаленные данные - синим цветом
rowIndex = dict1(key)
For c = 1 To table1.Columns.Count
table1.Cells(rowIndex, c).Interior.Color = RGB(0, 0, 255)
Next c
Else
rowIndex = dict1(key)
For c = 1 To table1.Columns.Count
If table1.Cells(rowIndex, c).Value2 <> table2.Cells(dict2(key), c).Value2 Then
' Измененные данные - красным цветом
table1.Cells(rowIndex, c).Interior.Color = RGB(255, 0, 0)
table2.Cells(dict2(key), c).Interior.Color = RGB(255, 0, 0)
End If
Next c
' Строка с изменениями - желтым цветом
ws.Rows(rowIndex).Interior.ColorIndex = 6
dict2.Remove key
End If
Next key

' Новые данные - зеленым цветом
For Each key In dict2.Keys
rowIndex = dict2(key)
For c = 1 To table2.Columns.Count
table2.Cells(rowIndex, c).Interior.Color = RGB(0, 255, 0)
Next c
Next key

' Highlight new data in table2
For Each key In dict2.Keys
rowIndex = dict2(key)
ws.Rows(rowIndex).Interior.ColorIndex = 4
Next key

MsgBox "Сравнение завершено.", vbInformation
End Sub
[/vba]

Автор - popovvictoru
Дата добавления - 17.05.2024 в 19:36
popovvictoru Дата: Воскресенье, 19.05.2024, 22:38 | Сообщение № 9
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

2016
Хочу узнать у знатоков хороший ли код? или можно улучшить?

[vba]
Код
Sub CompareArrays()

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Сравнение")

Dim arr1 As Variant, arr2 As Variant
Dim keyCol1 As Integer, keyCol2 As Integer
Dim dict1 As Object, dict2 As Object
Dim key As Variant
Dim r As Long, c As Long
Dim rowIndex As Variant

' Определяем массивы данных
arr1 = ws.Range("A2:I300").Value ' Замените на диапазон вашей первой таблицы
arr2 = ws.Range("J2:R300").Value ' Замените на диапазон вашей второй таблицы

' Определяем столбцы ключей (1 - это первый столбец в массиве)
keyCol1 = 1
keyCol2 = 1

' Создаем словари для хранения ключей и индексов
Set dict1 = CreateObject("Scripting.Dictionary")
Set dict2 = CreateObject("Scripting.Dictionary")

' Заполняем словари данными из массивов
For r = 1 To UBound(arr1, 1)
key = arr1(r, keyCol1) & arr1(r, keyCol1 + 1)
dict1(key) = r
Next r

For r = 1 To UBound(arr2, 1)
key = arr2(r, keyCol2) & arr2(r, keyCol2 + 1)
dict2(key) = r
Next r

' Сравниваем массивы и выделяем изменения
For Each key In dict1.Keys
If Not dict2.exists(key) Then
' Удаленные данные - синим цветом
rowIndex = dict1(key)
For c = 1 To UBound(arr1, 2)
ws.Cells(rowIndex + 1, c).Interior.Color = RGB(0, 0, 255)
Next c
Else
rowIndex = dict1(key)
For c = 1 To UBound(arr1, 2)
If arr1(rowIndex, c) <> arr2(dict2(key), c) Then
' Измененные данные - красным цветом
ws.Cells(rowIndex + 1, c).Interior.Color = RGB(255, 0, 0)
ws.Cells(dict2(key) + 1, c + 9).Interior.Color = RGB(255, 0, 0)
End If
Next c
' Строка с изменениями - желтым цветом только первый столбец
ws.Cells(rowIndex + 1, 1).Interior.ColorIndex = 6
dict2.Remove key
End If
Next key

' Новые данные - зеленым цветом
For Each key In dict2.Keys
rowIndex = dict2(key)
For c = 1 To UBound(arr2, 2)
ws.Cells(rowIndex + 1, c + 9).Interior.Color = RGB(0, 255, 0)
Next c
Next key

MsgBox "Сравнение завершено.", vbInformation
End Sub
[/vba]
 
Ответить
СообщениеХочу узнать у знатоков хороший ли код? или можно улучшить?

[vba]
Код
Sub CompareArrays()

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Сравнение")

Dim arr1 As Variant, arr2 As Variant
Dim keyCol1 As Integer, keyCol2 As Integer
Dim dict1 As Object, dict2 As Object
Dim key As Variant
Dim r As Long, c As Long
Dim rowIndex As Variant

' Определяем массивы данных
arr1 = ws.Range("A2:I300").Value ' Замените на диапазон вашей первой таблицы
arr2 = ws.Range("J2:R300").Value ' Замените на диапазон вашей второй таблицы

' Определяем столбцы ключей (1 - это первый столбец в массиве)
keyCol1 = 1
keyCol2 = 1

' Создаем словари для хранения ключей и индексов
Set dict1 = CreateObject("Scripting.Dictionary")
Set dict2 = CreateObject("Scripting.Dictionary")

' Заполняем словари данными из массивов
For r = 1 To UBound(arr1, 1)
key = arr1(r, keyCol1) & arr1(r, keyCol1 + 1)
dict1(key) = r
Next r

For r = 1 To UBound(arr2, 1)
key = arr2(r, keyCol2) & arr2(r, keyCol2 + 1)
dict2(key) = r
Next r

' Сравниваем массивы и выделяем изменения
For Each key In dict1.Keys
If Not dict2.exists(key) Then
' Удаленные данные - синим цветом
rowIndex = dict1(key)
For c = 1 To UBound(arr1, 2)
ws.Cells(rowIndex + 1, c).Interior.Color = RGB(0, 0, 255)
Next c
Else
rowIndex = dict1(key)
For c = 1 To UBound(arr1, 2)
If arr1(rowIndex, c) <> arr2(dict2(key), c) Then
' Измененные данные - красным цветом
ws.Cells(rowIndex + 1, c).Interior.Color = RGB(255, 0, 0)
ws.Cells(dict2(key) + 1, c + 9).Interior.Color = RGB(255, 0, 0)
End If
Next c
' Строка с изменениями - желтым цветом только первый столбец
ws.Cells(rowIndex + 1, 1).Interior.ColorIndex = 6
dict2.Remove key
End If
Next key

' Новые данные - зеленым цветом
For Each key In dict2.Keys
rowIndex = dict2(key)
For c = 1 To UBound(arr2, 2)
ws.Cells(rowIndex + 1, c + 9).Interior.Color = RGB(0, 255, 0)
Next c
Next key

MsgBox "Сравнение завершено.", vbInformation
End Sub
[/vba]

Автор - popovvictoru
Дата добавления - 19.05.2024 в 22:38
bigor Дата: Воскресенье, 19.05.2024, 22:47 | Сообщение № 10
Группа: Проверенные
Ранг: Старожил
Сообщений: 1267
Репутация: 244 ±
Замечаний: 0% ±

нет
popovvictoru, хороший код в теги заключают :)
 
Ответить
Сообщениеpopovvictoru, хороший код в теги заключают :)

Автор - bigor
Дата добавления - 19.05.2024 в 22:47
  • Страница 1 из 1
  • 1
Поиск:

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