Добрый вечер.Есть три массива с числами.Необходимо сравнить данные в них и при совпадении выделить в список.Если по отдельности перебором каждый,это понятно,а вот в массиве пока понимаю не до конца.
Добрый вечер.Есть три массива с числами.Необходимо сравнить данные в них и при совпадении выделить в список.Если по отдельности перебором каждый,это понятно,а вот в массиве пока понимаю не до конца.megavlom
Добрый вечер! Вы не первый день на форуме и должны прекрасно знать, что прикрепленный файл-пример значительно ускорит решение. Или Вам быстро не нужно? К тому же это является нарушением 3 пункта правил форума...
Добрый вечер! Вы не первый день на форуме и должны прекрасно знать, что прикрепленный файл-пример значительно ускорит решение. Или Вам быстро не нужно? К тому же это является нарушением 3 пункта правил форума...kim
Сцяна - гэта тая ж прыступка. Проста трэба дарасьці да яе.
Не совсем понял, как Вам нужен список, да и это вероятно не главное - поэтому пока вывожу в окно отладки (можно на лист/массив/строку выводить): [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]
Не совсем понял, как Вам нужен список, да и это вероятно не главное - поэтому пока вывожу в окно отладки (можно на лист/массив/строку выводить): [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
Не понятно, кто формирует эти комбинации. Если вручную, то я сгенерил список всех цифр с колонками - выбирайте. Удобнее вероятно так - эту строку в втором варианте напишите так: If Len(x.Value) Then oDict1.Item(x.Column & "|" & x.Value) = x.Value тогда список будет с колонкой впереди. Если выгрузить на лист и отсортировать, то получите
Не понятно, кто формирует эти комбинации. Если вручную, то я сгенерил список всех цифр с колонками - выбирайте. Удобнее вероятно так - эту строку в втором варианте напишите так: If Len(x.Value) Then oDict1.Item(x.Column & "|" & x.Value) = x.Value тогда список будет с колонкой впереди. Если выгрузить на лист и отсортировать, то получите
Хорошо. Первый вариант - как раз выводит список всех совпадающих. Второй вариант - список с признаком колонок. В разных колонках могут быть одинаковые числа.
Хорошо. Первый вариант - как раз выводит список всех совпадающих. Второй вариант - список с признаком колонок. В разных колонках могут быть одинаковые числа.Hugo
Вариант с УФ, доп. табличками, формулами и макросом (хотел еще сводную прикрутить - не придумалось ) Сортировка по 6-ти столбцам почему-то не идет, сделал по 3-м.
Вариант с УФ, доп. табличками, формулами и макросом (хотел еще сводную прикрутить - не придумалось ) Сортировка по 6-ти столбцам почему-то не идет, сделал по 3-м.nilem
Здравствуйте Уважаемые Форумчане.Спасибо за Ваш труд и помощь.Вам nilem особое спасибо.Вы догадались ,что мне надо.Сейчас постараюсь понять макрос.Возможно задам пару вопросов по нему(если что-то не пойму).
Здравствуйте Уважаемые Форумчане.Спасибо за Ваш труд и помощь.Вам nilem особое спасибо.Вы догадались ,что мне надо.Сейчас постараюсь понять макрос.Возможно задам пару вопросов по нему(если что-то не пойму).megavlom
Добрый вечер.У меня возник вопрос, адресованный больше наверное к nilem.Во втором массиве сочетания цифр 48-8(они стоят в одном столбце) не будет,а в первом и третьем есть,значит комбинаций с цифрами 48-8-х-х-х-х быть не должно.Можно ли в макросе сделать проверку таких условий или же лучше это делать с помощью функций листа.
Добрый вечер.У меня возник вопрос, адресованный больше наверное к nilem.Во втором массиве сочетания цифр 48-8(они стоят в одном столбце) не будет,а в первом и третьем есть,значит комбинаций с цифрами 48-8-х-х-х-х быть не должно.Можно ли в макросе сделать проверку таких условий или же лучше это делать с помощью функций листа.megavlom
Искал-искал 48 в результирующем массиве (кстати, не сразу сообразил, что можно воспользоваться "Найти и выделить" ) - не нашел. Надо бы еще повторы убрать. У Вас Ексель 2007/10?
Искал-искал 48 в результирующем массиве (кстати, не сразу сообразил, что можно воспользоваться "Найти и выделить" ) - не нашел. Надо бы еще повторы убрать. У Вас Ексель 2007/10?nilem
Яндекс.Деньги 4100159601573
Сообщение отредактировал Serge_007 - Среда, 03.08.2011, 11:11
Добрый день.Как бы четче обьяснить.Задумка была такая -сделать перебор чисел столбцов каждого массива получится набор комбинаций.после эти три набора сравнить между собой и совпадающие комбинации(по 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
Увжаемый nilem ,чтобы доступнее обьяснить - запустите макрос и скопируйте набор комбинаций,который он высветит,после поменяйте местами массивы1 и2 и опять запустите макрос.Сравните результаты первого и второго массивов ,они будут отличаться,а по идее должны быть идентичны.
Увжаемый nilem ,чтобы доступнее обьяснить - запустите макрос и скопируйте набор комбинаций,который он высветит,после поменяйте местами массивы1 и2 и опять запустите макрос.Сравните результаты первого и второго массивов ,они будут отличаться,а по идее должны быть идентичны.megavlom
По всякому менял - одно и то же. Только надо учесть, что если меняем местами верхние таблички, то и нижние нужно поменять соответственно. Визуально - картинки УФ должны совпадать в каждой паре верхних и нижних табличек. Теперь результат пишем в строку через символ "|" - так, вроде, проще. Проверьте.
По всякому менял - одно и то же. Только надо учесть, что если меняем местами верхние таблички, то и нижние нужно поменять соответственно. Визуально - картинки УФ должны совпадать в каждой паре верхних и нижних табличек. Теперь результат пишем в строку через символ "|" - так, вроде, проще. Проверьте.nilem
Здравствуйте.Уважаемый nilem первое решение более удачное..,при перемене местами массивов всё таки часть комбинаций меняется(так и должно быть). Фильтрацию этого я сделаю функциями листа.Ваше решение меня устраивает,поэтому наверное тему можно закрыть.Спасибо.
Здравствуйте.Уважаемый nilem первое решение более удачное..,при перемене местами массивов всё таки часть комбинаций меняется(так и должно быть). Фильтрацию этого я сделаю функциями листа.Ваше решение меня устраивает,поэтому наверное тему можно закрыть.Спасибо.megavlom