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

Вход

Регистрация

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

 

= Мир MS Excel/Сравнение массивов - Мир MS Excel

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

Добрый вечер.Есть три массива с числами.Необходимо сравнить данные в них и при совпадении выделить в список.Если по отдельности перебором каждый,это понятно,а вот в массиве пока понимаю не до конца.
 
Ответить
СообщениеДобрый вечер.Есть три массива с числами.Необходимо сравнить данные в них и при совпадении выделить в список.Если по отдельности перебором каждый,это понятно,а вот в массиве пока понимаю не до конца.

Автор - megavlom
Дата добавления - 31.07.2011 в 19:38
kim Дата: Воскресенье, 31.07.2011, 20:51 | Сообщение № 2
Группа: Друзья
Ранг: Обитатель
Сообщений: 371
Репутация: 160 ±
Замечаний: 0% ±

Excel 2010
Добрый вечер!
Вы не первый день на форуме и должны прекрасно знать, что прикрепленный файл-пример значительно ускорит решение. Или Вам быстро не нужно? К тому же это является нарушением 3 пункта правил форума...


Сцяна - гэта тая ж прыступка. Проста трэба дарасьці да яе.
 
Ответить
СообщениеДобрый вечер!
Вы не первый день на форуме и должны прекрасно знать, что прикрепленный файл-пример значительно ускорит решение. Или Вам быстро не нужно? К тому же это является нарушением 3 пункта правил форума...

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

Извините,что не доглядел отсутствие файла.Хотя с нашей связью...
К сообщению приложен файл: 2222.xls (28.0 Kb)
 
Ответить
СообщениеИзвините,что не доглядел отсутствие файла.Хотя с нашей связью...

Автор - megavlom
Дата добавления - 31.07.2011 в 22:01
Hugo Дата: Воскресенье, 31.07.2011, 22:29 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Не совсем понял, как Вам нужен список, да и это вероятно не главное - поэтому пока вывожу в окно отладки (можно на лист/массив/строку выводить):
[vba]
Код
Option Explicit

Sub tt()
       Dim a, b, c, oDict1 As Object, oDict2 As Object, oDict3 As Object
       Dim x

       a = [a3:f16]
       b = [a19:f32]
       c = [a35:f48]
       Set oDict1 = CreateObject("scripting.dictionary")
       Set oDict2 = CreateObject("scripting.dictionary")
       Set oDict3 = CreateObject("scripting.dictionary")

       For Each x In a
           If Len(x) Then oDict1.Item(x) = x
       Next

       For Each x In b
           If Len(x) Then oDict2.Item(x) = x
       Next

       For Each x In c
           If Len(x) Then oDict3.Item(x) = x
       Next

       For Each x In oDict1.Items
           If oDict2.exists(x) Then
               If oDict3.exists(x) Then
                   Debug.Print x
               End If
           End If
       Next

End Sub
[/vba]

Но в общем тот же перебор, но усовершенствованный - сперва загоняем данные в массивы, потом в словари, потом первый словарь сверяем с двумя другими.

Вариант с признаком столбца:
[vba]
Код
Option Explicit

Sub tt()
      Dim b, c, oDict1 As Object, oDict2 As Object, oDict3 As Object
      Dim x
      Dim kk, ii, y&

      b = [a19:f32]
      c = [a35:f48]
      Set oDict1 = CreateObject("scripting.dictionary")
      Set oDict2 = CreateObject("scripting.dictionary")
      Set oDict3 = CreateObject("scripting.dictionary")

      For Each x In [a3:f16]
          If Len(x.Value) Then oDict1.Item(x.Value & "|" & x.Column) = x.Value
      Next

      For Each x In b
          If Len(x) Then oDict2.Item(x) = x
      Next

      For Each x In c
          If Len(x) Then oDict3.Item(x) = x
      Next

      kk = oDict1.keys
      ii = oDict1.items
      y = -1
      For Each x In ii
          y = y + 1
          If oDict2.exists(x) Then
              If oDict3.exists(x) Then
                  Debug.Print kk(y)
              End If
          End If
      Next

End Sub
[/vba]


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеНе совсем понял, как Вам нужен список, да и это вероятно не главное - поэтому пока вывожу в окно отладки (можно на лист/массив/строку выводить):
[vba]
Код
Option Explicit

