Vba сравнение excel таблица

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

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

  • Как сравнить две таблицы в 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
  • макросы

 

Davidov.p.v

Пользователь

Сообщений: 5
Регистрация: 17.06.2016

Добрый утро!

Помогите начинающему пользователю составить макрос либо скрипт для сравнения двух таблиц.

Задача такова. Есть две таблицы в них значения ФИО, Ставка, должность, ЗП одинаковые, но стоят в разных столбцах, их необходимо сравнить и в таблице номер один записать Название отдела в соответствующе строке. А если есть ошибка то помечать ячейку, которая отличается цветом.

Файл оригинал и что должно получиться прикрепляю.
 Любые идеи рассмотрю и приму с огромной благодарностью.

Заранее огромное спасибо за помощь!

 

Ts.Soft

Пользователь

Сообщений: 576
Регистрация: 13.04.2016

Написать макрос несложно. Проблема в организации данных — в двух таблицах нет единого ключевого поля. Только не нужно рассказывать, что последовательность сотрудников в обеих таблицах всегда будет совпадать — в реальность Вы столкнётесь когда в них будет даже разное количество строк. Вот если бы во второй таблице был бы табельный номер… Фамилия в качестве ключевого поля не подходит, бывает встречаются однофамильцы, кстати на одном из моих предыдущих мест работы их четырёхсот работников было пять Ивановых, причём у троих совпадали инициалы, а двое были полными тёзками. Так же одну фамилию можно написать по разному, например Семёнов и Семенов — для макроса это будут разные фамилии.
Так что сначала подумайте как избежать подобных неоднозначностей, а заодно и что делать если в таблицах будет разное количество строк (оба варианта),так же что делать если в первой таблице есть сотрудники, которых вообще нет во второй и наоборот.

Не стреляйте в тапера — он играет как может.

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Davidov.p.v, здравствуйте!
Если возможно построчно сцепить столбцы, то ТУТ лучшая (на мой взгляд, конечно) программа для сравнения двух списков.
Ещё можете взглянуть СЮДА, автор, кажется,

Hugo

(местный умный планетянин)

Изменено: Jack Famous18.06.2016 10:34:40

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Davidov.p.v

Пользователь

Сообщений: 5
Регистрация: 17.06.2016

#4

18.06.2016 11:28:46

Цитата
Ts.Soft написал: Проблема в организации данных — в двух таблицах нет единого ключевого поля

В таблице уникальное поле это ФИО, абсолютно точно нет совпадений.

Цитата
в реальность Вы столкнётесь когда в них будет даже разное количество строк.

Количество строк действительно разное.

Цитата
Фамилия в качестве ключевого поля не подходит

Фамилию можно взять как ключевое слово однофамильцев точно нет.

Цитата
Так же одну фамилию можно написать по разному, например Семёнов и Семенов

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

Цитата
так же что делать если в первой таблице есть сотрудники, которых вообще нет во второй и наоборот.

Как вариант после сравнения каждой строки помечать ее цветом.

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

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

Изменено: Davidov.p.v18.06.2016 22:47:05

 

Ts.Soft

Пользователь

Сообщений: 576
Регистрация: 13.04.2016

Davidov.p.v, как Вы думаете, зачем давным-давно для идентификации сотрудников придумали табельный номер? Это сегодня у Вас нет однофамильцев, а завтра кто-то уволился, кто-то устроился… Или Вы при приёме на работу будете отказывать однофамильцам уже существующих сотрудников? Так это нарушение Трудового кодекса — вот в инспекции по  труду посмеются…
Так что лучше заранее всё предусмотреть и использовать для идентификации старый добрый табельный номер.
Кстати креме е/ё возможно ещё много вариантов: Иванов И.И., Иванов ИИ, Иванов И. И. — для программы разные люди. А бывают и орфографические ошибки…

А вообще это постоянная проблема при постановке задачи — никто не думает о том что может быть завтра. Я уже не сосчитаю сколько раз мне говорили: «такого у нас нет, не было и никогда не будет», проходило какое-то время, что-то менялось и ко мне прибегали с криком «программа не работает!!!» или «нам надо так, а программа это не позволяет», полностью забыв свои слова «такого у нас нет, не было и никогда не будет».

Не стреляйте в тапера — он играет как может.

 

Davidov.p.v

Пользователь

Сообщений: 5
Регистрация: 17.06.2016

Ts.Soft, я согласен но тут одноразовая проверка 2000 сотрудников. И проверять 2000 записей руками как то не очень есть хорошо, когда век компьютерных технологий..

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#7

18.06.2016 12:27:05

Доброе время суток

Цитата
Davidov.p.v написал: когда век компьютерных технологий..

О, это да, и в школе информатика, а в институте программирование. Тогда где ваши попытки? А то пока

Цитата
Davidov.p.v написал: И проверять 2000 записей руками как то не очень есть
 

Ts.Soft

Пользователь

Сообщений: 576
Регистрация: 13.04.2016

Davidov.p.v, ну если временно, то смотрите что получилось.
При запуске снимается всё цветовое выделение и очищается список структурных подразделений.
Дополнительно сделал пометку на втором листе просмотренных строк. Если при сравнении ошибок нет, то фамилия помечается зелёным, иначе — красным. Если фамилия никак не помечена, значит на первом листе такой фамилии нет.

Кстати, у Вас сразу выскакивают ошибки в должностях: на одном листе «продавец-консультант», а на другом уже «продавец-консультант запчастей»

Изменено: Ts.Soft18.06.2016 14:07:01

Не стреляйте в тапера — он играет как может.

 

Ts.Soft

Пользователь

Сообщений: 576
Регистрация: 13.04.2016

#9

18.06.2016 13:28:20

