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

Вход

Регистрация

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

 

= Мир MS Excel/сравнение таблиц - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по Excel » сравнение таблиц
сравнение таблиц
megavlom Дата: Понедельник, 05.09.2011, 21:00 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 105
Репутация: 1 ±
Замечаний: 0% ±

Добрый вечер.Есть три таблицы и макрос,сравнивающий две таблицы по одинаковым строкам.Как изменить(дополнить) макрос,чтобы сравнение происходило по трем таблицам.
К сообщению приложен файл: 209.noext (43.0 Kb)
 
Ответить
СообщениеДобрый вечер.Есть три таблицы и макрос,сравнивающий две таблицы по одинаковым строкам.Как изменить(дополнить) макрос,чтобы сравнение происходило по трем таблицам.

Автор - megavlom
Дата добавления - 05.09.2011 в 21:00
Гость Дата: Понедельник, 05.09.2011, 21:52 | Сообщение № 2
Группа: Гости
megavlom, здравствуйте
А с расширением ничего не перепутали ?
 
Ответить
Сообщениеmegavlom, здравствуйте
А с расширением ничего не перепутали ?

Автор - Гость
Дата добавления - 05.09.2011 в 21:52
megavlom Дата: Понедельник, 05.09.2011, 22:31 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 105
Репутация: 1 ±
Замечаний: 0% ±

Мне аж самому интересно стало-что это такое.Скачал файл,а открыть не смог.Я когда то отмечал,что связь у нас ещё та...
К сообщению приложен файл: POST_209.xls (43.0 Kb)
 
Ответить
СообщениеМне аж самому интересно стало-что это такое.Скачал файл,а открыть не смог.Я когда то отмечал,что связь у нас ещё та...

Автор - megavlom
Дата добавления - 05.09.2011 в 22:31
nilem Дата: Вторник, 06.09.2011, 08:35 | Сообщение № 4
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Так как-то:
[vba]
Код
Sub ertert() 'вторая версия
Dim aRef, a, x, y(), i&, s$, t, dic As Object
Set dic = CreateObject("Scripting.Dictionary"): dic.CompareMode = 1

aRef = Array(Sheets(1).[a3], Sheets(1).[d3], Sheets(1).[g3])
On Error Resume Next
For Each a In aRef
      x = a.CurrentRegion.Value
      With New Collection
          For i = 1 To UBound(x)
              s = x(i, 1) & "|" & x(i, 2)
              If IsEmpty(.Item(s)) Then .Add s, s
          Next i
          For i = 1 To .Count
              s = .Item(i)
              If dic.Exists(s) Then dic.Item(s) = dic.Item(s) + 1 Else dic.Item(s) = 1
          Next i
      End With
Next a: On Error GoTo 0

ReDim y(1 To dic.Count, 1 To 2): i = 0
For Each a In dic.Keys
      If dic.Item(a) = 3 Then t = Split(a, "|"): i = i + 1: y(i, 1) = t(0): y(i, 2) = t(1)
Next a

If i > 0 Then Sheets(1).[j3:k3].Resize(i) = y
Set dic = Nothing
End Sub
[/vba]
Если Sheets(1) активный, то ссылку на него можно убрать.


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

Сообщение отредактировал nilem - Вторник, 06.09.2011, 09:28
 
Ответить
СообщениеТак как-то:
[vba]
Код
Sub ertert() 'вторая версия
Dim aRef, a, x, y(), i&, s$, t, dic As Object
Set dic = CreateObject("Scripting.Dictionary"): dic.CompareMode = 1

aRef = Array(Sheets(1).[a3], Sheets(1).[d3], Sheets(1).[g3])
On Error Resume Next
For Each a In aRef
      x = a.CurrentRegion.Value
      With New Collection
          For i = 1 To UBound(x)
              s = x(i, 1) & "|" & x(i, 2)
              If IsEmpty(.Item(s)) Then .Add s, s
          Next i
          For i = 1 To .Count
              s = .Item(i)
              If dic.Exists(s) Then dic.Item(s) = dic.Item(s) + 1 Else dic.Item(s) = 1
          Next i
      End With
Next a: On Error GoTo 0

ReDim y(1 To dic.Count, 1 To 2): i = 0
For Each a In dic.Keys
      If dic.Item(a) = 3 Then t = Split(a, "|"): i = i + 1: y(i, 1) = t(0): y(i, 2) = t(1)
Next a

If i > 0 Then Sheets(1).[j3:k3].Resize(i) = y
Set dic = Nothing
End Sub
[/vba]
Если Sheets(1) активный, то ссылку на него можно убрать.

Автор - nilem
Дата добавления - 06.09.2011 в 08:35
Hugo Дата: Вторник, 06.09.2011, 09:22 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Николай, так по
Мира, 15-Ленина 14 Иванов ИП
наврало...


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеНиколай, так по
Мира, 15-Ленина 14 Иванов ИП
наврало...