Sub tt()
       Dim a, b, c, oDict1 As Object, oDict2 As Object, oDict3 As Object
       Dim x

       a = [a3:f16]
       b = [a19:f32]
       c = [a35:f48]
       Set oDict1 = CreateObject("scripting.dictionary")
       Set oDict2 = CreateObject("scripting.dictionary")
       Set oDict3 = CreateObject("scripting.dictionary")

       For Each x In a
           If Len(x) Then oDict1.Item(x) = x
       Next

       For Each x In b
           If Len(x) Then oDict2.Item(x) = x
       Next

       For Each x In c
           If Len(x) Then oDict3.Item(x) = x
       Next

       For Each x In oDict1.Items
           If oDict2.exists(x) Then
               If oDict3.exists(x) Then
                   Debug.Print x
               End If
           End If
       Next

End Sub
[/vba]

Но в общем тот же перебор, но усовершенствованный - сперва загоняем данные в массивы, потом в словари, потом первый словарь сверяем с двумя другими.

Вариант с признаком столбца:
[vba]
Код
Option Explicit

Sub tt()
      Dim b, c, oDict1 As Object, oDict2 As Object, oDict3 As Object
      Dim x
      Dim kk, ii, y&

      b = [a19:f32]
      c = [a35:f48]
      Set oDict1 = CreateObject("scripting.dictionary")
      Set oDict2 = CreateObject("scripting.dictionary")
      Set oDict3 = CreateObject("scripting.dictionary")

      For Each x In [a3:f16]
          If Len(x.Value) Then oDict1.Item(x.Value & "|" & x.Column) = x.Value
      Next

      For Each x In b
          If Len(x) Then oDict2.Item(x) = x
      Next

      For Each x In c
          If Len(x) Then oDict3.Item(x) = x
      Next

      kk = oDict1.keys
      ii = oDict1.items
      y = -1
      For Each x In ii
          y = y + 1
          If oDict2.exists(x) Then
              If oDict3.exists(x) Then
                  Debug.Print kk(y)
              End If
          End If
      Next

End Sub
[/vba]

Автор - Hugo
Дата добавления - 31.07.2011 в 22:29
Serge_007 Дата: Воскресенье, 31.07.2011, 22:45 | Сообщение № 5
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Quote (megavlom)
Необходимо сравнить данные в них и при совпадении выделить в список

Объясните как у Вас получился такой список:
37 31 44 72 8 11 ?


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Quote (megavlom)
Необходимо сравнить данные в них и при совпадении выделить в список

Объясните как у Вас получился такой список:
37 31 44 72 8 11 ?

Автор - Serge_007
Дата добавления - 31.07.2011 в 22:45
megavlom Дата: Воскресенье, 31.07.2011, 23:25 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 105
Репутация: 1 ±
Замечаний: 0% ±

Это для примера-совпадение в трех массивах комбинации из 6 цифр
 
Ответить
СообщениеЭто для примера-совпадение в трех массивах комбинации из 6 цифр

Автор - megavlom
Дата добавления - 31.07.2011 в 23:25
Hugo Дата: Воскресенье, 31.07.2011, 23:33 | Сообщение № 7
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Не понятно, кто формирует эти комбинации.
Если вручную, то я сгенерил список всех цифр с колонками - выбирайте.
Удобнее вероятно так - эту строку в втором варианте напишите так:
If Len(x.Value) Then oDict1.Item(x.Column & "|" & x.Value) = x.Value
тогда список будет с колонкой впереди.
Если выгрузить на лист и отсортировать, то получите

1|0
1|27
1|37
1|46
1|5
2|0
2|31
2|8
3|0
3|1
3|15
3|17
3|5
3|72
3|8
3|9
4|0
4|1
4|11
4|15
4|46
5|0
5|12
5|37
5|44
5|7
5|74
6|0
6|31
6|7


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеНе понятно, кто формирует эти комбинации.
Если вручную, то я сгенерил список всех цифр с колонками - выбирайте.
Удобнее вероятно так - эту строку в втором варианте напишите так:
If Len(x.Value) Then oDict1.Item(x.Column & "|" & x.Value) = x.Value
тогда список будет с колонкой впереди.
Если выгрузить на лист и отсортировать, то получите

1|0
1|27
1|37
1|46
1|5
2|0
2|31
2|8
3|0
3|1
3|15
3|17
3|5
3|72
3|8
3|9
4|0
4|1
4|11
4|15
4|46
5|0
5|12
5|37
5|44
5|7
5|74
6|0
6|31
6|7

Автор - Hugo
Дата добавления - 31.07.2011 в 23:33
megavlom Дата: Воскресенье, 31.07.2011, 23:36 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 105
Репутация: 1 ±
Замечаний: 0% ±

Список -просто вывод всех совпадающих в 3 массивах комбинаций.К сожалению проверить макрос и отписаться смогу только второго числа.
 
Ответить
СообщениеСписок -просто вывод всех совпадающих в 3 массивах комбинаций.К сожалению проверить макрос и отписаться смогу только второго числа.