Цитата
Андрей VG написал: в школе информатика, а в институте программирование

Не верю. Я видел молодых экономистов/бухгалтеров и т.п. — они даже аккаунт в одноклассниках без посторонней помощи создать не могут…
Да и если всех обучают программированию, тогда зачем нужны программисты?

Не стреляйте в тапера — он играет как может.

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#10

18.06.2016 13:30:31

Цитата
Ts.Soft написал:
Не верю. Я видел молодых экономистов/бухгалтеров и т.п. — они даже аккаунт в одноклассниках без посторонней помощи создать не могут

И на этом основании можно сделать вывод, что программирование в (непрофильных) вузах не преподают? ))

 

Davidov.p.v

Пользователь

Сообщений: 5
Регистрация: 17.06.2016

Ts.Soft, Огромное СПАСИБО. Все работает как я и хотел. ЕЩЕ РАЗ СПАСИБО. Вы меня спасли от очень муторной и кропотливой работы которую я бы выполнял месяц.

Изменено: Davidov.p.v19.06.2016 21:24:27

 

Davidov.p.v

Пользователь

Сообщений: 5
Регистрация: 17.06.2016

#12

19.06.2016 21:23:09

Цитата
Ts.Soft написал: Кстати, у Вас сразу выскакивают ошибки в должностях

Так как один, это выгрузка из 1С, а второй это пишет другой сотрудник.

Добро пожаловать на StackOverflow, Илья!

На самом деле это не очень сложная задача. Её можно разбить на четыре простых фрагмента:

  1. перебрать ячейки диапазона по одной;
  2. отыскать значение ячейки в другом листе той же книги
  3. убедиться, что такой лист ещё не создан
  4. добавить лист в книгу

Собрать всё это вместе не намного труднее, чем сложить конструктор Лего:

Sub CreateSheetsForDoubles()
Dim aRange1 As Range, aRange2 As Range  ' Диапазоны ячеек с именами - первый и второй список
Dim oCell As Range                      ' Одна ячейка, чтобы перебрать каждую из ячеек в первом диапазоне
Dim sNextName As String                 ' Текст из ячейки oCell
Dim vResOfMatch As Variant              ' Результат поиска sNextName во втором списке - или номер строки, или ошибка
Dim sRes As String                      ' Текст финального сообщения - имена созданых листов
Dim ws As Worksheet                     ' Переменная для проверки "лист с таким именем уже существует?"
Dim sheet As Worksheet                  ' Переменная для новых листов
    Set aRange1 = [Лист1!A1:A10]        ' Диапазоны можно задать так...
    Set aRange2 = Worksheets("Лист2").Range("A1:A10")   ' ...или так. Или спросить в диалоге
    For Each oCell In aRange1           ' Для каждой ячейки в первом списке
        sNextName = Trim(oCell.Text)    ' Взять её текстовое представление без оконечных пробелов
        If sNextName <> vbNullString Then   ' Если текст в ячейке есть (если она не пустая)
        vResOfMatch = Application.Match(sNextName, aRange2, 0)  ' Попытаться отыскать это значение во втором списке
        If Not IsError(vResOfMatch) Then    ' Если не ошибка, значит во втором списке это имя есть
            Set ws = Nothing            ' Проверить, нет ли уже листа с таким именем (в случае, если макрос запускается повторно)
            On Error Resume Next
            Set ws = Worksheets(sNextName)
            On Error GoTo 0
            If ws Is Nothing Then       ' Нет, в єтой книге листа с таким именем нет
                If Len(sRes) > 0 Then sRes = sRes & ", "    ' Дополнить список найденных имён
                sRes = sRes & sNextName
Rem Создать лист, присвоить ему имя и вписать в первую ячейку то же самое имя
                Set sheet = ActiveWorkbook.Sheets.Add(After:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksheets.Count))
                sheet.Name = sNextName
                sheet.[A1].Value = sNextName
            End If
        End If
        End If
    Next oCell
Rem В конце сообщить о результатах выполнения макроса
    If Len(sRes) = 0 Then
        Call MsgBox("Нет имен для новых листов")
    Else
        Call MsgBox("Созданы листы для " & sRes)
    End If
End Sub

Надеюсь, это поможет удачно стартовать в программировании. Успехов!

Содержание

  1. Сравнение таблиц в Excel с помощью макросов VBA
  2. Сравнение таблиц в Excel с помощью макросов VBA
  3. Vba сравнение excel таблица

Сравнение таблиц в Excel с помощью макросов VBA

Оставлен Adm вс, 09/11/2014 — 21:30

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

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

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

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

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

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

  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. В области кода (правая верхняя область) отображается код только что созданного пустого макроса.

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

Результат решения задачи:

Источник

Сравнение таблиц в Excel с помощью макросов VBA

Оставлен Adm вс, 09/11/2014 — 21:30

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

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

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

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

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

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

  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. В области кода (правая верхняя область) отображается код только что созданного пустого макроса.

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

Результат решения задачи:

Источник

Vba сравнение excel таблица

Private Sub Find_Matches()
Dim CompareRange As Range, x As Range, y As Range
Set CompareRange = Worksheets(«Лист2»).Range(«B8:S295») ‘диапазон с которым сравнивают

Application.ScreenUpdating = False
Selection.Interior.ColorIndex = xlNone

For Each y In CompareRange
If Not IsEmpty(y) Then
For Each x In Selection
If InStr(1, x, y, vbTextCompare) > 0 Then x.Interior.Color = vbGreen
Next x
End If
Next y

MsgBox «Данные проверены»
End Sub

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

Private Sub Find_Matches()
Dim CompareRange As Range, x As Range, y As Range
Set CompareRange = Worksheets(«Лист2»).Range(«B8:S295») ‘диапазон с которым сравнивают