Автор - Hugo
Дата добавления - 06.09.2011 в 09:22
nilem Дата: Вторник, 06.09.2011, 09:27 | Сообщение № 6
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Quote (Hugo)
Николай, так по
Мира, 15-Ленина 14 Иванов ИП
наврало...

Да-да, увидел. Это потому что ert, а надо было ertert smile
Код в предыдущем посте переложу.


Яндекс.Деньги 4100159601573
 
Ответить
Сообщение
Quote (Hugo)
Николай, так по
Мира, 15-Ленина 14 Иванов ИП
наврало...

Да-да, увидел. Это потому что ert, а надо было ertert smile
Код в предыдущем посте переложу.

Автор - nilem
Дата добавления - 06.09.2011 в 09:27
Hugo Дата: Вторник, 06.09.2011, 09:43 | Сообщение № 7
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Я предлагаю такую поправку в твою первую версию на словаре:
[vba]
Код
Sub ert()
Dim aRef, a, x, y(), i&, j&, s$, t, ind&, st$
aRef = Array(Sheets(1).[a3], Sheets(1).[d3], Sheets(1).[g3])
With CreateObject("Scripting.Dictionary")
              .CompareMode = 1
              For Each a In aRef
                  x = a.CurrentRegion.Value
                  ind = ind + 1
                  For i = 1 To UBound(x)
                      s = x(i, 1) & "|" & x(i, 2)
                      If .Exists(s) Then
                      st = .Item(s)
                      Mid(st, ind) = ind
                      .Item(s) = st
                      Else
                      st = "000"
                      Mid(st, ind) = ind
                      .Item(s) = st
                      End If
                  Next i
              Next a
              ReDim y(1 To .Count, 1 To 2)
              For Each a In .Keys
                  If .Item(a) = "123" Then t = Split(a, "|"): j = j + 1: y(j, 1) = t(0): y(j, 2) = t(1)
              Next a
End With
Sheets(1).[j3:k3].Resize(j) = y
End Sub
[/vba]

Даже так - изначально st задать таким образом, будет универсальнее:
[vba]
Код
st = String(UBound(aRef) + 1, "0")
[/vba]
и тогда ещё в конце проверку сделать так:
 [vba]
Код
    ReDim y(1 To .Count, 1 To 2)
         st = ""
         For i = 0 To UBound(aRef): st = st & i + 1: Next
         For Each a In .Keys
             If .Item(a) = st Then t = Split(a, "|"): j = j + 1: y(j, 1) = t(0): y(j, 2) = t(1)
         Next a
[/vba]


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеЯ предлагаю такую поправку в твою первую версию на словаре:
[vba]
Код
Sub ert()
Dim aRef, a, x, y(), i&, j&, s$, t, ind&, st$
aRef = Array(Sheets(1).[a3], Sheets(1).[d3], Sheets(1).[g3])
With CreateObject("Scripting.Dictionary")
              .CompareMode = 1
              For Each a In aRef
                  x = a.CurrentRegion.Value
                  ind = ind + 1
                  For i = 1 To UBound(x)
                      s = x(i, 1) & "|" & x(i, 2)
                      If .Exists(s) Then
                      st = .Item(s)
                      Mid(st, ind) = ind
                      .Item(s) = st
                      Else
                      st = "000"
                      Mid(st, ind) = ind
                      .Item(s) = st
                      End If
                  Next i
              Next a
              ReDim y(1 To .Count, 1 To 2)
              For Each a In .Keys
                  If .Item(a) = "123" Then t = Split(a, "|"): j = j + 1: y(j, 1) = t(0): y(j, 2) = t(1)
              Next a
End With
Sheets(1).[j3:k3].Resize(j) = y
End Sub
[/vba]

Даже так - изначально st задать таким образом, будет универсальнее:
[vba]
Код
st = String(UBound(aRef) + 1, "0")
[/vba]
и тогда ещё в конце проверку сделать так:
 [vba]
Код
    ReDim y(1 To .Count, 1 To 2)
         st = ""
         For i = 0 To UBound(aRef): st = st & i + 1: Next
         For Each a In .Keys
             If .Item(a) = st Then t = Split(a, "|"): j = j + 1: y(j, 1) = t(0): y(j, 2) = t(1)
         Next a
[/vba]

Автор - Hugo
Дата добавления - 06.09.2011 в 09:43
Hugo Дата: Вторник, 06.09.2011, 10:07 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Слушай, ну и навернул во второй версии - я разобраться сходу не могу, как ты там ежа с ужом скрестил smile


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеСлушай, ну и навернул во второй версии - я разобраться сходу не могу, как ты там ежа с ужом скрестил smile