Автор - megavlom
Дата добавления - 31.07.2011 в 23:36
Hugo Дата: Воскресенье, 31.07.2011, 23:44 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Хорошо.
Первый вариант - как раз выводит список всех совпадающих.
Второй вариант - список с признаком колонок. В разных колонках могут быть одинаковые числа.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеХорошо.
Первый вариант - как раз выводит список всех совпадающих.
Второй вариант - список с признаком колонок. В разных колонках могут быть одинаковые числа.

Автор - Hugo
Дата добавления - 31.07.2011 в 23:44
nilem Дата: Понедельник, 01.08.2011, 17:52 | Сообщение № 10
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Вариант с УФ, доп. табличками, формулами и макросом (хотел еще сводную прикрутить - не придумалось smile )
Сортировка по 6-ти столбцам почему-то не идет, сделал по 3-м.
К сообщению приложен файл: _2222.zip (27.5 Kb)


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеВариант с УФ, доп. табличками, формулами и макросом (хотел еще сводную прикрутить - не придумалось smile )
Сортировка по 6-ти столбцам почему-то не идет, сделал по 3-м.

Автор - nilem
Дата добавления - 01.08.2011 в 17:52
MCH Дата: Понедельник, 01.08.2011, 18:41 | Сообщение № 11
Группа: Админы
Ранг: Старожил
Сообщений: 2004
Репутация: 752 ±
Замечаний: ±

Ну и мой вариант формулами (в желтых ячейках)
К сообщению приложен файл: 2222-1-.xls (33.5 Kb)
 
Ответить
СообщениеНу и мой вариант формулами (в желтых ячейках)

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

Здравствуйте Уважаемые Форумчане.Спасибо за Ваш труд и помощь.Вам nilem особое спасибо.Вы догадались ,что мне надо.Сейчас постараюсь понять макрос.Возможно задам пару вопросов по нему(если что-то не пойму).
 
Ответить
СообщениеЗдравствуйте Уважаемые Форумчане.Спасибо за Ваш труд и помощь.Вам nilem особое спасибо.Вы догадались ,что мне надо.Сейчас постараюсь понять макрос.Возможно задам пару вопросов по нему(если что-то не пойму).

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

Добрый вечер.У меня возник вопрос, адресованный больше наверное к nilem.Во втором массиве сочетания цифр 48-8(они стоят в одном столбце) не будет,а в первом и третьем есть,значит комбинаций с цифрами 48-8-х-х-х-х быть не должно.Можно ли в макросе сделать проверку таких условий или же лучше это делать с помощью функций листа.
 
Ответить
СообщениеДобрый вечер.У меня возник вопрос, адресованный больше наверное к nilem.Во втором массиве сочетания цифр 48-8(они стоят в одном столбце) не будет,а в первом и третьем есть,значит комбинаций с цифрами 48-8-х-х-х-х быть не должно.Можно ли в макросе сделать проверку таких условий или же лучше это делать с помощью функций листа.

Автор - megavlom
Дата добавления - 02.08.2011 в 18:04
nilem Дата: Среда, 03.08.2011, 08:33 | Сообщение № 14
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Искал-искал 48 в результирующем массиве (кстати, не сразу сообразил, что можно воспользоваться "Найти и выделить" smile ) - не нашел.
Надо бы еще повторы убрать. У Вас Ексель 2007/10?


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

Сообщение отредактировал Serge_007 - Среда, 03.08.2011, 11:11
 
Ответить
СообщениеИскал-искал 48 в результирующем массиве (кстати, не сразу сообразил, что можно воспользоваться "Найти и выделить" smile ) - не нашел.
Надо бы еще повторы убрать. У Вас Ексель 2007/10?

Автор - nilem
Дата добавления - 03.08.2011 в 08:33
MCH Дата: Среда, 03.08.2011, 11:00 | Сообщение № 15
Группа: Админы
Ранг: Старожил
Сообщений: 2004
Репутация: 752 ±
Замечаний: ±

megavlom, у Вас в качестве примера указаны числа 37, 31, 44, 72, 8, 11
При этом числа 72 и 44 встречаются в 3 массиве в одном столбце. это ошибка?

Интересно, какая конечная задача с этими числами, что в итоге хотите получить?
 
Ответить
Сообщениеmegavlom, у Вас в качестве примера указаны числа 37, 31, 44, 72, 8, 11
При этом числа 72 и 44 встречаются в 3 массиве в одном столбце. это ошибка?

Интересно, какая конечная задача с этими числами, что в итоге хотите получить?

