Страницы: 1 2 След.
RSS
Цветовая заливка дублей в разных столбцах
 
Прошу помощи-подсказки.
Пример очень упрощенный, но неприятность сохранена.
Несколько столбцов с заполненными ячейками. Неинформативные строки для удобства скрыты.
Задача: найти дубли значений в других столбцах и закрасить эти пары.
Берем ячейку, сравниваем со всеми значениями по очереди. При совпадении красим.

Проблемные ячейки (C37 и D4) выделены красным шрифтом: значение одинаковое - 3838682. Закрашиваются только после повторного запуска макроса.
Если комментировать строку, срабатывает нормально:
If .Cells(ii + 1, jj).Interior.Color <> 15773696 Then ArrCount(1, jj) = ArrCount(1, jj) - 1
Даже не вся строка виновата, только изменение значения ArrCount(1, jj).
Заменил в цикле (For ii = 2 To lRws) на переменную lRws - не помогло.

Что я упустил из виду?
 
vikttur, попробуйте так
Скрытый текст
Изменено: Scripter - 17.06.2014 16:11:44
 
За вариант спасибо, но меня больше интересует не обход, а сама проблема - почему?

В рабочем файле происходит обработка  5-10 тыс. строк, извлечение уникальных, формирование доп. таблицы повторов. Заливка - только часть работы, поэтому без массивов никак.
 
Цитата
vikttur пишет:
If .Cells(ii + 1, jj).Interior.Color <> 15773696 Then ArrCount(1, jj) = ArrCount(1, jj) - 1
Виктор, я вообще не понял - для чего эта строка?

конкретно по данным - нашли дубль для пары C22-D3 (значение 3836026)
после этого значение в ArrCount(1, 4) будет равно 1
соответственно, внутренний цикл по ii даже не будет пытаться дойти до элемента массива, соответствующего ячейке D4
никакого дубля не найдет и ничего красить не будет.
Изменено: ктулху - 17.06.2014 18:08:25
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
vikttur пишет: Закрашиваются только после повторного запуска макроса.
нет.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Зачем строка? Определение количества уникальных записей. Если дубль нашли, отнимаем единичку в первой строке этого столбца.
Код
                For jj = j + 1 To 6
                    lRws = ArrCount(1, jj) + 1
                    For ii = 2 To lRws
                        If ArrCount(i, j) = ArrCount(ii, jj) Then
                            If .Cells(ii + 1, jj).Interior.Color <> 15773696 Then _
                                                ArrCount(1, jj) = ArrCount(1, jj) - 1
                            .Cells(i + 1, j).Interior.Color = 5296274
                            .Cells(ii + 1, jj).Interior.Color = 15773696
                        End If
                    Next ii
                Next jj
lRws равно количеству значений в столбце jj: lRws = ArrCount(1, jj) + 1. Все, дальше ArrCount(1, jj) служит только для определения количества и до следующего витка в цикле не задействовано. А в следующем витке это уже ячейка другого столбца.

Саня, что нет? Вообще не закрашивается или красится сразу?
Кстати, у меня 2010, у тебя 2003. По разному отрабатывает? Надо проверить.
 
реально получается так:
Цитата
ктулху пишет: конкретно по данным - нашли дубль для пары C22-D3 (значение 3836026)
после этого значение в ArrCount(1, 4) будет равно 1
Цитата
vikttur пишет: Если дубль нашли, отнимаем единичку в первой строке этого столбца.
зачем отнимаем-то? как дальше собираемся использовать?
сейчас это значение у тебя используется вообще для другого - для определения кол-ва строк в данном столбце, которые надо проверять на дубли.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
vikttur пишет: Саня, что нет?
одинаково срабатывает. при любом кол-ве запусков.
в общем-то, в соответствии с кодом.

при закомментированной
Код
If .Cells(ii + 1, jj).Interior.Color <> 15773696 Then ArrCount(1, jj) = ArrCount(1, jj) - 1
срабатывает с первого раза. опять же - в соответствии с кодом.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Данные первой строки вычисляются ранее - количество значений в конкретном столбце.
Для того, чтобы не гонять циклом по пустым значениям, определяю верх цикла не по  UBound массива, а по этим числам из первой строки.
Сравниваем  столбцы 3 и 4
Rws = ArrCount(1, 4) + 1=2+1=3
For ii = 2 To lRws '
уже не  до ArrCount(1, 4), а до  lRws
Нашли дубль,  уменьшили ArrCount(1, 4) на единицу (потом-дальше - сумма по первой строке и видим количество уникальных значений, исключив количество дублей).
Заходим на следующий виток цикла... Нашли дубль - опять -1. Прогнали по столбцу 4, далее сравниваем столбцы 3 и 5:
Rws = ArrCount(1, 5) + 1 - видно?  ArrCount(1, 4) больше в цикле не используется.