Автор - Hugo
Дата добавления - 06.09.2011 в 10:07
nilem Дата: Вторник, 06.09.2011, 10:33 | Сообщение № 9
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Да, Игорь, твой вариант лучше и, наверняка, быстрее. Тоже думал про индексы, но вот записать их в трехсимвольную строку не допер smile


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеДа, Игорь, твой вариант лучше и, наверняка, быстрее. Тоже думал про индексы, но вот записать их в трехсимвольную строку не допер smile

Автор - nilem
Дата добавления - 06.09.2011 в 10:33
megavlom Дата: Вторник, 06.09.2011, 10:37 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 105
Репутация: 1 ±
Замечаний: 0% ±

Добрый день.Код проверил-работает.Но то,что Вы делаете ЭТО действительно на уровне "шаманства";многое непонятно,но работает! Спасибо.
 
Ответить
СообщениеДобрый день.Код проверил-работает.Но то,что Вы делаете ЭТО действительно на уровне "шаманства";многое непонятно,но работает! Спасибо.

Автор - megavlom
Дата добавления - 06.09.2011 в 10:37
Hugo Дата: Вторник, 06.09.2011, 10:53 | Сообщение № 11
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Могу пояснить код Николая (с моей добавкой) smile
Перебором всех таблиц помещаем в словарь данные/значения (через разделитель"|"), в Item каждому значению кладём строку вида "000", где вместо каждого 0 будет номер таблицы, где это значение встретилось (можно вместо номера просто 1 ставить, не принципиально).
Повтор значения внутри таблицы просто переписывает этот Item в том же виде.
В итоге проверяем, если у значения в Item заполнены все позиции - значит это значение было во всех 3-х таблицах.
Моя коррекция ниже даёт динамику - таблиц может быть много, соответственно эта строка "0000..." будет формироваться по количеству таблиц.
Итоговой проверкой можно определить, в каких таблицах значение встречалось.
Т.е. может пригодиться и такой функционал - например, зная значение, получить список таблиц с этим значением.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеМогу пояснить код Николая (с моей добавкой) smile
Перебором всех таблиц помещаем в словарь данные/значения (через разделитель"|"), в Item каждому значению кладём строку вида "000", где вместо каждого 0 будет номер таблицы, где это значение встретилось (можно вместо номера просто 1 ставить, не принципиально).
Повтор значения внутри таблицы просто переписывает этот Item в том же виде.
В итоге проверяем, если у значения в Item заполнены все позиции - значит это значение было во всех 3-х таблицах.
Моя коррекция ниже даёт динамику - таблиц может быть много, соответственно эта строка "0000..." будет формироваться по количеству таблиц.
Итоговой проверкой можно определить, в каких таблицах значение встречалось.
Т.е. может пригодиться и такой функционал - например, зная значение, получить список таблиц с этим значением.

Автор - Hugo
Дата добавления - 06.09.2011 в 10:53
megavlom Дата: Вторник, 06.09.2011, 11:10 | Сообщение № 12
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 105
Репутация: 1 ±
Замечаний: 0% ±

За пояснения Спасибо.Может ещё один вопрос-если в таблицах будет не по два столбца,а по три;то как изменить код после t= ?
 
Ответить
СообщениеЗа пояснения Спасибо.Может ещё один вопрос-если в таблицах будет не по два столбца,а по три;то как изменить код после t= ?

Автор - megavlom
Дата добавления - 06.09.2011 в 11:10
Hugo Дата: Вторник, 06.09.2011, 11:17 | Сообщение № 13
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Соединяем:
s = x(i, 1) & "|" & x(i, 2) & "|" & x(i,3)
Массив пошире:
ReDim y(1 To .Count, 1 To 3)
После t:
y(j, 1) = t(0): y(j, 2) = t(1): y(j, 3) = t(2)
Выгружаем:
Sheets(1).[j3:l3].Resize(j) = y

Вроде так, ничего не забыл?


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеСоединяем:
s = x(i, 1) & "|" & x(i, 2) & "|" & x(i,3)
Массив пошире:
ReDim y(1 To .Count, 1 To 3)
После t:
y(j, 1) = t(0): y(j, 2) = t(1): y(j, 3) = t(2)
Выгружаем:
Sheets(1).[j3:l3].Resize(j) = y

Вроде так, ничего не забыл?

Автор - Hugo
Дата добавления - 06.09.2011 в 11:17
megavlom Дата: Вторник, 06.09.2011, 11:49 | Сообщение № 14
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 105
Репутация: 1 ±
Замечаний: 0% ±

ОТЛИЧНО!Теперь с пояснениями может пригодиться не только мне.Данный макрос может использоваться как "расширенный фильтр" для любого количества столбцов,не обязательно таблиц.А вообще большое Вам спасибо за коментарии в макросах,(и не только на этом сайте).Кто хочет,тот по ним учится и приспосабливает для своих задач.Ещё раз Всем Спасибо.
 
