Excel макрос сравнения двух листов

Уважаемые любителя экселя,
прошу Вас помочь расширить код Mershik. Код работает прекрасно, но необходимо его немного расширить.

Моя проблема заключается в том что функция Find находит первое значение в ячейке и выделяет его цветом. Если в ячейке несколько слов. то они уже не выделяются цветом, а мне нужно, чтобы маркировались все значения в столбце А, на листе В. лист «как длжно быть» показан в примере в приложении.

что делает код описаный выше: (пример  example 3 в приложении)
в каждом листе первай столбец (всегда столбец А) в листе А и В содержит текст. Этот текст разбивается по словам начиная со второй колонки(всегда со второй колонки и и так несколько колонок в зависимости от того,сколько слов в ячейке. Слова в ячейке всегда разбиты новым абзацом.
код сравнивает столбцы начиная с второго столбца в двух листах А и В. Таким обазом сравнивает лист А ячейку В1 с ячейкой В1 листа В, затем ячейку В2 лист А с ячейкой В2 листа В, затем ячейку С3 лист А с ячейкой С3 листа В и тд по всем ячейкам. Если код не находит совпадение то маркирует несовпадающее слово зеленым цветом в листе В.

Код должен также обращать внимание на порядок слов. Так например в листе В в строке 5, слово watermelon два раза разбито, в листе А один раз, только второе слово должно выделяться цветом, так как первое слово совпадает с листом А.

Надеюсь не запутала.

Огромное спасибо за помощь.
пример в приложении.

ninja_bread

0 / 0 / 0

Регистрация: 23.10.2019

Сообщений: 3

1

Excel

Сравнение двух листов (макрос)

23.10.2019, 14:25. Показов 4471. Ответов 5

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Есть две одинаковые таблицы достаточно большие , первый лист(лист с изменениями) второй лист (оригинал)
Необходимо выделить желтым ячейки отличающиеся от оригинала
диапазон изменения

C
1
A4:DK355



0



370 / 268 / 93

Регистрация: 18.11.2015

Сообщений: 990

23.10.2019, 14:45

2

Есть стандартный инструмент — Найти и выделить — Выделить группу ячеек — отличия по строкам



0



0 / 0 / 0

Регистрация: 23.10.2019

Сообщений: 3

23.10.2019, 15:32

 [ТС]

3

два разных листа же



0



ArtNord

370 / 268 / 93

Регистрация: 18.11.2015

Сообщений: 990

23.10.2019, 16:03

4

Не увидел, тогда условное форматирование

Добавлено через 4 минуты
циклом:

Visual Basic
1
2
3
4
5
6
7
8
9
Sub Сравнить()
For a = 4 to 355
If sheets(1).rows(a) <>sheets(2).rows(a) then
For b = 1 to 115
if sheets(1).cells(a,b) <>sheets(2).cells(a,b)  then sheets(1).cells(a,b).Interior.Color = 65535
Next b
end if
Next a
End sub

Добавлено через 14 минут
Так правильнее:

Visual Basic
1
2
3
4
5
6
7
8
9
Sub Сравнить()
For a = 4 to 355
If sheets(1).rows(a).text <>sheets(2).rows(a).text then
For b = 1 to 115
if sheets(1).cells(a,b) <>sheets(2).cells(a,b)  then sheets(1).cells(a,b).Interior.Color = 65535
Next b
end if
Next a
End sub



1



0 / 0 / 0

Регистрация: 23.10.2019

Сообщений: 3

24.10.2019, 11:58

 [ТС]

5

Цитата
Сообщение от ArtNord
Посмотреть сообщение

Не увидел, тогда условное форматирование
Добавлено через 4 минуты
циклом:
Visual BasicВыделить код
1
2
3
4
5
6
7
8
9
Sub Сравнить()
For a = 4 to 355
If sheets(1).rows(a) <>sheets(2).rows(a) then
For b = 1 to 115
if sheets(1).cells(a,b) <>sheets(2).cells(a,b) *then sheets(1).cells(a,b).Interior.Color = 65535
Next b
end if
Next a
End sub
Добавлено через 14 минут
Так правильнее:
Visual BasicВыделить код
1
2
3
4
5
6
7
8
9
Sub Сравнить()
For a = 4 to 355
If sheets(1).rows(a).text <>sheets(2).rows(a).text then
For b = 1 to 115
if sheets(1).cells(a,b) <>sheets(2).cells(a,b) *then sheets(1).cells(a,b).Interior.Color = 65535
Next b
end if
Next a
End sub

Ничего не происходит(



0



ArtNord

370 / 268 / 93

Регистрация: 18.11.2015

Сообщений: 990

24.10.2019, 13:54

6

Лучший ответ Сообщение было отмечено ninja_bread как решение

Решение

Visual Basic
1
2
3
4
5
6
7
Sub Сравнить()
For a = 4 To 355
For b = 1 To 115
If Sheets(1).Cells(a, b) <> Sheets(2).Cells(a, b) Then Sheets(1).Cells(a, b).Interior.Color = 65535
Next b
Next a
End Sub



1



Перейти к основному содержанию

Статья даёт ответы на следующие вопросы:

  • Как сравнить две таблицы в Excel с помощью макросов VBA?
  • Как обращаться к ячейкам таблицы Excel с помощью VBA?
  • Как осуществлять перебор ячеек таблицы в цикле с помощью VBA?

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

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

Проиллюстрируем задачу картинкой из первой статьи.

задача сравнения двух таблиц в Excel

Для начала напишем алгоритм наших действий по сравнению таблиц.

  1. Определим диапазоны данных первой и второй таблицы, то есть найдем последние значимые строки и сохраним их номера в переменных (последняя строка таблицы 1 — last_i и последняя строка таблицы 2 — last_j).
  2. Начнем проходить по каждой строке таблицы 2 (внешний цикл), данные из которой нужно перенести в таблицу 1. С первой строки данных (в примере это строка 3) до последней строки таблицы 2.
  3. Для каждой строки таблицы 2 определим идентификатор строки, путем формирования строки, содержащей полный адрес квартиры (значения из нескольких колонок, разделенные дефисами).
  4. Начнем проходить по каждой строке таблицы 1 (внутренний цикл) с первой строки данных (в примере это строка 3) до последней строки таблицы 1, определяя при этом идентификатор строки.
  5. Сравним значения идентификаторов строк таблицы 1 и таблицы 2.
  6. Если идентификаторы равны, перепишем ФИО покупателя из ячейки таблицы 2 в соответствующую ячейку таблицы 1; прервем внутренний цикл по таблице 1 и перейдем к следующей строке таблицы 2 (переход к п.2).

Теперь остается реализовать алгоритм в виде программного кода макроса.

Для этого откроем вкладку Вид ленты функций Excel. Щелкнем на нижнюю часть со стрелкой кнопки Макросы. В открывшемся подменю выберем Запись макроса. В результате начнется запись нового макроса. Поскольку код мы будем формировать вручную, то еще раз зайдем в подменю макросов и выберем Остановить запись. Далее еще раз войдем в подменю макросов и выберем Макросы.

В появившемся диалоге выделим наш макрос и нажмем Изменить.

На экране откроется окно редактора макросов Visual Basic for Applications. В области кода (правая верхняя область) отображается код только что созданного пустого макроса.

Редактор макросов Visual Basic For Applications

В процедуру Макрос1 (между объявлениями начала и конца процедуры: Sub и End Sub) необходимо вставить код, решающий поставленную задачу.
Образец кода представлен ниже.

Sub Макрос1()
'
' Макрос1 сравнение двух таблиц с использованием макроса VBA
'

' ссылка на первый лист книги
Dim sheet1 As Worksheet
Set sheet1 = ActiveWorkbook.Sheets(1)
' ссылка на второй лист книги
Dim sheet2 As Worksheet
Set sheet2 = ActiveWorkbook.Sheets(2)

' строка для хранения идентификатора строки первой таблицы
Dim str1 As String
' строка для хранения идентификатора строки второй таблицы
Dim str2 As String

' позиция курсора (номер строки) в первой таблице
Dim i As Integer
i = 3
Dim last_i As Integer
last_i = 3
' позиция курсора (номер строки) во второй таблице
Dim j As Integer
j = 3
Dim last_j As Integer
last_j = 3

' определяем последнюю значимую строку первой таблицы (последняя строка, в первой колонке которой есть значение)
For Each Cell In sheet1.Range("A:A")
    If Cell.Row > 2 Then
        If Cell.Value > "" Then
            last_i = Cell.Row
        Else
            Exit For
        End If
    End If
Next Cell

' определяем последнюю значимую строку второй таблицы (последняя строка, в первой колонке которой есть значение)
For Each Cell In sheet2.Range("A:A")
    If Cell.Row > 2 Then
        If Cell.Value > "" Then
            last_j = Cell.Row
        Else
            Exit For
        End If
    End If
Next Cell

' пробегаем по строкам второй таблицы (внешний цикл)
For j = 3 To last_j
    ' определяем идентификатор текущей строки
    str2 = sheet2.Cells(j, 1).Value & "-" & sheet2.Cells(j, 2).Value & "-" & sheet2.Cells(j, 3).Value & "-" & sheet2.Cells(j, 4).Value
    ' пробегаем по строкам первой таблицы (внутренний цикл)
    For i = 3 To last_i
        ' определяем идентификатор текущей строки
        str1 = sheet1.Cells(i, 1).Value & "-" & sheet1.Cells(i, 2).Value & "-" & sheet1.Cells(i, 3).Value & "-" & sheet1.Cells(i, 4).Value
        ' сравниваем идентификаторы строк первой и второй таблицы
        If str2 = str1 Then
            ' если совпадение найдено, то записываем покупателя из второй таблицы в первую в строку с соответствующей ему квартирой
            sheet1.Cells(i, 5).Value = sheet2.Cells(j, 5).Value
            ' прекращаем внутренний цикл, переходим к следующей итерации внешнего цикла
            ' (к следующей записи второй таблицы)
            Exit For
        End If
    Next i
Next j

End Sub

Результат решения задачи:
результат сравнения таблиц в Excel

Другие интересные статьи

  • Как сравнить две таблицы в Excel с использованием формул?
  • Горячие клавиши Excel

Тэги: 

  • Статьи
  • Excel
  • сравнение таблиц
  • VBA
  • макросы

Сравнение двух листов (макросы)

227

Дата: Воскресенье, 03.05.2015, 17:48 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 16


Репутация:

0

±

Замечаний:
20% ±


Excel для Mac

Переделал скаченную программу под свои нужды. Выполняет сравнение двух диапазонов и при совпадении подставляет данные из одного в другой.
Если оба сравниваемых диапазона находятся на одном листе, то все работает правильно. Как только разношу на разные листы, то выдает ошибку в строке
[vba]

Код

Set obsii = Worksheets(«Общий»).Range(Cells(1, 1), Cells(a, 1))

[/vba]
Если в коде везде указать имя одного листа то работает.
Помогите пожалуйста начинающему разобраться.
[vba]

Код

Sub Start()  ‘Общий—Сортировка’

Dim obsii As Range, xx As Range, cc As Range, sort As Range

x2 = InputBox(«В какой столбик писать результат?»)
d1 = Time

aa = Worksheets(«Сортировка»).Range(«b1»).End(xlDown).Row
MsgBox aa
Set sort = Worksheets(«Сортировка»).Range(Cells(1, 2), Cells(aa, 2))

a = Worksheets(«Общий»).Range(«a1»).End(xlDown).Row
MsgBox a
Set obsii = Worksheets(«Общий»).Range(Cells(1, 1), Cells(a, 1))
         For Each xx In sort
           If Worksheets(«Сортировка»).Cells(xx.Row, xx.Column + 1) > 0 Then
             Set cc = obsii.Find(What:=xx.Value, LookIn:=xlValues)
                     If Not (cc Is Nothing) Then ‘Если что-то нашли, то копируем
                         Worksheets(«Общий»).Cells(cc.Row, CDbl(x2)).Value = Worksheets(«Сортировка»).Cells(xx.Row, xx.Column + 1).Value
                     Else
                         Worksheets(«Сортировка»).Cells(xx.Row, xx.Column).Interior.Color = VBA.RGB(255, 0, 0)
                     End If
             End If
         Next xx

Beep
d2 = Time
Время = MsgBox((DateDiff(«n», d1, d2) 60 & » час » & DateDiff(«n», d1, d2) Mod 60 & » мин » & DateDiff(«s», d1, d2) Mod 60 & » сек»), 0, «Затрачено:»)
End Sub

[/vba]

 

Ответить

227

Дата: Воскресенье, 03.05.2015, 17:57 |
Сообщение № 2

Группа: Пользователи

Ранг: Новичок

Сообщений: 16


Репутация:

0

±

Замечаний:
20% ±


Excel для Mac

227, Вот первоначальный код, который я переделывал:

[vba]

Код

Sub Start()  ‘Пробная процедура’
      Dim a As Range
      Set a = Range(«A1:A7») ‘Обрабатываемый диапазон’
      Call SearchID(a)
End Sub

Sub SearchID(diap As Range)
      Dim BaseDiap As Range, x As Range, c As Range

              Set BaseDiap = Range(«C1:C4»)  ‘Диапазон с исходными данными’
      For Each x In diap
          Set c = BaseDiap.Find(What:=x.Value, LookIn:=xlValues)
          If Not (c Is Nothing) Then
              ‘Если что-то нашли, то копируем значение из соседнего столбца’
              Cells(x.Row, x.Column + 1).Value = Cells(c.Row, c.Column + 1).Value
          End If
      Next x
End Sub

[/vba]

Сообщение отредактировал 227Воскресенье, 03.05.2015, 18:09

 

Ответить

227

Дата: Воскресенье, 03.05.2015, 18:08 |
Сообщение № 3

Группа: Пользователи

Ранг: Новичок

Сообщений: 16


Репутация:

0

±

Замечаний:
20% ±


Excel для Mac

227, переделанный макрос берет заначения ячеек из диапазона столбика B на одном листе, и сравнивает их с диапазоном столбика A на другом листе. При совпадениях копирует ячейку правее B у казанный столбик.

 

Ответить

227

Дата: Воскресенье, 03.05.2015, 18:13 |
Сообщение № 4

Группа: Пользователи

Ранг: Новичок

Сообщений: 16


Репутация:

0

±

Замечаний:
20% ±


Excel для Mac

227, Если кто в этом сможет разобраться то подскажите пожалуйста, просто знаний не хватает(((

 

Ответить

Hugo

Дата: Воскресенье, 03.05.2015, 18:39 |
Сообщение № 5

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

Замечаний:
0% ±


2010, теперь уже с PQ

Обычная ошибка — в строке
[vba]

Код

Worksheets(«Общий»).Range(Cells(1, 1), Cells(a, 1))

[/vba]
вот эти Cells(1, 1), Cells(a, 1) т.к. не указан лист, будут браться с активного листа.
Перед каждым cells нужно указать лист!
В оригинале т.к. всё работало на одном активном листе это роли не играло.
А вообще если нужно сравнивать большие диапазоны — делайте на массивах и словаре. Если конечно не Мак — там нет словарей…


excel@nxt.ru
webmoney: R418926282008 Z422237915069

Сообщение отредактировал HugoВоскресенье, 03.05.2015, 18:41

 

Ответить

227

Дата: Воскресенье, 03.05.2015, 20:32 |
Сообщение № 6

Группа: Пользователи

Ранг: Новичок

Сообщений: 16


Репутация:

0

±

Замечаний:
20% ±


Excel для Mac

Hugo, помогло, спасибо огромное!
Макрос теперь работает, но ужасно медленно(((
У меня сейчас диапазоны на обоих листах примерно 15К на каждом. На одном, если исключить нули, то примерно половина. И одно сравнение занимает много времени(((

Можно подробнее про:

Цитата

…если нужно сравнивать большие диапазоны — делайте на массивах и словаре. Если конечно не Мак — там нет словарей…

У меня мак, но есть доступ и к виндовым компам. Скорость очень важна!
..я сделал уже несколько вариантов этого алгоритма, этот уже третий. Первый был на простом копировании ячеек, второй на массиве, и этот на диапазонах уже третий.
Но скорость на всех примерно одинаковая ± 5-7 мин. На медленном компе ~ 35 мин, на быстром 19 мин. Очень хотелось бы ускорить этот процесс!
Как не странно, но при простом копировании ячеек получается быстрее на несколько мин(

 

Ответить

227

Дата: Воскресенье, 03.05.2015, 21:13 |
Сообщение № 7

Группа: Пользователи

Ранг: Новичок

Сообщений: 16


Репутация:

0

±

Замечаний:
20% ±


Excel для Mac

Вот скрин с компа побыстрее, но это сути не меняет, возможно ли сделать еще быстрее?

 

Ответить

227

Дата: Воскресенье, 03.05.2015, 23:08 |
Сообщение № 8

Группа: Пользователи

Ранг: Новичок

Сообщений: 16


Репутация:

0

±

Замечаний:
20% ±


Excel для Mac

AndreTM, я пробовал с массивом, но так получилось даже медленнее на несколько минут чем с ячейками((
Вот вариант с массивом:

[vba]

Код

Sub СортировкаZ3массив()

Dim K1(999999) As String ‘Массив
Dim K2(999999) As String ‘Массив
Dim K3(999999) As Integer ‘Массив
Dim nss As Long
Dim retval As Integer
Dim d1 As Date, d2 As Date, Время As String

xx = InputBox(«В какой столбик писать результат?»)
d1 = Time

nss = 2
Do While Worksheets(«Сортировка»).Range(«B» & nss).Value <> «» ‘определить количество строк в Сортировка
nss = nss + 1
Loop
nss = nss — 1
‘MsgBox nss

nso = 2
Do While Worksheets(«Общий»).Range(«A» & nso).Value <> «» ‘определить количество строк в Общий
nso = nso + 1
Loop
nso = nso — 1
‘MsgBox nso

         For q2 = 2 To nss
             K2(q2) = Worksheets(«Сортировка»).Cells(q2, 2) ‘запомнить артикул в Сортировка
         Next
         For q3 = 2 To nss
             ‘MsgBox q3
             K3(q3) = Worksheets(«Сортировка»).Cells(q3, 3) ‘запомнить количество в Сортировка
             ‘MsgBox K3(q3)
         Next
         For q1 = 2 To nso
             K1(q1) = Worksheets(«Общий»).Cells(q1, 1) ‘запомнить артикул в Общем
         Next

         For i = 2 To nss
             If K3(i) > 0 Then ‘если количество больше 0

                                               »»»»»»»»»»Worksheets(«Общий»).Range(«A» & nso).Select

                                                        If Worksheets(«Общий»).Cells.Find(What:=K2(i), LookAt:=xlWhole) Is Nothing Then   ‘если не нашлось
                         Worksheets(«Сортировка»).Cells(i, 2).Interior.Color = VBA.RGB(255, 0, 0)
                     Else
                         R = Worksheets(«Общий»).Cells.Find(What:=K2(i), LookAt:=xlWhole).Row
                         Worksheets(«Общий»).Cells(R, CDbl(xx)).Value = K3(i)
                     End If
             End If
         Next

           Beep
d2 = Time
Время = MsgBox((DateDiff(«n», d1, d2) 60 & » часов » & DateDiff(«n», d1, d2) Mod 60 & » минут » & DateDiff(«s», d1, d2) Mod 60 & » секунд»), 0, «Затрачено:»)
End Sub

[/vba]

Летучие функции это формулы? Ничего такого нет, я все пробую на новой чистой книге.
Скрины исходных данных и таблица куда это все пишется. Один столбик одна сортировка:

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

 

Ответить

227

Дата: Воскресенье, 03.05.2015, 23:15 |
Сообщение № 9

Группа: Пользователи

Ранг: Новичок

Сообщений: 16


Репутация:

0

±

Замечаний:
20% ±


Excel для Mac

Вот просто с переносом ячеек пробовал, тут вообще не совсем правильно, тут поиск идет по всему листу а не по диапазону, что должно быть дольше, но как ни странно, этот вариант работает быстрее остальных.

[vba]

Код

Sub СортировкаZ2()

Dim nss As Long
xx = InputBox(«В какой столбик писать результат?»)
y = InputBox(«С какой строки начинать?»)

MsgBox Time
nss = 2
Do While Worksheets(«Сортировка»).Range(«B» & nss).Value <> «»
nss = nss + 1
Loop
MsgBox Time
         For i = 2 To nss — 1
             If Worksheets(«Сортировка»).Range(«C» & i) > 0 Then
                 zz = Worksheets(«Сортировка»).Range(«B» & i)
                     If Worksheets(«Общий»).Cells.Find(What:=zz, LookAt:=xlWhole) Is Nothing Then
                         Worksheets(«Сортировка»).Cells(i, 2).Interior.Color = VBA.RGB(255, 0, 0)
                     Else
                         R = Worksheets(«Общий»).Cells.Find(What:=zz, LookAt:=xlWhole).Row
                         zz = Worksheets(«Сортировка»).Range(«C» & i)
                         Worksheets(«Общий»).Cells(R, CDbl(xx)).Value = zz
                     End If
             End If
         Next
Beep
MsgBox Time
End Sub

[/vba]

 

Ответить

Hugo

Дата: Понедельник, 04.05.2015, 00:14 |
Сообщение № 10

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

Замечаний:
0% ±


2010, теперь уже с PQ

1.Так пример данных в файле будет? Строк так на 100 в каждом?
2.Это у Вас не Мак случаем? Что-то месиджи странные…


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

227

Дата: Понедельник, 04.05.2015, 01:39 |
Сообщение № 11

Группа: Пользователи

Ранг: Новичок

Сообщений: 16


Репутация:

0

±

Замечаний:
20% ±


Excel для Mac

1. Hugo, тестовый файл прикрепляю.
2. мак. неужели маковский эксель так тормозит?

К сообщению приложен файл:

Test.xlsx
(52.4 Kb)

 

Ответить

Hugo

Дата: Понедельник, 04.05.2015, 01:48 |
Сообщение № 12

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

Замечаний:
0% ±


2010, теперь уже с PQ

В Маке нет словарей, что исключает обработку за пару секунд, как в Винде.
Почему бы не использовать формулу?

Код

=VLOOKUP(A2;Сортировка!A:B;2;0)

Можно записать её применение рекордером, в конце добавить замену формул на полученные результаты.


excel@nxt.ru
webmoney: R418926282008 Z422237915069

Сообщение отредактировал HugoПонедельник, 04.05.2015, 01:51

 

Ответить

AndreTM

Дата: Понедельник, 04.05.2015, 03:18 |
Сообщение № 13

Группа: Друзья

Ранг: Старожил

Сообщений: 1762


Репутация:

498

±

Замечаний:
0% ±


2003 & 2010

В принципе да, здесь должно хватать и обычного ВПР() (или его заменителя).
Особенно, если таблицу на листе «Сортировка» есть возможность сразу предварительно отсортировать по первому столбцу-коду.
Или нужно это проделывать именно и только кодом, на VBA?
Тогда наибольшее быстродействие на больших объемах показывать будет запрос к данным. Например, с использованием MSQuery. Проще было бы, конечно, используя ADO или DAO,но я не в курсе, поддерживаются ли эти провайдеры на маках.
Да и даже свой алгоритм можно сделать, достаточно простой, если использовать заранее отсортированные списки. Изабыть на время об использовании .Find :)


Skype: andre.tm.007
Donate: Qiwi: 9517375010

 

Ответить

227

Дата: Понедельник, 04.05.2015, 10:57 |
Сообщение № 14

Группа: Пользователи

Ранг: Новичок

Сообщений: 16


Репутация:

0

±

Замечаний:
20% ±


Excel для Mac

Hugo, означает и это, что на винде этот макрос будет работать намного быстрее?
С формулой с наскока не получилось разобраться, выдается странный результат #ИМЯ?, надо будет почитать как они работают.

AndreTM, сейчас так и делаем, сортировка а-я, выделенине цветом дубликатов, сортировка по цвету, перестановка и тд. Довольно много рутинных действий, которые хотелось бы автоматизировать.
Я не совсем корректно сделал тестовый файл, просто сделал схематически. Вообще на эталонном листе Общий имеется много столбиков с разной инфой не по алфавиту, и порядок и количество артикулов на листе Сортировка не совпадает с Общий, по этому и поиск. От этой сортировки требуется только добавить дополнительный столбик на первый лист.

MSQuery для меня пока это сложновато(

 

Ответить

nilem

Дата: Понедельник, 04.05.2015, 13:08 |
Сообщение № 15

Группа: Авторы

Ранг: Старожил

Сообщений: 1612


Репутация:

563

±

Замечаний:
0% ±


Excel 2013, 2016

227, привет
просто для интереса, вот так будет работать на Мак? (сомневаюсь про Timer — можно закомментировать если что)
[vba]

Код

Sub СортировкаZ3массив22()
Dim x, i&, r As Range
Dim tm#: tm = Timer
With Sheets(«Общий»)
       x = .Range(«A1», .Cells(Rows.Count, 1).End(xlUp)).Value
End With
With Sheets(«Сортировка»).Columns(1)
       For i = 1 To UBound(x)
           Set r = .Find(x(i, 1), LookAt:=xlWhole)
           If r Is Nothing Then x(i, 1) = «» Else x(i, 1) = r(1, 2)
       Next i
End With
Sheets(«Общий»).Range(«B1»).Resize(i — 1).Value = x
MsgBox Timer — tm
End Sub

[/vba]

исправил r(1)(1, 2) на r(1, 2), опечатка


Яндекс.Деньги 4100159601573

Сообщение отредактировал nilemВторник, 05.05.2015, 12:59

 

Ответить

227

Дата: Понедельник, 04.05.2015, 19:44 |
Сообщение № 16

Группа: Пользователи

Ранг: Новичок

Сообщений: 16


Репутация:

0

±

Замечаний:
20% ±


Excel для Mac

nilem, это высший пилотаж! Супер! Снимаю шляпу!
Прирост скорости почти в 20 раз!

Это то что надо!
Хотел только немного подправить логику, но не получается разобраться(( У вас как-то хитро сделано.
В этом коде значения из Общий сравниваются с Сортировка, а нужно наоборот, так как в Сортировка значений может быть больше, и нужно как-то метить то, что в Общий не нашлось, в своей версии я эти ячейки заливал красным, а после завершения делал сортировку по цвету.
В вашем варианте менял местами названия листов, в случае неудачного поиска прописывал ZZZ и менял местами переменные, но получается ерунда какая-то(((

[vba]

Код

If r Is Nothing Then x(i, 1) = «zzz» Else r(1)(1, 2) = x(i, 1)

[/vba]

Подскажите пожалуйста как поправить логику?

 

Ответить

227

Дата: Понедельник, 04.05.2015, 20:19 |
Сообщение № 17

Группа: Пользователи

Ранг: Новичок

Сообщений: 16


Репутация:

0

±

Замечаний:
20% ±


Excel для Mac

… На листе Сортировка примерно половина ячеек с нулями, если поставить провертку на >0 может еще быстрее получится?

 

Ответить

nilem

Дата: Понедельник, 04.05.2015, 21:39 |
Сообщение № 18

Группа: Авторы

Ранг: Старожил

Сообщений: 1612


Репутация:

563

±

Замечаний:
0% ±


Excel 2013, 2016

давайте еще раз…
На листе Общий нужно для каждого кода прописать значения, взятые из листа Сортировка.
А на листе Сортировка как-то отметить те коды, которые отсутствуют на листе Общий.
Правильно?

Отсортировать столбцы с кодами на обоих листах допускается?


Яндекс.Деньги 4100159601573

 

Ответить

227

Дата: Понедельник, 04.05.2015, 21:59 |
Сообщение № 19

Группа: Пользователи

Ранг: Новичок

Сообщений: 16


Репутация:

0

±

Замечаний:
20% ±


Excel для Mac

nilem, все правильно!
Только я изначально исходил из листа Сортировка, если значение > 0, то поиск по Общий (ну чтобы ускорить процесс, просто там много нулей), если точное совпадение, то копия из Сортировка в Общий.
Сортировать допускается, только в Общий очень длинные строки, он как накопитель инфы.

Сообщение отредактировал 227Понедельник, 04.05.2015, 22:02

 

Ответить

nilem

Дата: Вторник, 05.05.2015, 10:08 |
Сообщение № 20

Группа: Авторы

Ранг: Старожил

Сообщений: 1612


Репутация:

563

±

Замечаний:
0% ±


Excel 2013, 2016

попробуйте вот так:
[vba]

Код

Sub ertert()
Dim tm#: tm = Timer
Dim x, y, rez(), i&, j&, bu As Boolean
Dim ubx&, lbx&

With Sheets(«Сортировка»)    ‘где ищем. Данные д.б. отсортированы по Коду
     ‘берем 2 столбца
     x = .Range(«A2:B» & .Cells(Rows.Count, 1).End(xlUp).Row).Value
End With

With Sheets(«Общий»)    ‘что ищем, сортировать необязательно
     y = .Range(«A2», .Cells(Rows.Count, 1).End(xlUp)).Value
End With
ReDim rez(1 To UBound(y), 1 To 1)

For i = 1 To UBound(y)
     lbx = 1: ubx = UBound(x)
     Do
         bu = 0: j = (lbx + ubx) 2
         Select Case y(i, 1)
             Case Is > x(j, 1): lbx = j + 1
             Case Is < x(j, 1): ubx = j — 1
             Case Is = x(j, 1): bu = 1: Exit Do
         End Select
     Loop Until ubx < lbx
     ‘x(j, 2) — возвращаем значение из 2-го столбца листа Сортировка
     If bu Then rez(i, 1) = x(j, 2)
Next i

Sheets(«Общий»).Range(«B2»).Resize(i — 1).Value = rez()
MsgBox Timer — tm
End Sub

[/vba]


Яндекс.Деньги 4100159601573

 

Ответить

Содержание:

  1. Сравните два листа Excel в отдельных файлах Excel (бок о бок)
  2. Сравнение нескольких листов в отдельных файлах Excel (бок о бок)
  3. Сравните два листа (бок о бок) в одной книге Excel
  4. Сравните два листа и выделите различия (с использованием условного форматирования)
  5. Сравните два файла / листа Excel и узнайте разницу, используя формулу
  6. Сравните два файла / листа Excel и узнайте разницу с помощью VBA
  7. Использование стороннего инструмента — XL Comparator

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

Это становится более трудным и подверженным ошибкам, когда у вас есть много данных, которые необходимо сравнить.

К счастью, в Excel есть несколько интересных функций, которые позволяют открывать и легко сравнивать два файла Excel.

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

Давайте начнем!

Сравните два листа Excel в отдельных файлах Excel (бок о бок)

Если вы хотите сравнить два отдельных файла Excel рядом (или два листа в одной книге), в Excel есть встроенная функция для этого.

Это Просмотр бок о бок вариант.

Это рекомендуется только в том случае, если у вас небольшой набор данных, и сравнение этих файлов вручную, вероятно, займет меньше времени и будет подвержено ошибкам. Если у вас большой набор данных, я рекомендую использовать условный метод или метод формулы, описанный далее в этом руководстве.

Давайте посмотрим, как это использовать, когда вам нужно сравнить два отдельных файла или два листа в одном файле.

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

Как сравнить два листа Excel (на предмет различий)

По умолчанию, когда вы открываете файл, он может занимать весь экран. Даже если вы уменьшите размер, вы всегда увидите один файл Excel вверху.

С опцией просмотра бок о бок вы можете открыть два файла, а затем расположить их по горизонтали или вертикали. Это позволяет легко сравнивать значения без переключения вперед и назад.

Ниже приведены шаги по выравниванию двух файлов бок о бок и их сравнению:

  1. Откройте файлы, которые хотите сравнить.
  2. В каждом файле выберите лист, который вы хотите сравнить.
  3. Перейдите на вкладку «Просмотр».
  4. В группе Windows нажмите на опцию «Просмотр бок о бок». Это становится доступным только в том случае, если у вас открыто два или более файла Excel.

Как только вы нажмете на опцию Просмотр бок о бок, Excel расположит книгу по горизонтали. Оба файла будут видны, и вы можете редактировать / сравнивать эти файлы, пока они расположены рядом.

Как сравнить два листа Excel (на предмет различий)

Если вы хотите расположить файлы вертикально, нажмите на опцию «Упорядочить все» (на вкладке «Просмотр»).

Как сравнить два листа Excel (на предмет различий)

Откроется диалоговое окно «Упорядочить окна», в котором вы можете выбрать «Вертикально».

Как сравнить два листа Excel (на предмет различий)

На этом этапе, если вы прокрутите один из листов вниз, другой останется как есть. Вы можете изменить это так, чтобы при прокрутке одного листа одновременно прокручивалась и другая. Это упрощает сравнение строк за строками и выявление различий.

Но для этого нужно включить Синхронная прокрутка.

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

Как сравнить два листа Excel (на предмет различий)

Сравнение нескольких листов в отдельных файлах Excel (бок о бок)

С опцией «Просмотр бок о бок» вы можете сравнить только два файла Excel за один раз.

Если у вас открыто несколько файлов Excel, при нажатии на опцию «Просмотр бок о бок» откроется диалоговое окно «Сравнить бок о бок», в котором вы можете выбрать, какой файл вы хотите сравнить с активной книгой.

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

Как сравнить два листа Excel (на предмет различий)

В диалоговом окне «Упорядочить окна» выберите «Вертикально / горизонтально» и нажмите «ОК».

Это расположит все открытые файлы Excel в выбранном порядке (по вертикали или горизонтали).

Сравните два листа (бок о бок) в одной книге Excel

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

Но вы все равно можете провести такое же параллельное сравнение.

Это стало возможным благодаря «Новая функция Windows в Excel, что позволяет открывать два экземпляра в одной книге. Открыв два экземпляра, вы можете расположить их рядом, а затем сравнить.

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

Как сравнить два листа Excel (на предмет различий)

Ниже приведены шаги для сравнения двух листов в Excel:

  1. Откройте книгу, в которой есть листы, которые вы хотите сравнить.
  2. Перейдите на вкладку «Просмотр».
  3. В группе «Окно» нажмите «Новое окно». Это открывает второй экземпляр той же книги.
  4. На вкладке «Просмотр» нажмите «Упорядочить все». Откроется диалоговое окно «Упорядочить окна».
  5. Выберите «По вертикали», чтобы сравнить данные в столбцах (или выберите «По горизонтали», если вы хотите сравнить данные в строках).
  6. Щелкните ОК.

Вышеупомянутые шаги расположили бы оба экземпляра книги вертикально.

В этот момент в обеих книгах будет выбран один и тот же рабочий лист. В одной из книг выберите другой лист, который вы хотите сравнить с активным листом.

Как это работает?

Когда вы нажимаете «Новое окно», он снова открывает ту же книгу с немного другим именем. Например, если ваша книга называется «Тест», и вы нажимаете «Новое окно», она назовет уже открытую книгу «Тест — 1», а второй экземпляр — «Тест — 2».

Обратите внимание, что это все та же книга. Если вы внесете какие-либо изменения в любую из этих книг, это отразится на обеих.

И когда вы закроете любой экземпляр открытого файла, имя вернется к исходному.

Вы также можете включить синхронную прокрутку, если хотите (нажав на опцию «Синхронная прокрутка» на вкладке «Просмотр»).

[lyte id=’OYxyOwOQea8′ /]

Сравните два листа и выделите различия (с использованием условного форматирования)

Хотя вы можете использовать описанный выше метод для выравнивания книг вместе и вручную просматривать данные построчно, это не лучший способ, если у вас много данных.

Кроме того, выполнение этого уровня сравнения вручную может привести к множеству ошибок.

Поэтому вместо того, чтобы делать это вручную, вы можете использовать возможности условного форматирования, чтобы быстро выделить любые различия на двух листах Excel.

Этот метод действительно полезен, если у вас есть две версии на двух разных листах и ​​вы хотите быстро проверить, что изменилось.

Обратите внимание, что вы НЕ МОЖЕШЬ сравните два листа в разных книгах.

Поскольку условное форматирование не может ссылаться на внешний файл Excel, сравниваемые листы должны находиться в одной книге Excel. Если это не так, вы можете скопировать лист из другого файла в активную книгу, а затем провести это сравнение.

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

Как сравнить два листа Excel (на предмет различий)

Ниже приведены шаги для этого:

  1. Выберите данные на листе, где вы хотите выделить изменения. Поскольку я хочу проверить, как изменились цены с января по февраль, я выбрал данные в таблице за февраль.
  2. Перейдите на вкладку «Главная»
  3. В группе «Стили» нажмите «Условное форматирование».
  4. В появившихся вариантах нажмите «Новое правило».
  5. В диалоговом окне «Новое правило форматирования» нажмите «Использовать формулу, чтобы определить, какие ячейки нужно форматировать».
  6. В поле формулы введите следующую формулу: = B2Jan! B2
  7. Нажмите кнопку «Формат».
  8. В появившемся диалоговом окне «Формат ячеек» щелкните вкладку «Заливка» и выберите цвет, которым вы хотите выделить несоответствующие данные.
  9. Нажмите ОК.
  10. Нажмите ОК.

Вышеупомянутые шаги мгновенно подчеркнут любые изменения в наборе данных на обоих листах.

Как сравнить два листа Excel (на предмет различий)

Как это работает?

Условное форматирование выделяет ячейку, когда заданная формула для этой ячейки возвращает ИСТИНА. В этом примере мы сравниваем каждую ячейку на одном листе с соответствующей ячейкой на другом листе (выполняется с помощью оператора not equal to в формуле).

Когда условное форматирование обнаруживает какие-либо различия в данных, оно выделяет это на листе Ян (тот, в котором мы применили условное форматирование.

Обратите внимание, что в этом примере я использовал относительную ссылку (A1, а не $ A $ 1, $ A1 или A $ 1).

При использовании этого метода для сравнения двух листов в Excel помните следующее;

  • Этот метод хорош для быстрого выявления различий, но вы не можете использовать его постоянно. Например, если я введу новую строку в любой из наборов данных (или удалю строку), это даст мне неверные результаты. Как только я вставляю / удаляю строку, все последующие строки считаются разными и соответственно выделяются.
  • Вы можете сравнивать только два листа в одном файле Excel.
  • Вы можете только сравнить значение (а не разницу в формуле или форматировании).

Сравните два файла / листа Excel и узнайте разницу, используя формулу

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

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

Этот метод подойдет, если вы хотите сравнить две отдельные книги или листы Excel в одной книге.

Позвольте мне показать вам пример, в котором я сравниваю два набора данных на двух листах (в одной книге).

Предположим, у вас есть набор данных, показанный ниже, на листе с названием «Янв» (и аналогичные данные на листе с именем «Фев»), и вы хотите знать, какие значения отличаются.

Как сравнить два листа Excel (на предмет различий)

Чтобы сравнить два листа, сначала вставьте новый лист (назовем этот лист «Разница»).

Как сравнить два листа Excel (на предмет различий)

В ячейке A1 введите следующую формулу:
= ЕСЛИ (Янв! A1Фев! A1, "Значение января:" & Янв! A1 & CHAR (10) & "Значение февраля:" & Фев! A1, "")

Скопируйте и вставьте эту формулу для диапазона, чтобы охватить весь набор данных на обоих листах. Поскольку у меня небольшой набор данных, я скопирую и вставлю эту формулу только в диапазон A1: B10.

В приведенной выше формуле для проверки различий используется условие ЕСЛИ. Если разницы в значениях нет, он вернет пустое поле, а в случае разницы вернет значения из обоих листов в отдельных строках в одной и той же ячейке.

Преимущество этого метода в том, что он только дает вам различия и показывает, в чем именно разница. В этом примере я легко вижу, что цены в ячейках B4 и B8 различаются (а также точные значения в этих ячейках).

Сравните два файла / листа Excel и узнайте разницу с помощью VBA

Если вам нужно часто сравнивать файлы или листы Excel, рекомендуется иметь готовый код VBA макроса Excel и использовать его всякий раз, когда вам нужно проводить сравнение.

Вы также можете добавить макрос на панель быстрого доступа, чтобы получить доступ с помощью одной кнопки и мгновенно узнать, какие ячейки различаются в разных файлах / листах.

Предположим, у вас есть два листа Jan и Feb, и вы хотите сравнить и выделить различия в листе Jan, вы можете использовать приведенный ниже код VBA:
Sub CompareSheets () Dim rngCell As Range для каждой rngCell в листах («Янв»). UsedRange, если не rngCell = Worksheets («Feb»). Cells (rngCell.Row, rngCell.Column) Then rngCell.Interior.Color = vbYellow End Если следующий rngCell End Sub
В приведенном выше коде цикл For Next используется для просмотра каждой ячейки на листе Jan (весь используемый диапазон) и сравнения его с соответствующей ячейкой на листе Feb. Если он обнаруживает разницу (которая проверяется с помощью оператора If-Then), он выделяет эти ячейки желтым цветом.

Вы можете использовать этот код в обычном модуле редактора VB.

И если вам нужно делать это часто, лучше сохранить этот код в книге личных макросов, а затем добавить его на панель быстрого доступа. Таким образом, вы сможете выполнить это сравнение одним нажатием кнопки.

Вот шаги, чтобы получить личную книгу макросов в Excel (она недоступна по умолчанию, поэтому вам необходимо включить ее).

Вот шаги, чтобы сохранить этот код в личной книге макросов.

Здесь вы найдете инструкции по добавлению этого макроса в QAT.

Использование стороннего инструмента — XL Comparator

Еще один быстрый способ сравнить два файла Excel и проверить совпадения и различия — использовать бесплатный сторонний инструмент, такой как XL Comparator.

Это веб-инструмент, в который вы можете загрузить два файла Excel, и он создаст файл сравнения, который будет содержать общие данные (или разные данные в зависимости от того, какой вариант вы выбрали.

Предположим, у вас есть два файла с наборами данных о клиентах (например, имя и адрес электронной почты), и вы хотите быстро проверить, какие клиенты находятся в файле 1, а не в файле 2.

Ниже показано, как вы сравниваете два файла Excel и создаете сравнительный отчет:

  1. Откройте https://www.xlcomparator.net/
  2. Используйте параметр «Выбрать файл», чтобы загрузить два файла (максимальный размер каждого файла может составлять 5 МБ).
  3. Щелкните по кнопке Далее.
  4. Выберите общий столбец в обоих этих файлах. Инструмент будет использовать этот общий столбец для поиска совпадений и различий.
  5. Выберите один из четырех вариантов, хотите ли вы получить совпадающие данные или разные данные (на основе файла 1 или файла 2).
  6. Нажмите Далее
  7. Загрузите файл сравнения, в котором будут данные (в зависимости от того, какой вариант вы выбрали на шаге 5)

Ниже приведено видео, в котором показано, как работает инструмент XL Comparator.

Одна из проблем, которые могут возникнуть при использовании стороннего инструмента для сравнения файлов Excel, связана с конфиденциальностью. Если у вас есть конфиденциальные данные и конфиденциальность для них действительно важна, лучше использовать другие методы, указанные выше. Обратите внимание, что на веб-сайте XL Comparator упоминается, что они удаляют все файлы после 1 часа сравнения.

Это некоторые из методов, которые вы можете использовать для сравнения двух разных файлов Excel (или листов в одном файле Excel). Надеюсь, вы нашли это руководство по Excel полезным.

Понравилась статья? Поделить с друзьями:
  • Excel макрос сохранить файл с поддержкой макросов
  • Excel макрос сохранить листья
  • Excel макрос сохранить лист как отдельный файл
  • Excel макрос сохранить копию
  • Excel макрос сохранить как xls