Автоматическая сортировка фильтров в VBA

Я делаю макрос VBA. В какой-то момент макрос говорит Excel изменить текущий автофильтр, чтобы сортировка автофильтра находилась в столбце в Column A, и она должна быть возрастающей.

Но в коде VBA, который у меня есть сейчас, указано, что RANGE жестко закодирован, то есть Range(A1:A655), потому что код был написан в записанном макросе. Ниже мой код VBA. Можете ли вы сказать мне, как изменить A1:A655 не жестко закодированным способом, вместо этого сделать его просто общим значением «сделать диапазон ВСЕМИ строк в этом столбце, сколько бы их ни было?

ActiveWorkbook.Worksheets("A1").AutoFilter.Sort.SortFields.Add Key:=Range(
        "A1:A655"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=
        xlSortTextAsNumbers

person estephan500    schedule 29.02.2016    source источник
comment
Извините, я должен был написать более четко... Я должен был сказать, что в коде теперь указано, что диапазон KEY должен быть жестко запрограммирован A1: A655. КЛЮЧЕВОЙ аргумент — это то, что меня беспокоит.   -  person estephan500    schedule 29.02.2016
comment
И мне очень жаль добавлять сюда больше ... Мне также нужен ответ на тот же вопрос об этой другой команде VBA, которая является ФИЛЬТРОМ, а не сортировкой. Эта команда, из которой мне также нужно удалить жестко запрограммированный диапазон, выглядит следующим образом... какие-либо советы по этому поводу? ActiveSheet.Range($A$1:$EK$655).Поле AutoFilter:=36, Criteria1:=1   -  person estephan500    schedule 29.02.2016


Ответы (1)


Старайтесь не полагаться на свойство ActiveSheet. Вы должны знать, на каком рабочем листе вы находитесь, и явно указать на него рабочий лист . CodeName или свойство Worksheet .Name.

Я полагаю, вы перепутали объект листа с объект диапазона. То есть, если у вас на самом деле нет рабочего листа с именем A1, что маловероятно.

Свойство Range.CurrentRegion — отличный способ ссылки на непрерывный блок клеток, исходящих из А1. Он продолжается вниз и вправо, пока не встретит полностью пустую строку и полностью пустой столбец. Одиночные или небольшие группы промежуточных пустых ячеек не прерывают его привязки к блоку ячеек.

    With ActiveWorkbook
        With .Worksheets("Sheet1")
            If .AutoFilterMode Then .AutoFilterMode = False
            With .Cells(1, 1).CurrentRegion
                .Cells.Sort Key1:=.Columns(1), Order1:=xlAscending, _
                            Orientation:=xlTopToBottom, Header:=xlYes
                With .Resize(.Rows.Count, 141)  '<~~ A:EK
                    .AutoFilter Field:=36, Criteria1:=1

                    'the CurrentRegion is sorted on column A and filtered
                    'on column AJ

                End With
            End With
        End With
    End With

Вложенный оператор With ... End With последовательно определяет блок ячеек, на которые вы хотите сослаться.

Я считаю, что вам лучше использовать обычный метод Range.Sort. Это проще, чем .AutoFilter.Sort. Последующий метод AutoFilter завершает операцию.

person Community    schedule 29.02.2016
comment
также просто в стороне... на самом деле в моей рабочей тетради есть рабочий лист с именем A1! также A2, A3 и B1, B2, C1, D1 ... в связи с характером моей работы. Забавное совпадение, которое, вероятно, еще не раз все запутает! :) - person estephan500; 29.02.2016
comment
Да, казалось, что вы предоставили рабочий код, но я не смог согласовать ссылку A1; не беспокойтесь, пока вы держите их прямо. В будущих вопросах может быть идея специально упомянуть об этом, иначе вы можете получить сомнительные интерпретации, подобные моей. - person ; 29.02.2016
comment
Опять же, это так полезно для меня. Прежде чем я продолжу, у меня есть всего пара вопросов о коде, который вы указали выше. Меня интересует вложенная команда With .Resize, которую вы поместили в код. (1) Можно ли было бы считать это ненужным, если бы я был уверен, что приведенный выше код Currentregion уже идентифицировал правильный полный блок ячеек для операций? Другими словами, A:EK уже был точно определен на предыдущем шаге? (2) Если бы я действительно мог быть уверен, что Currentregion правильно захватил нужный регион, что бы я сделал с кодом, чтобы удалить этот With .Resize? - person estephan500; 01.03.2016
comment
Просто удалите эту строку и сопровождающую ее End With. Если ваши данные позволяют использовать A:EK при использовании CurrentRegion, тогда в этом нет необходимости. Это только там, потому что я не мог быть уверен. - person ; 01.03.2016
comment
Спасибо, ты молодец. На ум пришел еще один вопрос, который еще больше раскрывает мой аспект новичка. Что касается фильтра, я понимаю, что если я хочу, чтобы фильтр включал два условия одновременно, например, x AND y, тогда я просто добавляю дополнительную строку .AutoFilter Field ...... и строки должны будут соответствуют обоим критериям. Но... что, если я хочу, чтобы фильтр состоял из двух условий или был объединен вместе... например, должны появиться строки, если условие x ИЛИ условие y? Каков самый изящный способ заставить ваш приведенный выше код сделать это? Еще раз спасибо за эту помощь -- Эрик - person estephan500; 01.03.2016
comment
Это был бы другой вопрос. Вы можете взглянуть на Can Advanced Критерии фильтрации должны быть в VBA, а не в диапазоне? - person ; 01.03.2016