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

Автор caracas, 30.03.2011, 19:23

« назад - далее »

caracas

Здравствуйте!

Строки и столбцы состоят из групп двузначных цифр, в строках шесть пар цифр а в столбцах -
пять.
Задача: обозначить каким либо цветом ячейки на пересечении одинаковых групп цифр т.е. если
в какой либо строке имеется пять пар цифр соответствующих какому ни будь столбцу - ячейка на
пересечении обозначается цветом.
Вообще словами описать задачу довольно трудно, поэтому прикрепляю файл с примером. Аналогично
задачу надо решить для несколько тысяч групп цифр.
Пожалуйста помогите осилить эту задачу.
Очень надеюсь на Вашу помощь.

kimtan

Можно решить с помощью условного форматирования. Приложено в примере.
Но для больших диапазонов в несколько тысяч строк лучше не использовать.
Webmoney: E350157549801 Z116603216205 R268084006579

nilem

Жми щит с красным крестом (просто первая картинка, которая попалась).

caracas

Цитата: kimtan от 30.03.2011, 21:26
Можно решить с помощью условного форматирования. Приложено в примере.
Но для больших диапазонов в несколько тысяч строк лучше не использовать.
Да, задачу надо решить для несколько тысяч групп цифр, это указано.
Спасибо за ответ, хотя я не совсем понял что предлагается.

Цитата: nilem от 30.03.2011, 21:40
Жми щит с красным крестом (просто первая картинка, которая попалась).
Спасибо за ответ, но после получения такого предупреждения охота нажимать сразу пропадает...
Вы уверены что все нормально?
Если Вам не трудно приложите пожалуйста файл, который не будет тревожить систему безопасности.
Без обид!!!