Application.ScreenUpdating = False
Selection.Interior.ColorIndex = xlNone

For Each y In CompareRange
If Not IsEmpty(y) Then
For Each x In Selection
If InStr(1, x, y, vbTextCompare) > 0 Then x.Interior.Color = vbGreen
Next x
End If
Next y

MsgBox «Данные проверены»
End Sub

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

Private Sub Find_Matches()
Dim CompareRange As Range, x As Range, y As Range
Set CompareRange = Worksheets(«Лист2»).Range(«B8:S295») ‘диапазон с которым сравнивают

Application.ScreenUpdating = False
Selection.Interior.ColorIndex = xlNone

For Each y In CompareRange
If Not IsEmpty(y) Then
For Each x In Selection
If InStr(1, x, y, vbTextCompare) > 0 Then x.Interior.Color = vbGreen
Next x
End If
Next y

MsgBox «Данные проверены»
End Sub

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

t330 Дата: Четверг, 30.01.2020, 14:49 | Сообщение № 2

Добрый день.
Ваш исходный макрос ( в коде ниже — Вар1 ) подсвечивает все ячейки , если находит в них строку из CompareRange .

Например , если в ячейке Листа 1 будет цифра 46.10056546546 (это x) , а в ячейке из диапазона CompareRange будет цифра 100 (это y ) ,

то debug.Print instr(1,46.10056546546,100,vbTextCompare) выдаст 4

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

Private Sub Find_MisMatches()
Dim CompareRange As Range, x As Range, y As Range
Set CompareRange = Worksheets(«Лист2»).Range(«B1:B12») ‘диапазон с которым сравнивают

Application.ScreenUpdating = False
Worksheets(«Лист1»).UsedRange.Interior.ColorIndex = xlNone

‘Вар1. Подсвечивает ячейки в диапазоне Worksheets(«Лист1»).Range(«D1:D12»)
‘если внутри строки из символов этой ячейки найдена хоть одно совпадение с ячейками из диапазона CampareRange
For Each y In CompareRange
‘ Debug.Print y
If Not IsEmpty(y) Then
For Each x In Worksheets(«Лист1»).Range(«D1:D12»)
If InStr(1, x, y, vbTextCompare) > 0 Then x.Interior.Color = vbGreen
‘Debug.Print x, y, InStr(1, x, y, vbTextCompare)
Next x
End If
Next y

‘Вар2. Подсвечивает ячейки в диапазоне Worksheets(«Лист1»).Range(«F1:F12»)
‘если ячейка из этого диапазона совпадает по значению с ЛЮБОЙ из ячеек из диапазона CompareRange
For Each y In CompareRange

If Not IsEmpty(y) Then
For Each x In Worksheets(«Лист1»).Range(«F1:F12») ‘ циклом берем любую ячейку из диапазона CompareRange и сравниваем её значение с ячейкой в сравниваемом диапазоне Worksheets(«Лист1»).Range(«F1:F12»)
If x = y Then x.Interior.Color = vbGreen
Next x
End If
Next y

‘Вар3. Подсвечивает ячейки в диапазоне Worksheets(«Лист1»).Usedrange
‘если ячейка из диапазона в Листе 1 совпадает с ячейкой с таким же адресом из диапазона CompareRange

Dim i As Integer, j As Integer ‘ переменные для записи номеров строк и столбов в ячейках из дипазона Comparerange

Set x = Worksheets(«Лист1»).UsedRange ‘ устанавливаем диапазон в котором надо подсветить совпадающие ячейки при сравнении с Comparerange

For Each y In CompareRange

If Not IsEmpty(y) Then
i = y.Row ‘ записываем номер строки ячейки из Comparerange
j = y.Column ‘записываем номер столбца ячейки из Comparerange
If x(i, j) = y Then x(i, j).Interior.Color = vbGreen ‘если данные в ячейке из сравниваемого диапазона на листе 1 совпадают с данными в ячейке из диапазона CampareRange с тем же номером строки и с тем же номер столбца, то подсвечиваем
End If
Next y

MsgBox «Данные проверены»
End Sub

Добрый день.
Ваш исходный макрос ( в коде ниже — Вар1 ) подсвечивает все ячейки , если находит в них строку из CompareRange .

Например , если в ячейке Листа 1 будет цифра 46.10056546546 (это x) , а в ячейке из диапазона CompareRange будет цифра 100 (это y ) ,

то debug.Print instr(1,46.10056546546,100,vbTextCompare) выдаст 4

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

Private Sub Find_MisMatches()
Dim CompareRange As Range, x As Range, y As Range
Set CompareRange = Worksheets(«Лист2»).Range(«B1:B12») ‘диапазон с которым сравнивают

Application.ScreenUpdating = False
Worksheets(«Лист1»).UsedRange.Interior.ColorIndex = xlNone

‘Вар1. Подсвечивает ячейки в диапазоне Worksheets(«Лист1»).Range(«D1:D12»)
‘если внутри строки из символов этой ячейки найдена хоть одно совпадение с ячейками из диапазона CampareRange
For Each y In CompareRange
‘ Debug.Print y
If Not IsEmpty(y) Then
For Each x In Worksheets(«Лист1»).Range(«D1:D12»)
If InStr(1, x, y, vbTextCompare) > 0 Then x.Interior.Color = vbGreen
‘Debug.Print x, y, InStr(1, x, y, vbTextCompare)
Next x
End If
Next y

‘Вар2. Подсвечивает ячейки в диапазоне Worksheets(«Лист1»).Range(«F1:F12»)
‘если ячейка из этого диапазона совпадает по значению с ЛЮБОЙ из ячеек из диапазона CompareRange
For Each y In CompareRange

