Страницы: 1
RSS
Макрос сравнить две таблицы на разных листах и выделить цветом несовпадение, Макрос сравнение двух таблиц на разных листах
 
Привет любителям экселя:-)

Прошу помочь с написанием макроса. Пример я вложила.
макрос должен найти отличия между двумя листами. В первой колонке содержаться разные слова через абзац, в последующих колонках
эти слова разбиты по абзацам. В зависимости от того сколько в ячейке абзацов, столько колонок со словами. Макрос должен сравнить лист B с листом А, и выделить цветом отличительное слова в первой колонке, как показано в примере. Эти слова я веделила зеленым, так как этих слов нет в первой колонке в листе А.
огромное спасибо за помощь!
 
Екатерина,
Цитата
Екатерина написал:
так как этих слов нет в первой колонке в листе А.
как это нет на листе А?
в 5 строке есть watermelon
в 3 строке есть pears
или логику не понимаю
Не бойтесь совершенства. Вам его не достичь.
 
Видимо имеется ввиду сравнение по ячейкам. Можно сделать сравнение условным форматированием, но при этом выделиться целая ячейка, а не конкретное слово. Кстати видны и ошибки в написании вкусов на Аглицком)
Изменено: DemonAMT - 07.10.2020 16:20:23
 
Да, именно сравнение по ячейкам. Так чтобы он нашел слово которое отсутсвует во втором листе и выделил его другим шрифтом.
думаете, невозможно такой код написать?
 
Екатерина,возможно конечно, т.е. мы сравниваем каждое слово в А1 листа Б с каждым словом в А1 листа А ?
Изменено: Mershik - 07.10.2020 16:24:39
Не бойтесь совершенства. Вам его не достичь.
 
na vsykiy sluchay visilayu ehe raz dokument s primerom. Perviy dokumnet bil vislan v forum  s telefona.
 
Мы сравниваем каждое слово начиная с B1 листа А и B1 влисте B, и последующих колонках если есть значениеи и несоответствие выделяем цветом в А1 листа B и так далее по ячейкам.  
 
Екатерина, как  понял
Код
Sub asdasd()
Dim i As Long, lr As Long, cells As Range
Dim A As Worksheet, B As Worksheet
Set A = Worksheets("A")
Set B = Worksheets("B")
lr = B.cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To lr
    arr = Split(B.cells(i, 1), Chr(10), -1)
    For n = LBound(arr) To UBound(arr)
    Set cell = A.cells(i, 1).Find(arr(n))
    If cell Is Nothing Then
    With B.cells(i, 1).Characters(Start:=InStr(1, B.cells(i, 1), arr(n)), Length:=Len(arr(n)) + 1).Font
        .Color = -11489280
    End With
    End If
    Next n
Next i
End Sub
Не бойтесь совершенства. Вам его не достичь.
 
Интересно работает. Подскажите, а почему не выделяет на листе В ячейку В3 слово не совпадает с ячейкой В3 на листе А.
 
DemonAMT, я сделал как понял. перебирается каждое слово в ячейка А1, А2, и так далее листа В, и если его нет в одноименной ячейки листа А то выделяем на листе В...не видел сообщения #7
Не бойтесь совершенства. Вам его не достичь.
 
Обалдеть! Супер! Спасибо огромнейшее, Mershik Гениально!
Изменено: Екатерина - 07.10.2020 17:20:31
 
Вы бы не могли мне еще раз помочь? если в колонке А содержаться еще другие слова. Мне бы хотелось, чтобы код искал только те слова, которые даны в колонке начиная с B.пример приложила к письму и выделила зеленым как должно быть. на данный момент код выделяет всю строку, а не искомое слово.
То есть все тоже самое только с учетом что в колонке А страница В могуть быть и друие слова.
Вы бы не могли написать комментарий в коде чтобы его можно было легче читать.

Спасибо огромное за помощь.
 
Екатерина,
Код
Sub asdasd()
Dim i As Long, lr As Long, cells As Range, lcol As Long, n As Long' объявляем переменные
Dim A As Worksheet, B As Worksheet
Set A = Worksheets("A") 'присваиваем переменной имя листа А
Set B = Worksheets("B") 'присваиваем переменной имя листа В

lr = B.cells(Rows.Count, 1).End(xlUp).Row 'последняя заполненная строка на листе B в столбце 1
For i = 1 To lr ' цикл по строкам листа В с 1 ячейки до последней ранее определенной
    lcol = B.cells(i, Columns.Count).End(xlToLeft).Column'последний заполненный столбец в строке i
    For n = 2 To lcol' цикл по столбцам листа В начиная со второго
    x = B.cells(i, n)' искомое значение из столбцов листа с переменными
    Set cell = A.cells(i, 1).Find(x)' ищем в одноименной строке в ячейке А1 наше искомое значение
    If cell Is Nothing Then' проверяем найдено оно или нет
    With B.cells(i, 1).Characters(Start:=InStr(1, B.cells(i, 1), x), Length:=Len(x) + 1).Font' если значение не найдено выделяем его цветом 
        .Color = -11489280'
    End With'
    End If' если не найдено пропускаем3 строки кода выше
    Next n' 
Next i'
End Sub' конец макроса
Изменено: Mershik - 07.10.2020 20:11:11
Не бойтесь совершенства. Вам его не достичь.
 
Спасибо большое, Mershik! Второй вариант работает как я и хотела!
с уважением,
Екатерина
 
Уважаемые любителя экселя,
прошу Вас помочь расширить код Mershik. Код работает прекрасно, но необходимо его немного расширить.

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

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

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

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

Огромное спасибо за помощь.
пример в приложении.
Страницы: 1
Наверх