макрос выдает ошибку при сбросе авто фильтра

Автор Anyuta, 14.02.2014, 18:54

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

Anyuta

Привет! помогите пожалуйста с проблемой, в приложенном файле есть макрос "Вид графика"
с помощью него я хочу сначала сбросить все фильтры на листе, а затем отфильтровать в столбце "график" нужные строки и сортировать их по возрастанию.
Проблема в том что участок кода на сброс авто фильтра у меня выдает ошибку.
если перед запуском макроса не выбран ни один фильтр на листе то он жалуется на строку
ActiveSheet.ShowAllData
если же хоть один фильтр уже отсортировал строки, то макрос все равно тормозит.
собирала я его с помощью макрорекордера, там много всяких действий, по отдельности все вроде работало, но в общей каше что то не то. помогите пожалуйста разобраться!

kuklp

Anyuta, объясните пожалуйста, зачем надо было выкладывать файл с 10(!) модулями полными всякого мусора, не относящегося к вопросу темы? Зачем 4 листа, если вопрос касается только автофильтра на одном?
По теме:
Чтоб не возникало ошибки, нужна проверка:
    If ActiveSheet.FilterMode Then _
    ActiveSheet.ShowAllData

Еще:
ActiveSheet.Range("График").AutoFilter Field:=34, ...
у Вас Range("График") состоит из одного столбца, а вы ему указываете Field:=34, т.е. 34 столбец, а откуда, столбец-то всего один? Дальше смотреть не стал, приводите в порядок пример, и выкладывайте его в формате xlsm,  предварительно упаковав его в рар, или зип. Потому как в 2003 не было возможности фильтровать по массиву значений. И такого метода не было:
ActiveWorkbook.Worksheets("ПЛАН ПРОИЗВОДСТВ").AutoFilter.Sort.SortFields.Clear
Я, как всегда, чертовски адекватен... Email: pilipnikop@yandex.ua WM Z206653985942, R334086032478, U238399322728, E332314026771

Anyuta

#2
KuklP, спасибо огромное, работает!
По поводу выложенного файла извиняюсь, не думала что помешает, перевыложила
Цитироватьу Вас Range("График") состоит из одного столбца, а вы ему указываете Field:=34, т.е. 34 столбец, а откуда, столбец-то всего один? Дальше смотреть не стал, приводите в порядок пример, и выкладывайте его в формате xlsm,  предварительно упаковав его в рар, или зип. Потому как в 2003 не было возможности фильтровать по массиву значений. И такого метода не было
я макрос с помощью макрорекордера собирала, всех тонкостей не знаю, да вообще можно сказать ничего не знаю, просто заменила диапазон на имя ячеек.

kuklp

Цитироватьс этим вроде работает, как иначе записать не знаю
А не  надо иначе. в 2007 и моложе это работает.
Я, как всегда, чертовски адекватен... Email: pilipnikop@yandex.ua WM Z206653985942, R334086032478, U238399322728, E332314026771

Anyuta

#4
помогите пожалуйста еще вот с этим вопросом:
как в этом макросе прописать что бы проверялся 35 столбец и если там "п6" то 9,10,11 ячейки этой строки были перечеркнуты диагональной линией?
Sub Диагонали()
    Dim cell As Range
    Application.ScreenUpdating = False                                      'отключаем обновление экрана для ускорения
        Application.Goto Reference:="Диапазон_данных"        'убираем диагонали
        Selection.Borders(xlDiagonalDown).LineStyle = xlNone '
        Selection.Borders(xlDiagonalUp).LineStyle = xlNone   '
       
    For Each cell In ActiveSheet.UsedRange.Columns(35).Cells         'проходим по всем ячейкам столбца
        If cell.Value = "п6" Then cell.Borders(xlDiagonalUp).LineStyle = xlContinuous  'если в ячейке п6 - то 9,10,11 ячейки зачеркнуть
    Next
    Application.ScreenUpdating = True
End Sub

kuklp

Не проверял:
Sub Диагонали()
    Dim cell As Range
    Application.ScreenUpdating = False                                      'отключаем обновление экрана для ускорения
    With Range("Диапазон_данных")        'убираем диагонали
        .Borders(xlDiagonalDown).LineStyle = xlNone    '
        .Borders(xlDiagonalUp).LineStyle = xlNone   '
    End With
    For Each cell In ActiveSheet.UsedRange.Columns(35).Cells         'проходим по всем ячейкам столбца
        If cell.Value = "п6" Then
            cell.EntireRow.LineStyle = xlContinuous
            'если в ячейке п6 - то 9,10,11 ячейки зачеркнуть
            Range(Cells(cell.Row, 9), Cells(cell.Row, 11)).Borders(xlDiagonalUp).LineStyle = xlContinuous
        End If
    Next
    Application.ScreenUpdating = True
End Sub
Я, как всегда, чертовски адекватен... Email: pilipnikop@yandex.ua WM Z206653985942, R334086032478, U238399322728, E332314026771

Anyuta

Спасибо! без одной строчки все работает:
cell.EntireRow.Borders(xlDiagonalUp).LineStyle = xlContinuous

Anyuta

KuklP, я опять с вопросом к вам. Как вы и писали
ActiveWorkbook.Worksheets("ПЛАН ПРОИЗВОДСТВ").AutoFilter.Sort.SortFields.Clear
не во всех версиях excel работает. Так же ругается на эту строку
ActiveSheet.Range("График").AutoFilter Field:=40, Criteria1:=Array("г1", "г2", _
          "г3", "г4", "г5", "г6"), Operator:=xlFilterValues

можно ли их заменить аналогичными командами?

kuklp

В том то и дело, что аналогичных команд в предыдущих версиях не было. Но! Сортировка была и очень эффективная. Значит вполне можно(а иногда и необходимо) сначала отсортировать, а потом уж фильтровать. А так же был расширенный фильтр, к-рый позволял фильтровать по множеству значений.
Еще одно замечание, Anyuta. Даже два.
ЦитироватьKuklP, я опять с вопросом к вам.
Если Вы обращаетесь к кому-то персонально, то слова Вы, Вам и т.д. пишутся с заглавной буквы. И - если Вы обращаетесь к кому-то персонально, то тем самым Вы сужаете круг потенциальных помощников. Обращайтесь обезличенно, к форуму и шансы получить нужный Вам ответ многократно возрастут. Никто из нас не живет на форумах. Помогаем, когда есть возможность. Сравните возможности одного форумчанина и возможности всего форума. ;)
Я, как всегда, чертовски адекватен... Email: pilipnikop@yandex.ua WM Z206653985942, R334086032478, U238399322728, E332314026771

Anyuta

#9
Спасибо за разъяснения!