If Not IsEmpty(y) Then
For Each x In Worksheets(«Лист1»).Range(«F1:F12») ‘ циклом берем любую ячейку из диапазона CompareRange и сравниваем её значение с ячейкой в сравниваемом диапазоне Worksheets(«Лист1»).Range(«F1:F12»)
If x = y Then x.Interior.Color = vbGreen
Next x
End If
Next y

‘Вар3. Подсвечивает ячейки в диапазоне Worksheets(«Лист1»).Usedrange
‘если ячейка из диапазона в Листе 1 совпадает с ячейкой с таким же адресом из диапазона CompareRange

Dim i As Integer, j As Integer ‘ переменные для записи номеров строк и столбов в ячейках из дипазона Comparerange

Set x = Worksheets(«Лист1»).UsedRange ‘ устанавливаем диапазон в котором надо подсветить совпадающие ячейки при сравнении с Comparerange

For Each y In CompareRange

If Not IsEmpty(y) Then
i = y.Row ‘ записываем номер строки ячейки из Comparerange
j = y.Column ‘записываем номер столбца ячейки из Comparerange
If x(i, j) = y Then x(i, j).Interior.Color = vbGreen ‘если данные в ячейке из сравниваемого диапазона на листе 1 совпадают с данными в ячейке из диапазона CampareRange с тем же номером строки и с тем же номер столбца, то подсвечиваем
End If
Next y

MsgBox «Данные проверены»
End Sub

Сообщение Добрый день.
Ваш исходный макрос ( в коде ниже — Вар1 ) подсвечивает все ячейки , если находит в них строку из CompareRange .

Например , если в ячейке Листа 1 будет цифра 46.10056546546 (это x) , а в ячейке из диапазона CompareRange будет цифра 100 (это y ) ,

то debug.Print instr(1,46.10056546546,100,vbTextCompare) выдаст 4

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

Private Sub Find_MisMatches()
Dim CompareRange As Range, x As Range, y As Range
Set CompareRange = Worksheets(«Лист2»).Range(«B1:B12») ‘диапазон с которым сравнивают

Application.ScreenUpdating = False
Worksheets(«Лист1»).UsedRange.Interior.ColorIndex = xlNone

‘Вар1. Подсвечивает ячейки в диапазоне Worksheets(«Лист1»).Range(«D1:D12»)
‘если внутри строки из символов этой ячейки найдена хоть одно совпадение с ячейками из диапазона CampareRange
For Each y In CompareRange
‘ Debug.Print y
If Not IsEmpty(y) Then
For Each x In Worksheets(«Лист1»).Range(«D1:D12»)
If InStr(1, x, y, vbTextCompare) > 0 Then x.Interior.Color = vbGreen
‘Debug.Print x, y, InStr(1, x, y, vbTextCompare)
Next x
End If
Next y

‘Вар2. Подсвечивает ячейки в диапазоне Worksheets(«Лист1»).Range(«F1:F12»)
‘если ячейка из этого диапазона совпадает по значению с ЛЮБОЙ из ячеек из диапазона CompareRange
For Each y In CompareRange

If Not IsEmpty(y) Then
For Each x In Worksheets(«Лист1»).Range(«F1:F12») ‘ циклом берем любую ячейку из диапазона CompareRange и сравниваем её значение с ячейкой в сравниваемом диапазоне Worksheets(«Лист1»).Range(«F1:F12»)
If x = y Then x.Interior.Color = vbGreen
Next x
End If
Next y

‘Вар3. Подсвечивает ячейки в диапазоне Worksheets(«Лист1»).Usedrange
‘если ячейка из диапазона в Листе 1 совпадает с ячейкой с таким же адресом из диапазона CompareRange

Dim i As Integer, j As Integer ‘ переменные для записи номеров строк и столбов в ячейках из дипазона Comparerange

Set x = Worksheets(«Лист1»).UsedRange ‘ устанавливаем диапазон в котором надо подсветить совпадающие ячейки при сравнении с Comparerange

For Each y In CompareRange

If Not IsEmpty(y) Then
i = y.Row ‘ записываем номер строки ячейки из Comparerange
j = y.Column ‘записываем номер столбца ячейки из Comparerange
If x(i, j) = y Then x(i, j).Interior.Color = vbGreen ‘если данные в ячейке из сравниваемого диапазона на листе 1 совпадают с данными в ячейке из диапазона CampareRange с тем же номером строки и с тем же номер столбца, то подсвечиваем
End If
Next y

MsgBox «Данные проверены»
End Sub

skrpv1 Дата: Четверг, 30.01.2020, 15:51 | Сообщение № 3

Излишнее цитирование удалено администрацией — это нарушение п.5j Правил форума

Огромное вам спасибо. Да, мне подходит 3 вариант вашего кода. Но такой вопрос. Таблица оригинальная, к которой я это применяю имеет диапазон ячеек для проверки B7:R291, как мне сделать проверку каждой ячейки листа 1 с каждой ячейкой листа 2 такого же диапазона? В первоначальном случае это делалось циклом «for», если я правильно понимаю. И получается в вашем 3-ем варианте, диапазон где подсвечиваются ячейки (х), он выделяется сам, т.е. целиком лист 1? Или мне самому нужно прописывать необходимые значения? Извините за глупые вопросы, повторюсь, нахожусь в стадии изучения.

Излишнее цитирование удалено администрацией — это нарушение п.5j Правил форума

