For Each x In ActiveSheet.AutoFilter.Range.Offset(1, 0).Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1, ActiveSheet.AutoFilter.Range.Columns.Count).Columns(10).SpecialCells(xlCellTypeVisible) If pos = x And Count = 0 Then Cells(x, 10).Interior.ColorIndex = 6 Count = 1 Else If pos = x And Count <> 0 Then Cells(x, 10).Interior.ColorIndex = 3
End If Next
[/vba]
Суть задачи для которой этот код написан. Есть отфильтрованный список, в нём есть столбец со значениями, например 2,2,3,4,2,1,5,6,4,4. Задача в том чтобы оставить только одну уникальную запись по данному опираясь на данный столбец, то есть чтобы получилось 2,3,4,1,5,6. По моему придуманному алгоритму, все уникальные ячейки с уникальным значением пометить жёлтым, а остальные красным цветом, вот собственно разъяснение кода и суть проблемы"
В первом цикле, идёт перебор значений по одному столбцу в отфильтрованом списке, не считая первой строки, шапки. Дальше условия на совпадение тоесть если первый элеменn в этом столбце равен самому себе, то эта ячейка закрашивается жёлтым и счётчик увеличивается на 1. Если оно выполняется то то ячейка должна закраситься жёлтым цветом - вот именно в этом месте, в этой строчке [vba]
Код
Cells(x, 10).Interior.ColorIndex = 6
[/vba] у меня проблема((( Как правильно записать в данном случае, а то у меня получается либо он первый элемент который вообще во всём списке вначале идёт, либо вообще всю страницу окрашивает(( [moder]Файл нужен. И Правила форума почитайте
Добрый форумчанины, помогите пожалуйста. Вопрос жизни и смерти , практически в буквальном смысле..... Есть вот такой код [vba]
For Each x In ActiveSheet.AutoFilter.Range.Offset(1, 0).Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1, ActiveSheet.AutoFilter.Range.Columns.Count).Columns(10).SpecialCells(xlCellTypeVisible) If pos = x And Count = 0 Then Cells(x, 10).Interior.ColorIndex = 6 Count = 1 Else If pos = x And Count <> 0 Then Cells(x, 10).Interior.ColorIndex = 3
End If Next
[/vba]
Суть задачи для которой этот код написан. Есть отфильтрованный список, в нём есть столбец со значениями, например 2,2,3,4,2,1,5,6,4,4. Задача в том чтобы оставить только одну уникальную запись по данному опираясь на данный столбец, то есть чтобы получилось 2,3,4,1,5,6. По моему придуманному алгоритму, все уникальные ячейки с уникальным значением пометить жёлтым, а остальные красным цветом, вот собственно разъяснение кода и суть проблемы"
В первом цикле, идёт перебор значений по одному столбцу в отфильтрованом списке, не считая первой строки, шапки. Дальше условия на совпадение тоесть если первый элеменn в этом столбце равен самому себе, то эта ячейка закрашивается жёлтым и счётчик увеличивается на 1. Если оно выполняется то то ячейка должна закраситься жёлтым цветом - вот именно в этом месте, в этой строчке [vba]
Код
Cells(x, 10).Interior.ColorIndex = 6
[/vba] у меня проблема((( Как правильно записать в данном случае, а то у меня получается либо он первый элемент который вообще во всём списке вначале идёт, либо вообще всю страницу окрашивает(( [moder]Файл нужен. И Правила форума почитайтеAlisa
оставить только одну уникальную запись по данному опираясь на данный столбец
Где оставить? визуально отобразить а другие строки скрыть, или удалить, или вообще вывести в отдельное место список? Без файла с примером согласно правил форума - не разобраться
оставить только одну уникальную запись по данному опираясь на данный столбец
Где оставить? визуально отобразить а другие строки скрыть, или удалить, или вообще вывести в отдельное место список? Без файла с примером согласно правил форума - не разобраться SLAVICK
Sub test() pos = ActiveSheet.AutoFilter.Range.Offset(1, 0).Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1, ActiveSheet.AutoFilter.Range.Columns.Count).Columns(10).SpecialCells(xlCellTypeVisible).Cells(1) Set dic = CreateObject("Scripting.Dictionary") For Each X In ActiveSheet.AutoFilter.Range.Offset(1, 0).Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1, ActiveSheet.AutoFilter.Range.Columns.Count).Columns(10).SpecialCells(xlCellTypeVisible) If dic.exists(X.Value) Then X.Interior.ColorIndex = 3 Else X.Interior.ColorIndex = 6 dic.Item(X.Value) = 0& End If Next End Sub
[/vba] Может я не так поняла ваше задание, но не поняла почему вы X ставите в Cells(x, 10)
Я бы на словарях такое делала [vba]
Код
Sub test() pos = ActiveSheet.AutoFilter.Range.Offset(1, 0).Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1, ActiveSheet.AutoFilter.Range.Columns.Count).Columns(10).SpecialCells(xlCellTypeVisible).Cells(1) Set dic = CreateObject("Scripting.Dictionary") For Each X In ActiveSheet.AutoFilter.Range.Offset(1, 0).Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1, ActiveSheet.AutoFilter.Range.Columns.Count).Columns(10).SpecialCells(xlCellTypeVisible) If dic.exists(X.Value) Then X.Interior.ColorIndex = 3 Else X.Interior.ColorIndex = 6 dic.Item(X.Value) = 0& End If Next End Sub
[/vba] Может я не так поняла ваше задание, но не поняла почему вы X ставите в Cells(x, 10)Leanna
Огромное спасибо) это то что надо, эх научиться бы понимать что тут так же как вы уметее( Может сможете вкратце объяснить по строчкам, что как и почему происходит? И если знаете, то какую нито ссылку или учебник, где это подробно и удобно описано, как делать. А то я вот полторы книжки прочитала, и ничего подобного не нашла(
И ещё один не большой вопрос, вот в вашем коде красным окрашивает только одну ячейку, а как сделать чтобы окрашивался диапазон на строке?
Огромное спасибо) это то что надо, эх научиться бы понимать что тут так же как вы уметее( Может сможете вкратце объяснить по строчкам, что как и почему происходит? И если знаете, то какую нито ссылку или учебник, где это подробно и удобно описано, как делать. А то я вот полторы книжки прочитала, и ничего подобного не нашла(
И ещё один не большой вопрос, вот в вашем коде красным окрашивает только одну ячейку, а как сделать чтобы окрашивался диапазон на строке?Alisa
Сообщение отредактировал Serge_007 - Суббота, 14.02.2015, 13:58
По словарям есть в этой шпаргалке (лучше не придумаешь) Комментарии по коду: [vba]
Код
Sub test() 'здесь объявление словаря Set dic = CreateObject("Scripting.Dictionary") 'здесь выбирается область автофильтра текущего листа ActiveSheet.AutoFilter.Range 'Offset(1, 0) - исключаем заголовок из этой области 'Resize задаем высоту и ширину области, высота "Rows.Count - 1" потому что исключили заголовок, ширина такая же сколько колонок Columns.Count '.Columns(10) - в этой области выбираем только 10 колонку '.SpecialCells(xlCellTypeVisible) - только видимые ячейки, то что скрыто автофильтром не берем. Set rng1 = ActiveSheet.AutoFilter.Range.Offset(1, 0).Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1, ActiveSheet.AutoFilter.Range.Columns.Count).Columns(10).SpecialCells(xlCellTypeVisible) 'перебор ячеек из области (10 колонка автофильтра, только видимые) For Each X In rng1 'rr строка в которой находится перебираемая ячейка, понадобится для того что бы определить, какую строку окрашивать rr = X.Row 'если значение уже было записано в словарь то If dic.exists(X.Value) Then 'эта ветка условия - если было записано - красим в красный ActiveSheet.AutoFilter.Range.Rows(rr).Interior.ColorIndex = 3 Else ' эта ветка если не было ещё записано в словарь - красим в желтый ActiveSheet.AutoFilter.Range.Rows(rr).Interior.ColorIndex = 6 ' и записываем в словарь значение ячейки, что бы когда в следующей ячейке встретится это значение ' оно прошло по ветке условий что значение существует=>окраска в красный цвет dic.Item(X.Value) = 0& End If Next End Sub
[/vba] Насчет книжки не знаю, я осваивала азы по "Харрис Мэтью Освой самостоятельно программирование для Microsoft Excel 2000 за 21 день" По ссылкам здесь обширный FAQ http://msoffice.nm.ru/faq/macros.htm А так, форум лучшее средство познания)
По словарям есть в этой шпаргалке (лучше не придумаешь) Комментарии по коду: [vba]
Код
Sub test() 'здесь объявление словаря Set dic = CreateObject("Scripting.Dictionary") 'здесь выбирается область автофильтра текущего листа ActiveSheet.AutoFilter.Range 'Offset(1, 0) - исключаем заголовок из этой области 'Resize задаем высоту и ширину области, высота "Rows.Count - 1" потому что исключили заголовок, ширина такая же сколько колонок Columns.Count '.Columns(10) - в этой области выбираем только 10 колонку '.SpecialCells(xlCellTypeVisible) - только видимые ячейки, то что скрыто автофильтром не берем. Set rng1 = ActiveSheet.AutoFilter.Range.Offset(1, 0).Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1, ActiveSheet.AutoFilter.Range.Columns.Count).Columns(10).SpecialCells(xlCellTypeVisible) 'перебор ячеек из области (10 колонка автофильтра, только видимые) For Each X In rng1 'rr строка в которой находится перебираемая ячейка, понадобится для того что бы определить, какую строку окрашивать rr = X.Row 'если значение уже было записано в словарь то If dic.exists(X.Value) Then 'эта ветка условия - если было записано - красим в красный ActiveSheet.AutoFilter.Range.Rows(rr).Interior.ColorIndex = 3 Else ' эта ветка если не было ещё записано в словарь - красим в желтый ActiveSheet.AutoFilter.Range.Rows(rr).Interior.ColorIndex = 6 ' и записываем в словарь значение ячейки, что бы когда в следующей ячейке встретится это значение ' оно прошло по ветке условий что значение существует=>окраска в красный цвет dic.Item(X.Value) = 0& End If Next End Sub
[/vba] Насчет книжки не знаю, я осваивала азы по "Харрис Мэтью Освой самостоятельно программирование для Microsoft Excel 2000 за 21 день" По ссылкам здесь обширный FAQ http://msoffice.nm.ru/faq/macros.htm А так, форум лучшее средство познания)Leanna
Насчет книжки не знаю, я осваивала азы по "Харрис Мэтью Освой самостоятельно программирование для Microsoft Excel 2000 за 21 день" По ссылкам здесь обширный FAQ http://msoffice.nm.ru/faq/macros.htm А так, форум лучшее средство познания)
Огромное спасибо за ответ, и за название книжки, сейчас скачаю и будет читать) Можно только один последний вопрос. Вот в этой строке [vba]
Насчет книжки не знаю, я осваивала азы по "Харрис Мэтью Освой самостоятельно программирование для Microsoft Excel 2000 за 21 день" По ссылкам здесь обширный FAQ http://msoffice.nm.ru/faq/macros.htm А так, форум лучшее средство познания)
Огромное спасибо за ответ, и за название книжки, сейчас скачаю и будет читать) Можно только один последний вопрос. Вот в этой строке [vba]
Замените ту строку на ту что ниже. Так даже правильнее, тот пример не будет работать если автофильтр не в первой строке, т.к. строка Range.Rows(rr) указывается относительно области автофильтра, а rr = X.Row указывается строка относительно листа. (Поздно обнаружила я ошибку) [vba]
Замените ту строку на ту что ниже. Так даже правильнее, тот пример не будет работать если автофильтр не в первой строке, т.к. строка Range.Rows(rr) указывается относительно области автофильтра, а rr = X.Row указывается строка относительно листа. (Поздно обнаружила я ошибку) [vba]
Замените ту строку на ту что ниже. Так даже правильнее, тот пример не будет работать если автофильтр не в первой строке, т.к. строка Range.Rows(rr) указывается относительно области автофильтра, а rr = X.Row указывается строка относительно листа. (Поздно обнаружила я ошибку)
Большое спасибо всё работает как надо)
Вот только не подскажите почему, если макрос просто выполнить то всё хорошо, а если через отладчик проверять его выполнение пошагово, то он работает не правильно*( [moder]Не надо цитировать всё сообщение целиком. Вы уже получили за это замечание и опять нарушаете Правила форума[/moder]
Замените ту строку на ту что ниже. Так даже правильнее, тот пример не будет работать если автофильтр не в первой строке, т.к. строка Range.Rows(rr) указывается относительно области автофильтра, а rr = X.Row указывается строка относительно листа. (Поздно обнаружила я ошибку)
Большое спасибо всё работает как надо)
Вот только не подскажите почему, если макрос просто выполнить то всё хорошо, а если через отладчик проверять его выполнение пошагово, то он работает не правильно*( [moder]Не надо цитировать всё сообщение целиком. Вы уже получили за это замечание и опять нарушаете Правила форума[/moder]Alisa
Вы правы, проблема не в коде, а из-за отладчика, но я всё равно как то не понимаю) Там снизу у меня есть окно Wathes, насколько я понимаю оно показывает значение переменных. Вот если туда сделать add watch и добавить dic.Item(X.Value), то при пошаговом выполнение, макрос будет работать не правильно... Странно, я думала, что просматриваемые значения, которые добавляешь в Watches никак не могут повлиять на код.
Кстати а вот в этой строчке [vba]
Код
dic.Item(X.Value) = 0&
[/vba] амперсент это какой то ключевой символ или опечатка?) И ещё по поводу этой строчки, можно по русски объяснить, как это работает? а то вот читаю теорию, а как в действительности работает, что то не соображу, почему присваиваем ноль, и что это за ноль, и куда он записывается(*
Вы правы, проблема не в коде, а из-за отладчика, но я всё равно как то не понимаю) Там снизу у меня есть окно Wathes, насколько я понимаю оно показывает значение переменных. Вот если туда сделать add watch и добавить dic.Item(X.Value), то при пошаговом выполнение, макрос будет работать не правильно... Странно, я думала, что просматриваемые значения, которые добавляешь в Watches никак не могут повлиять на код.
Кстати а вот в этой строчке [vba]
Код
dic.Item(X.Value) = 0&
[/vba] амперсент это какой то ключевой символ или опечатка?) И ещё по поводу этой строчки, можно по русски объяснить, как это работает? а то вот читаю теорию, а как в действительности работает, что то не соображу, почему присваиваем ноль, и что это за ноль, и куда он записывается(*Alisa
Сообщение отредактировал Alisa - Воскресенье, 15.02.2015, 18:56