Ответить
СообщениеОТЛИЧНО!Теперь с пояснениями может пригодиться не только мне.Данный макрос может использоваться как "расширенный фильтр" для любого количества столбцов,не обязательно таблиц.А вообще большое Вам спасибо за коментарии в макросах,(и не только на этом сайте).Кто хочет,тот по ним учится и приспосабливает для своих задач.Ещё раз Всем Спасибо.

Автор - megavlom
Дата добавления - 06.09.2011 в 11:49
Hugo Дата: Вторник, 06.09.2011, 13:02 | Сообщение № 15
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Или вот такая модификация кода Николая - выведет все уникальные позиции с кодом в третьем столбце, по которому можно выяснить, где и сколько раз эта позиция встречалась, например
Мира, 15-Ленина 14 Иванов ИП 120
1 раз в первой, 2 во второй, 0 в третьей.
Наличие нуля указывает на то, что эта позиция была не во всех таблицах - по этому признаку можно отобрать нужные.

[vba]
Код
Sub ert()
Dim aRef, a, x, y(), i&, j&, s$, t, ind&
aRef = Array(Sheets(1).[a3], Sheets(1).[d3], Sheets(1).[g3])
With CreateObject("Scripting.Dictionary")
        .CompareMode = 1
        For Each a In aRef
            x = a.CurrentRegion.Value
            ind = ind + 1
            For i = 1 To UBound(x)
                s = x(i, 1) & "|" & x(i, 2)
                If .Exists(s) Then
                st = .Item(s)
                Mid(st, ind) = --Mid(st, ind, 1) + 1
                .Item(s) = st
                Else
                st = String(UBound(aRef) + 1, "0")
                Mid(st, ind) = 1
                .Item(s) = st
                End If
            Next i
        Next a
        ReDim y(1 To .Count, 1 To 3)
        For Each a In .Keys
           t = Split(a, "|"): j = j + 1: y(j, 1) = t(0): y(j, 2) = t(1): y(j, 3) = .Item(a)
        Next a
End With
With Sheets(1).[j3:l3].Resize(j)
.NumberFormat = "@"
.Value = y
End With
End Sub
[/vba]


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеИли вот такая модификация кода Николая - выведет все уникальные позиции с кодом в третьем столбце, по которому можно выяснить, где и сколько раз эта позиция встречалась, например
Мира, 15-Ленина 14 Иванов ИП 120
1 раз в первой, 2 во второй, 0 в третьей.
Наличие нуля указывает на то, что эта позиция была не во всех таблицах - по этому признаку можно отобрать нужные.

[vba]
Код
Sub ert()
Dim aRef, a, x, y(), i&, j&, s$, t, ind&
aRef = Array(Sheets(1).[a3], Sheets(1).[d3], Sheets(1).[g3])
With CreateObject("Scripting.Dictionary")
        .CompareMode = 1
        For Each a In aRef
            x = a.CurrentRegion.Value
            ind = ind + 1
            For i = 1 To UBound(x)
                s = x(i, 1) & "|" & x(i, 2)
                If .Exists(s) Then
                st = .Item(s)
                Mid(st, ind) = --Mid(st, ind, 1) + 1
                .Item(s) = st
                Else
                st = String(UBound(aRef) + 1, "0")
                Mid(st, ind) = 1
                .Item(s) = st
                End If
            Next i
        Next a
        ReDim y(1 To .Count, 1 To 3)
        For Each a In .Keys
           t = Split(a, "|"): j = j + 1: y(j, 1) = t(0): y(j, 2) = t(1): y(j, 3) = .Item(a)
        Next a
End With
With Sheets(1).[j3:l3].Resize(j)
.NumberFormat = "@"
.Value = y
End With
End Sub
[/vba]

Автор - Hugo
Дата добавления - 06.09.2011 в 13:02
Ukh Дата: Среда, 30.07.2014, 11:58 | Сообщение № 16
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Hugo, если не сложно, как будет выглядить макрос для сравнения двух таблиц на разных листах в сравнении по указаным столбцам?
[moder]Читаем Правила форума, создаём свою тему, прикладываем файл с примером.
Эта тема закрыта[/moder]
 
Ответить
СообщениеHugo, если не сложно, как будет выглядить макрос для сравнения двух таблиц на разных листах в сравнении по указаным столбцам?
[moder]Читаем Правила форума, создаём свою тему, прикладываем файл с примером.
Эта тема закрыта[/moder]

Автор - Ukh
Дата добавления - 30.07.2014 в 11:58
Мир MS Excel » Вопросы и решения » Вопросы по Excel » сравнение таблиц
  • Страница 1 из 1
  • 1
Поиск:

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