Огромное вам спасибо. Да, мне подходит 3 вариант вашего кода. Но такой вопрос. Таблица оригинальная, к которой я это применяю имеет диапазон ячеек для проверки B7:R291, как мне сделать проверку каждой ячейки листа 1 с каждой ячейкой листа 2 такого же диапазона? В первоначальном случае это делалось циклом «for», если я правильно понимаю. И получается в вашем 3-ем варианте, диапазон где подсвечиваются ячейки (х), он выделяется сам, т.е. целиком лист 1? Или мне самому нужно прописывать необходимые значения? Извините за глупые вопросы, повторюсь, нахожусь в стадии изучения. skrpv1

Сообщение Излишнее цитирование удалено администрацией — это нарушение п.5j Правил форума

Огромное вам спасибо. Да, мне подходит 3 вариант вашего кода. Но такой вопрос. Таблица оригинальная, к которой я это применяю имеет диапазон ячеек для проверки B7:R291, как мне сделать проверку каждой ячейки листа 1 с каждой ячейкой листа 2 такого же диапазона? В первоначальном случае это делалось циклом «for», если я правильно понимаю. И получается в вашем 3-ем варианте, диапазон где подсвечиваются ячейки (х), он выделяется сам, т.е. целиком лист 1? Или мне самому нужно прописывать необходимые значения? Извините за глупые вопросы, повторюсь, нахожусь в стадии изучения. Автор — skrpv1
Дата добавления — 30.01.2020 в 15:51

t330 Дата: Четверг, 30.01.2020, 20:31 | Сообщение № 4

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

Например в ячейке B7 и в первом и во втором листе стоит цифра 11,6633333541895
но функция =ВПР(Лист1!B7;Лист2!B:B;1;0) показывает Н/Д (см в ячейке Лист1!B15)

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

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

Private Sub Find_MisMatches()
Dim CompareRange As Range, x As Range, y As Range, InitialSheet As Worksheet
Dim i As Long, j As Long ‘ переменные для записи номеров строк и столбов в ячейках из дипазона Comparerange

Set InitialSheet = Worksheets(«Лист1») ‘ устанавливаем диапазон в котором надо подсветить совпадающие ячейки из листа 1 при сравнении с Comparerange. В данном случае выбирается диапазон со всеми когда-либо заполненными ячейками в Листе1
Set CompareRange = Application.InputBox(«Укажите диапазон ячеек для сравнения», «Запрос данных», «B2:S10», Type:=8) ‘диапазон в листе 2 с которым сравнивают. В данном случае это все когда-либо заполненные ячейки в листе2

Application.ScreenUpdating = False
InitialSheet.UsedRange.Interior.ColorIndex = xlNone ‘ очищаем заливку в диапазоне где будем заливать совпадающие ячейки

On Error Resume Next

‘Вар3. Подсвечивает ячейки в сравниваемом диапазоне , но только в тех ячейках ,
‘у которых тот же самый адрес , что и выбранном диаппазоне CompareRange

‘Если выбрано менее двух ячеек
If CompareRange.Count = 1 Then
MsgBox «Для отбора уникальных значений требуется указать более одной ячейки», vbInformation
Exit Sub
End If

‘если указаны только пустые ячейки вне рабочего диапазона
If CompareRange Is Nothing Then
MsgBox «Недостаточно данных для выбора значений», vbInformation
Exit Sub
End If

‘Запускаем цикл по каждой ячейке из Comparerange
For Each y In CompareRange

i = y.Row ‘ записываем номер строки ячейки из Comparerange
j = y.Column ‘записываем номер столбца ячейки из Comparerange

10 If CStr(InitialSheet.Cells(i, j).Value) = CStr(CompareRange.Parent.Cells(i, j).Value) Then ‘ здесь преобразовываем данные в ячейках в текстовый формат и сравниваем
InitialSheet.Cells(i, j).Interior.Color = vbGreen ‘если данные в ячейке из сравниваемого диапазона на листе 1 совпадают с данными в ячейке из диапазона CompareRange с тем же номером строки и с тем же номер столбца, то подсвечиваем зеленым
End If

Next y
MsgBox «Данные проверены»
End Sub

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

Например в ячейке B7 и в первом и во втором листе стоит цифра 11,6633333541895
но функция =ВПР(Лист1!B7;Лист2!B:B;1;0) показывает Н/Д (см в ячейке Лист1!B15)

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

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

Private Sub Find_MisMatches()
Dim CompareRange As Range, x As Range, y As Range, InitialSheet As Worksheet
Dim i As Long, j As Long ‘ переменные для записи номеров строк и столбов в ячейках из дипазона Comparerange

Set InitialSheet = Worksheets(«Лист1») ‘ устанавливаем диапазон в котором надо подсветить совпадающие ячейки из листа 1 при сравнении с Comparerange. В данном случае выбирается диапазон со всеми когда-либо заполненными ячейками в Листе1
Set CompareRange = Application.InputBox(«Укажите диапазон ячеек для сравнения», «Запрос данных», «B2:S10», Type:=8) ‘диапазон в листе 2 с которым сравнивают. В данном случае это все когда-либо заполненные ячейки в листе2

Application.ScreenUpdating = False
InitialSheet.UsedRange.Interior.ColorIndex = xlNone ‘ очищаем заливку в диапазоне где будем заливать совпадающие ячейки

On Error Resume Next

‘Вар3. Подсвечивает ячейки в сравниваемом диапазоне , но только в тех ячейках ,
‘у которых тот же самый адрес , что и выбранном диаппазоне CompareRange

‘Если выбрано менее двух ячеек
If CompareRange.Count = 1 Then
MsgBox «Для отбора уникальных значений требуется указать более одной ячейки», vbInformation
Exit Sub
End If

‘если указаны только пустые ячейки вне рабочего диапазона
If CompareRange Is Nothing Then
MsgBox «Недостаточно данных для выбора значений», vbInformation
Exit Sub
End If

‘Запускаем цикл по каждой ячейке из Comparerange
For Each y In CompareRange