Автор - MCH
Дата добавления - 03.08.2011 в 11:00
megavlom Дата: Среда, 03.08.2011, 12:09 | Сообщение № 16
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 105
Репутация: 1 ±
Замечаний: 0% ±

Добрый день.Как бы четче обьяснить.Задумка была такая -сделать перебор чисел столбцов каждого массива получится набор комбинаций.после эти три набора сравнить между собой и совпадающие комбинации(по 6 цифр)и есть искомый вариант.За счет разного расположения чисел в столбцах происходит разный набор вариантов.То что есть повторы чисел в разных столбцах массива -так должно быть.Excel 2003,но могу поставить 2007 не столь существенно.Числа,которых нет сразу в трех массивах будут отсеяны до вывода в массивы.Если в столбце стоят числа-например 48,8,3,1 ,а в других столбцах таких чисел нет,то и комбинаций 48-8,48-3,48-1,8-3,8-1,3-1 таких не будет.За счет этого происходит отсев.
 
Ответить
СообщениеДобрый день.Как бы четче обьяснить.Задумка была такая -сделать перебор чисел столбцов каждого массива получится набор комбинаций.после эти три набора сравнить между собой и совпадающие комбинации(по 6 цифр)и есть искомый вариант.За счет разного расположения чисел в столбцах происходит разный набор вариантов.То что есть повторы чисел в разных столбцах массива -так должно быть.Excel 2003,но могу поставить 2007 не столь существенно.Числа,которых нет сразу в трех массивах будут отсеяны до вывода в массивы.Если в столбце стоят числа-например 48,8,3,1 ,а в других столбцах таких чисел нет,то и комбинаций 48-8,48-3,48-1,8-3,8-1,3-1 таких не будет.За счет этого происходит отсев.

Автор - megavlom
Дата добавления - 03.08.2011 в 12:09
megavlom Дата: Среда, 03.08.2011, 12:41 | Сообщение № 17
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 105
Репутация: 1 ±
Замечаний: 0% ±

Увжаемый nilem ,чтобы доступнее обьяснить - запустите макрос и скопируйте набор комбинаций,который он высветит,после поменяйте местами массивы1 и2 и опять запустите макрос.Сравните результаты первого и второго массивов ,они будут отличаться,а по идее должны быть идентичны.
 
Ответить
СообщениеУвжаемый nilem ,чтобы доступнее обьяснить - запустите макрос и скопируйте набор комбинаций,который он высветит,после поменяйте местами массивы1 и2 и опять запустите макрос.Сравните результаты первого и второго массивов ,они будут отличаться,а по идее должны быть идентичны.

Автор - megavlom
Дата добавления - 03.08.2011 в 12:41
nilem Дата: Среда, 03.08.2011, 15:08 | Сообщение № 18
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
По всякому менял - одно и то же. Только надо учесть, что если меняем местами верхние таблички, то и нижние нужно поменять соответственно. Визуально - картинки УФ должны совпадать в каждой паре верхних и нижних табличек.
Теперь результат пишем в строку через символ "|" - так, вроде, проще.
Проверьте.
К сообщению приложен файл: 7581741.zip (69.1 Kb)


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеПо всякому менял - одно и то же. Только надо учесть, что если меняем местами верхние таблички, то и нижние нужно поменять соответственно. Визуально - картинки УФ должны совпадать в каждой паре верхних и нижних табличек.
Теперь результат пишем в строку через символ "|" - так, вроде, проще.
Проверьте.

Автор - nilem
Дата добавления - 03.08.2011 в 15:08
megavlom Дата: Среда, 03.08.2011, 17:27 | Сообщение № 19
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 105
Репутация: 1 ±
Замечаний: 0% ±

За внимание спасибо,проверить смогу только завтра.
 
Ответить
СообщениеЗа внимание спасибо,проверить смогу только завтра.

Автор - megavlom
Дата добавления - 03.08.2011 в 17:27
megavlom Дата: Четверг, 04.08.2011, 14:59 | Сообщение № 20
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 105
Репутация: 1 ±
Замечаний: 0% ±

Здравствуйте.Уважаемый nilem первое решение более удачное..,при перемене местами массивов всё таки часть комбинаций меняется(так и должно быть). Фильтрацию этого я сделаю функциями листа.Ваше решение меня устраивает,поэтому наверное тему можно закрыть.Спасибо.
 
Ответить
СообщениеЗдравствуйте.Уважаемый nilem первое решение более удачное..,при перемене местами массивов всё таки часть комбинаций меняется(так и должно быть). Фильтрацию этого я сделаю функциями листа.Ваше решение меня устраивает,поэтому наверное тему можно закрыть.Спасибо.

Автор - megavlom
Дата добавления - 04.08.2011 в 14:59
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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