Цитата: _Boroda_ от 30.03.2011, 22:03
А нужно ли было бы выделять такую пару:
21 22 23 24 25 26    и    22 21 23 24 25?
Если по значениям они совпадают, а по расположению нет.
Спасибо за ответ.
Судя по Вашему вопросу это имеет значение, поэтому уточняю.
Каждая строка состоит из шести пар цифр и в каждой из шести пар последующая по значению больше предыдущей т.е. AB<CD<EF<GH<IK<LM, то же самое и в столбцах (только там пять пар) и  такой последовательности как в Вашем вопросе (22 21 23 24 25) просто не будет.
Но естественно совпадающими будут считаться группы в которых пропущенна одна из пар (напр: строке со следующей группой цифр - 91 92 93 94 95 96 будут соответствовать следующие пятипарные группы:
91 92 93 94 95; 91 92 93 94 96; 91 92 93 95 96; 91 92 94 95 96 и 92 93 94 95 96.

К сожалению в приложении (Example001.xlsx) примеры состоят из случайных групп цифр (что не совсем корректно), поэтому прилагаю уточненный пример.

MCH

Цитата: caracas от 31.03.2011, 01:01
совпадающими будут считаться группы в которых пропущенна одна из пар (напр: строке со следующей группой цифр - 91 92 93 94 95 96 будут соответствовать следующие пятипарные группы:
91 92 93 94 95; 91 92 93 94 96; 91 92 93 95 96; 91 92 94 95 96 и 92 93 94 95 96.
К сожалению в приложении (Example001.xlsx) примеры состоят из случайных групп цифр (что не совсем корректно), поэтому прилагаю уточненный пример.
Тоже через условное_форматирование

nilem

Уточненный вариант (вернее, два). Синий и зеленый треугольники запускаю 2 разных макроса. Чтобы они работали, нужно поставить галочку Включить это содержимое.
Интересно было бы проверить на большом объеме данных.
Макросов бояться не нужно  :) На всякий случай вот код:
Sub caracas() 'синий треугольник
'Dim tm!: tm = Timer
Dim x, i&, j&, s, t$
Application.ScreenUpdating = False
ActiveSheet.UsedRange.Interior.Color = xlNone
x = Range("A1").CurrentRegion.Value
With CreateObject("VBScript.RegExp")
    For j = 2 To UBound(x, 2)
        s = Split(x(1, j)): t = "([0-9 ]{3})? ?"
        .Pattern = t & s(0) & t & s(1) & t & s(2) & t & s(3) & t & s(4)
        For i = 2 To UBound(x, 1)
            If .test(CStr(x(i, 1))) Then Cells(i, j).Interior.ColorIndex = 40: Exit For
        Next i
    Next j
End With: Application.ScreenUpdating = True
'MsgBox Timer - tm
End Sub

Sub caracas2() 'зеленый треугольник
'Dim tm!: tm = Timer
Dim x, i&, j&, k&, sX, sY, cx, cy
Application.ScreenUpdating = False
ActiveSheet.UsedRange.Interior.Color = xlNone
x = Range("A1").CurrentRegion.Value
For j = 2 To UBound(x, 2)
    sX = Split(x(1, j))
    For i = 2 To UBound(x, 1)
        sY = Split(x(i, 1)): k = 0
        For Each cy In sY
            For Each cx In sX
                If cy = cx Then k = k + 1: Exit For
            Next
        Next
        If k = UBound(sX) + 1 Then Cells(i, j).Interior.ColorIndex = 40: Exit For
    Next i
Next j: Application.ScreenUpdating = True
'MsgBox Timer - tm
End Sub

caracas

Цитата: MCH от 31.03.2011, 10:45
Тоже через условное_форматирование
Спасибо за ответ.
Ранее kimtan предлагал аналогично, но советовал:"... для больших диапазонов в несколько тысяч строк лучше не использовать".
А так как диапазон именно большой, как Вы считаете стоит ли думать в этом направлении?
Если да то подскажите пожалуйста более конкретно (что и как).

Цитата: nilem от 31.03.2011, 11:51
Уточненный вариант (вернее, два). Синий и зеленый треугольники запускаю 2 разных макроса. Чтобы они работали, нужно поставить галочку Включить это содержимое.
Большое спасибо за помощь и макросы.
Макросы работают, но часть ячеек пропускают. Более детапьно в приложении.
Буду очень благодарен за помощь.

nilem

ЦитироватьМакросы работают, но часть ячеек пропускают.
Тогда так (убрал Exit For).

Переложил файл: оставил один вариант и немного поправил, стало чуть быстрее.

caracas

nilem
Честь и хвала Вам. Макрос действует безукоризненно.
Желаю дальнейших успехов.

Еще раз спасибо!

caracas

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

Опять очень надеюсь на Вашу помощь!

nilem

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

caracas

nilem
Снимаю шляпу перед Вами!
Очень интересно придумано и сделано.

Еще раз желаю дальнейших успехов и еще раз огромное спасибо!!!

caracas

Форум мне очень помог.
Еще раз спасибо всем кто отозвался.
Надеюсь не откажете в помощи и напоследок.
Последняя просьба:
Помогите решить вопрос автоматизации процесса выбора и заполнения (допустим зеленым цветом) того минимального количества шестипарных ячеек, которые покроют все пятипарные ячейки.
Часть пятипарных ячеек будет перекрыта несколько раз, но этого не избежать.

MCH

Задачу можно попробовать решить перебором всех возможных вариантов и нахождения оптимального, хотя вряд ли получится т.к. количество различных вариантов 2^91=2,479E+27
Нужен другой алгоритм

nilem

Вроде чего-то накропал  :)
После синего треугольника, когда единицы уже заполнены, нажимаем красный тр-к.
Алгоритм построен на случайных числах, кол-во итераций ограничено 1000, поэтому результат не всегда одинаковый (выводится сообщение).
Чтобы получить самый-самый минимум, нужно увеличивать кол-во итераций, но происходить все будет долго (и без того не слишком быстро).

Кол-во переборов увеличил до 2000 и немного ускорил. Файлик переложил.