i = y.Row ‘ записываем номер строки ячейки из Comparerange
j = y.Column ‘записываем номер столбца ячейки из Comparerange

10 If CStr(InitialSheet.Cells(i, j).Value) = CStr(CompareRange.Parent.Cells(i, j).Value) Then ‘ здесь преобразовываем данные в ячейках в текстовый формат и сравниваем
InitialSheet.Cells(i, j).Interior.Color = vbGreen ‘если данные в ячейке из сравниваемого диапазона на листе 1 совпадают с данными в ячейке из диапазона CompareRange с тем же номером строки и с тем же номер столбца, то подсвечиваем зеленым
End If

Next y
MsgBox «Данные проверены»
End Sub

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

Например в ячейке B7 и в первом и во втором листе стоит цифра 11,6633333541895
но функция =ВПР(Лист1!B7;Лист2!B:B;1;0) показывает Н/Д (см в ячейке Лист1!B15)

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

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

Private Sub Find_MisMatches()
Dim CompareRange As Range, x As Range, y As Range, InitialSheet As Worksheet
Dim i As Long, j As Long ‘ переменные для записи номеров строк и столбов в ячейках из дипазона Comparerange

Set InitialSheet = Worksheets(«Лист1») ‘ устанавливаем диапазон в котором надо подсветить совпадающие ячейки из листа 1 при сравнении с Comparerange. В данном случае выбирается диапазон со всеми когда-либо заполненными ячейками в Листе1
Set CompareRange = Application.InputBox(«Укажите диапазон ячеек для сравнения», «Запрос данных», «B2:S10», Type:=8) ‘диапазон в листе 2 с которым сравнивают. В данном случае это все когда-либо заполненные ячейки в листе2

Application.ScreenUpdating = False
InitialSheet.UsedRange.Interior.ColorIndex = xlNone ‘ очищаем заливку в диапазоне где будем заливать совпадающие ячейки

On Error Resume Next

‘Вар3. Подсвечивает ячейки в сравниваемом диапазоне , но только в тех ячейках ,
‘у которых тот же самый адрес , что и выбранном диаппазоне CompareRange

‘Если выбрано менее двух ячеек
If CompareRange.Count = 1 Then
MsgBox «Для отбора уникальных значений требуется указать более одной ячейки», vbInformation
Exit Sub
End If

‘если указаны только пустые ячейки вне рабочего диапазона
If CompareRange Is Nothing Then
MsgBox «Недостаточно данных для выбора значений», vbInformation
Exit Sub
End If

‘Запускаем цикл по каждой ячейке из Comparerange
For Each y In CompareRange

i = y.Row ‘ записываем номер строки ячейки из Comparerange
j = y.Column ‘записываем номер столбца ячейки из Comparerange

10 If CStr(InitialSheet.Cells(i, j).Value) = CStr(CompareRange.Parent.Cells(i, j).Value) Then ‘ здесь преобразовываем данные в ячейках в текстовый формат и сравниваем
InitialSheet.Cells(i, j).Interior.Color = vbGreen ‘если данные в ячейке из сравниваемого диапазона на листе 1 совпадают с данными в ячейке из диапазона CompareRange с тем же номером строки и с тем же номер столбца, то подсвечиваем зеленым
End If

Next y
MsgBox «Данные проверены»
End Sub

Источник

Adblock
detector

0 / 0 / 0

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

Сообщений: 63

1

16.03.2010, 22:28. Показов 26491. Ответов 22


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

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

Ситуация:
Имеются две таблицы, на одной из страниц Excel, Табл1 и Табл2,причем у обеих таблиц мы знаем ячейку(верхний левый угол) с которой таблици будут заполнятся,таблицы могут принимать разное колличество строк и столбцов. Таблицы грузятся из базы данных, результат(нажатие на кнопку)-вывод «окна» таблицы равны или нет.
Слышал, что есть возможность у Excel по средствам VBA определять размеры таблиц,и таким образом вначале сравнить их по колличеству столбцов и строк, а затем по содержимому ячеек,причем столбцы таблицы могут меняться местами(за ошибку это не учитывается).
Вот,что то в этом стиле,вдруг кто сталкивался с этим,черкните,буду ток благодарен,или хорошую ссылочку ,тож не помешает,так как таблицы я загрузил,нужно савнить.



0



1904 / 781 / 31

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

Сообщений: 1,567

16.03.2010, 22:52

2

здесь посмотри определение кол-ва столбцов Добавление столбца.
по заголовкам: наверное поместить все заголовки в массив, упорядочить массивы, сравнить массивы с помощью Like. по сравнению данных, я так понял, проблемм нет?



1



0 / 0 / 0

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

Сообщений: 63

16.03.2010, 23:25

 [ТС]

3

А можно если тя не затруднить на примере показать,ну чтоб наглядно иметь представление. Например Табл1 с записями:

Фамилия Пол Диагноз Отделение
Минин муж Врожденный порок сердца Кардиологическое
Вишников муж Хронический ревматизм Кардиологическое
Кубышев муж Реактивный артрит Кардиологическое

,начинается с ячейки c3 и Табл2 с записями
Фамилия Пол Диагноз Отделение
Вишников муж Хронический ревматизм Кардиологическое
Кубышев муж Реактивный артрит Кардиологическое
Минин муж Врожденный порок сердца Кардиологическое

начинается с ячейки k3
, я просто в этом деле новичек хочется понять технологию и разобраться.
Спасибо



0



1904 / 781 / 31

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

Сообщений: 1,567

17.03.2010, 07:04

4

вот держи сравнение заголовков на скорую руку. надо еще дописать цикл сравнения строк. просто времени пока нет



1



0 / 0 / 0

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

Сообщений: 63