Но как-то же влияет?
Тему у Сергея недавно мельком видел. О том, что в памяти хранится не значение, а место... или что-то в этом духе... Что-то о циклах обсуждалось... Похоже, здесь та же проблема и ArrCount(1, 4) нужно выводить вообще за пределы циклов.

Проверил на 2003. Проблемная парочка вообще не красится.
В 2010, повторю: при первом красятся все, кроме C37 и D4. Эти красятся при вторичном прогоне макроса.
Если строку закомментировать, отрабатывает нормально и в 2003, и в 2010.
 
нет.
пошли пошагово.

дошли до j=3, цикл по i пошел от 2 до 46+1

дошли до i=21
пошел цикл по jj - от 4 до 6
запомнили lRws = ArrCount(1, 4) + 1 = 3
в четвертом столбце нашли дубль при ii=2
обрадовались и испортили  ArrCount(1, 4), уменьшив на 1
положим, дублей для j=3 и i=21 больше не нашли.

пошли дальше по i
дошли до i=36
пошел цикл по jj - от 4 до 6
запомнили lRws = ArrCount(1, 4) + 1 = 2

собственно, вот.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
vikttur пишет: В 2010, повторю: при первом красятся все, кроме C37 и D4 . Эти красятся при вторичном прогоне макроса.
не верю  :(
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Заходи в Скайп, покажу
 
нет у мну скайпа. и тимвьюера тоже.
если код точно такой же и значения на листе точно такие же - не должно работать.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Точно этот же пример. Клянусь хвостом котяры, который подглядывает!
 
2003 - проблемные ячейки не красятся ни после второго, ни после третьего нажатия. После пятого тоже))
2007 - только после второго.
 
Цитата
ктулху пишет: цикл по i пошел
Спасибочки. Теперь понял, где ляп. jj ведь для всех i одинаков, и со следующим заходом...

Остался вопрос: почему у разных версий разночтение?
 
Цитата
ктулху пишет:
нет у мну скайпа. и тимвьюера тоже
Саш, и как ты с этим (без этого) живёшь? ))
 
Цитата
Юрий М пишет: Саш, и как ты с этим (без этого) живёшь? ))
щастливо
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
vikttur пишет: В 2010... красятся при вторичном прогоне макроса.
Цитата
Юрий М пишет: 2007 - только после второго.
понял.
значения цветов для 2003-го некорректные.

в 2003-м аналогичное поведение при таком кусочке:
Код
If ArrCount(i, j) = ArrCount(ii, jj) Then
  If .Cells(ii + 1, jj).Interior.ColorIndex <> 28 Then ArrCount(1, jj) = ArrCount(1, jj) - 1
  .Cells(i + 1, j).Interior.ColorIndex = 40
  .Cells(ii + 1, jj).Interior.ColorIndex = 28
End If
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Изменил строку:
Код
If .Cells(ii + 1, jj).Interior.ColorIndex <> xlNone Then
 
Сработало в 2003 и 2007 с первого раза.
 
Вить, не напрягайся: вот здесь готовенькое ))
 
есть и посвежее  :)
http://www.planetaexcel.ru/blog/346/
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Я оттуда и брал: в блоге ссылка чуть глубжее ))
 
По ссылкам не ходил. Как это "не напрягайся"? Надо. Позже гляну.
О некорректности цветов не думал. Теперь все понятно.
Interior.ColorIndex <> xlNone - не прокатит. В реальности могут быть 2, 3 повторения. Заливка в задаче тоже нужна, поэтому вылавливал таким-вот способом - используя определение цвета. Заметили, что у первого значения и у второго разная заливка?
Цвета - они такие вредные... Наверное, переделать нужно. Например, 7 столбец в массиве, вспомогательный... Но это уже другая история.

Отлично.  Спасибо за обсуждения и за вытаскивание из непонимания (сам виноват).
 
Я уже сталкивался с разным определением цветов. Теперь всегда использую Interior.ColorIndex - 56 значений и во всех версиях одинаково )
 
в 2003-м при установке Color выбирается ближайший цвет из палитры
для стандартной палитры в окне immediate:
Код
[a1].interior.color=15773696
? [a1].interior.color
 16763904 
понятно, что для непресказуемой палитры пользоваться этим нельзя.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Ну да, понятно.
 
interior.color использовать тоже можно, только сравнивать не с конкретным числом, как у Вити, а именно с interior.color нужной ячейки.
 
Цитата
vikttur пишет: Клянусь хвостом котяры, который подглядывает!
Я хотел написать, что тоже не верю, но не случилось.
 
Так именно про твой хвост разговор и шёл)
Страницы: 1 2 След.
Наверх