17.03.2010, 21:07

 [ТС]

5

Спасибо,большое!
Есть вопрос,сравнение идет ток по столбцам,а по ячейкам не канает
и вот еще, если нужно сравнивать таблицы на одном листе,эт осуществимо?



0



1904 / 781 / 31

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

Сообщений: 1,567

18.03.2010, 06:37

6

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



1



0 / 0 / 0

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

Сообщений: 63

19.03.2010, 20:31

 [ТС]

7

Добрый вечер,спасибо за помощь,можно еще вопрос?
Как будет выглидеть код если таблицы на одном листе будут, нужно активный лист указывать и адрес ячеек? И вот еще,как работает выподающий список, а то поискал,описание не очень,если не сложно можешь показать? Еще раз большое спасибо



0



ironegg

1904 / 781 / 31

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

Сообщений: 1,567

20.03.2010, 07:13

8

1.открываем лист, на котором есть таблицы, ставим курсор в любую свободную ячейку, нажимаем кнопку fx рядом со строкой формул.
2. в открывшемся окошке выбираем «ктегория» = «определенные пользователем»
3. в списке «выберите функцию» выбираем «СравнениеТаблиц».
4. функция имеет два аргумента, первую и вторую таблицу, выделите их.
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
Function ÑðàâíåíèåÒàáëèö(rng1 As Range, rng2 As Range)
boolResult = True
'öèêë ïåðåáîðà ñòðîê òàáëèöû
For CurrentRow = 1 To rng1.Rows.Count
    'ïðåîáðàçîâòü òåêóùóþ ñòðîêó â ìàññèâ
    arCurRow1 = fRangToArray(rng1.Range(Cells(CurrentRow, 1), Cells(CurrentRow, rng1.Columns.Count)))
    arCurRow2 = fRangToArray(rng2.Range(Cells(CurrentRow, 1), Cells(CurrentRow, rng1.Columns.Count)))
    'óïîðÿäî÷èòü ìàññèâû
    BubbleSort arCurRow1
    BubbleSort arCurRow2
    'ôëàã ðàâåíñòâà òàáëèö
    boolResult = boolResult And fCompareRows(arCurRow1, arCurRow2)
    'äëÿ îòëàäêè, âûâîäèò â Immediate ðàçëè÷àþùèåñÿ ñòðîêè, äëÿ àíàëèçà
    If Not boolResult Then
        For I = 0 To UBound(arCurRow1)
            S1 = S1 & arCurRow1(I) & "  "
            S2 = S2 & arCurRow2(I) & "  "
        Next I
        Debug.Print S1
        Debug.Print S2
        Debug.Print ""
        Exit For
    End If
 
Next CurrentRow
'âûâîä ðåçóëüòàòà
If boolResult Then
    Result = "ðàâíû"
Else
    Result = "íå ðàâíû, ñìîòðè 'Immediate widow'"
End If
ÑðàâíåíèåÒàáëèö = "Òàáëèöû " & Result
End Function
 
Public Function fRangToArray(Rng As Range)
Dim Arr() As String
ReDim Arr(Rng.Columns.Count - 1)
For I = 1 To Rng.Columns.Count
    Arr(I - 1) = Rng.Cells(1, I).Value
Next I
fRangToArray = Arr
End Function
 
Public Function fCompareRows(Arr1, Arr2)
For I = 0 To UBound(Arr1)
    If Not LCase(Arr1(I)) = LCase(Arr2(I)) Then
        fCompareRows = False
        Exit Function
    End If
Next I
fCompareRows = True
End Function
 
'Ïðîöåäóðà äëÿ ñîðòèðîâêè ìàññèâà ìåòîäîì ïóçûðüêà
Sub BubbleSort(ByRef Arr)
    Dim I
    Dim J
    Dim Tmp
 
    For I = 0 To UBound(Arr) Step 1
        For J = 0 To UBound(Arr) - 1 - I Step 1
            If LCase(Arr(J)) > LCase(Arr(J + 1)) Then
                Tmp = Arr(J)
                Arr(J) = Arr(J + 1)
                Arr(J + 1) = Tmp
            End If
        Next J
    Next I
End Sub

Вложения

Тип файла: zip сравнение таблиц.zip (12.9 Кб, 788 просмотров)



2



1904 / 781 / 31

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

Сообщений: 1,567

20.03.2010, 07:16

9

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



1



0 / 0 / 0

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

Сообщений: 63

21.03.2010, 12:57

 [ТС]

10

Спасибо Excel гуру!
А у тебя что за Excel? и меня такой категории нет



0



1904 / 781 / 31

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

Сообщений: 1,567

21.03.2010, 13:18

11

excel2002



1



0 / 0 / 0

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

Сообщений: 63

21.03.2010, 18:14

 [ТС]

12

разобрался))) сделал как надо) можешь по возможности объяснить как ComboBox робит?



0



1904 / 781 / 31

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

Сообщений: 1,567

21.03.2010, 18:33

13

в отдельную тему и подробное описание проблеммы



1



0 / 0 / 0

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

Сообщений: 63

21.03.2010, 20:22

 [ТС]

14

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

Добавлено через 13 минут
А то как получается,данные,то ведь одинаковые только сортировка разная у таблиц.Как поправить подскажи?Спасибо.



0



1904 / 781 / 31

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

Сообщений: 1,567

21.03.2010, 21:31

15

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



1



0 / 0 / 0

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

Сообщений: 63

21.03.2010, 22:31

 [ТС]

16

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



0



0 / 0 / 0

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

Сообщений: 63

22.03.2010, 23:43

 [ТС]

17

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



0



ironegg

1904 / 781 / 31

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

Сообщений: 1,567

29.03.2010, 22:12

18

по многочисленным просьбам трудящихся

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
94
95
96
97
98
99
100
Private Sub btPoluchitj_Click()
Static r1 As Range
Static r2 As Range
Select Case btPoluchitj.Caption
    Case "добавить выделенное как таблицу 1"
        Set r1 = Selection
        btPoluchitj.Caption = "добавить выделенное как таблицу 2"
    Case "добавить выделенное как таблицу 2"
        Set r2 = Selection
        btPoluchitj.Enabled = False
        
        AddDataToSpreadShets r1, r2
        DtSort
End Select
End Sub
 
Private Sub btCompTable_Click()
Dim uRng1 As OWC10.Range
Dim uRng2 As OWC10.Range
Static m As Integer
Static s As String
 
s = IIf(m = 0, "НЕ найдены", s)
m = m + 1
Set uRng1 = Spreadsheet1.ActiveSheet.UsedRange
Set uRng2 = Spreadsheet2.ActiveSheet.UsedRange
If uRng1.Columns.Count = uRng1.Columns.Count And uRng1.Rows.Count = uRng1.Rows.Count Then
    For n = m To uRng1.Cells.Count
        If uRng1.Cells(n) <> uRng2.Cells(n) Then
            uRng1.Cells(n).Select
            uRng2.Cells(n).Select
            s = "найдены"
            MsgBox Chr(9) & "в этих ячейках данные различаются" & Chr(10) & _
            "снова нажмите кнопку 'сравнить таблицы' чтобы продолжить поиск отличий"
            Spreadsheet2.SetFocus
            m = IIf(m = uRng1.Cells.Count, 0, m)
            Exit For
        Else
            m = m + 1
        End If
        If n = uRng1.Cells.Count Then
            m = 0
            MsgBox "сравнение таблиц завершено, отличия " & s
        End If
    Next n
Else
        MsgBox "таблицы разного размера!"
End If
End Sub
 
 
Public Sub AddDataToSpreadShets(Rng1 As Range, Rng2 As Range)
Dim Rng As Range
Dim i As Integer
 
Rng1.Copy
Spreadsheet1.Range("A1").Paste
Spreadsheet1.Columns.AutoFit
 
 
 
Arr = Spreadsheet1.Worksheets(1).UsedRange.Range("A1", Chr(Asc("A") + Spreadsheet1.Worksheets(1).UsedRange.Columns.Count - 1) & 1)
 
For i = 1 To UBound(Arr, 2)
    Set Rng = Rng2.Range("A1", Rng2.Cells(1, Rng2.Columns.Count)).Find(Arr(1, i))
    If Not Rng Is Nothing Then
        CurCol = Rng.Column - Rng2.Column + 1  'поизиция текущего столбца в Rng2
        Rng2.Range(Cells(1, CurCol), Cells(Rng2.Rows.Count, CurCol)).Copy
        Spreadsheet2.Range(Chr(Asc("A") - 1 + i) & 1).Paste
    Else
        Rng2(1, CurCol + 1).Select
        Rng2.Worksheet.Activate
        a = MsgBox(Chr(9) & Chr(9) & "текст заголовка такой:" & Chr(10) & Chr(10) & Selection.Text& _
        , , "такого заголовка нет в таблице2" & "  (столбец " & i & ")")
        Exit Sub
    End If
Next i
UserForm1.Spreadsheet1.Range("A1").Select
UserForm1.Spreadsheet2.Range("A1").Select
End Sub
 
Public Sub DtSort()
Spreadsheet1.ActiveSheet.Range(Chr(Asc("A")) & 2, Chr(Asc("A") + Spreadsheet1.ActiveSheet.UsedRange.Columns.Count) & _
Spreadsheet1.ActiveSheet.UsedRange.Rows.Count).Select
Spreadsheet2.ActiveSheet.Range(Chr(Asc("A")) & 2, Chr(Asc("A") + Spreadsheet2.ActiveSheet.UsedRange.Columns.Count) & _
Spreadsheet2.ActiveSheet.UsedRange.Rows.Count).Select
 
For i = Spreadsheet1.ActiveSheet.UsedRange.Columns.Count To 1 Step -1
    Spreadsheet1.Selection.Sort i
    Spreadsheet2.Selection.Sort i
Next i
UserForm1.Spreadsheet1.Range("A1").Select
UserForm1.Spreadsheet2.Range("A1").Select
Spreadsheet2.Columns.AutoFit
 
End Sub
 
Private Sub UserForm_Click()
 
End Sub

возможно, понадобиться добавить ссылку на «веб компоненты офис ХР» (Tools — References — Browse — C:Program FilesCommon FilesMicrosoft SharedWeb Components10OWC10.DLL) если у вас в системе вебкомпоненты другой версии, можно поробовать заменить в тексте кода формы «OWC10» на, например, «OWC11». также, возомжно, что вэб компоненты не были установлены при инсталляции Офиса. придется их доустановить.
сделать выбор таблиц при помощи REfEdit у меня не вышло. видимо этот компонент у меня установлен криво. поэтому выбор сделал с помощю кнопки. работает так: выделяете первую таблицу — нажимаете кнопку; выделяете вторую таблицу — нажимаете кнопку.

Вложения

Тип файла: zip сравнение таблиц (version2).zip (19.6 Кб, 188 просмотров)



1



0 / 0 / 0

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

Сообщений: 63

17.04.2010, 16:31

 [ТС]

19

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



0



1904 / 781 / 31

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

Сообщений: 1,567

18.04.2010, 13:39

20

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



1



Понравилась статья? Поделить с друзьями:
  • Vba сохранить файл excel в txt
  • Vba сохранить картинки excel
  • Vba сохранить как документ word
  • Vba создание шаблона word
  • Vba создание функции для всего excel