Вырезать Вставить данные из листа Excel с помощью автофильтра в Excel VBA - PullRequest
0 голосов
/ 19 августа 2011

В настоящее время у меня есть Excel с примерно 200000+ записей, и мне нужно фильтровать данные на основе столбца. Столбец имеет около 5 значений, и мне нужно отфильтровать 2 значения на одном листе, а остальные 3, чтобы остаться на том же листе.

Теперь вместо использования сравнения ячеек по ячейкам, чтобы проверить, попадает ли значение ячейки в какое-либо из двух вышеуказанных значений, а затем вырезать, вставить строку на другой лист. Это не будет работать с 200k + записями и просто зависает.

Вместо этого я планирую использовать метод автоматического фильтра. Я попытался использовать функцию «Запись макроса», но проблема в том, что она выдает ошибку типа

"Excel не может создать или использовать ссылку на диапазон данных, поскольку он слишком сложный. Попробуйте одно из следующих Используйте данные, которые можно выбрать в прямоугольнике Использовать данные с того же листа "

Кроме того, как скопировать и вставить только отфильтрованные значения на другой лист? Если я пытаюсь скопировать вставку напрямую или специальную вставку как «значения», то копирование вставляется даже в скрытые строки.

Ниже приведен код макроса, который я вмешивался в

    Sub Macro34()
    '
    ' Macro34 Macro
    '

    '
        Rows("1:1").Select
        Selection.AutoFilter
        ActiveSheet.Range("$A$1:$T$81335").AutoFilter Field:=6, Criteria1:="=242", _
            Operator:=xlOr, Criteria2:="=244"
        Cells.Select
        Selection.Copy
        ActiveWindow.SmallScroll Down:=21
        Sheets("Sheet2").Select
        ActiveWindow.SmallScroll Down:=-18
        Range("A1").Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
        Selection.ClearContents
        Range("A1").Select
        Sheets("Sheet1").Select
        Selection.Copy
        Sheets("Sheet2").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Sheets("Sheet2").Select
        ActiveWindow.SmallScroll Down:=93
        Sheets("Sheet1").Select
        ActiveWindow.SmallScroll Down:=-9
        ActiveWindow.ScrollRow = 1
        Rows("1:1").Select
        Application.CutCopyMode = False
        Selection.AutoFilter
    End Sub

Там могут быть некоторые ненужные строки кода выше, поскольку он сгенерирован с использованием функции «макрос записи».

Может кто-нибудь, пожалуйста, помогите мне. Проблема заключается в количестве данных в Excel. Может ли Excel не обрабатывать столько данных в VBA? Использую Excel 2007

Ответы [ 2 ]

1 голос
/ 19 августа 2011

Вот ваш код очищен:

Sub Macro34()

    ' Turn off autofiltering
    If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False

    ' Turn it back on
    Rows(1).AutoFilter

    ' Set the autofiltering conditions
    Rows(1).AutoFilter Field:=6, _
        Criteria1:="=242", _
        Operator:=xlOr, _
        Criteria2:="=244"

    ' Copy only the relevant range
    Range("A1", _
          Cells(65536, Cells(1, 256).End(xlToLeft).Column).End(xlUp)).SpecialCells(xlCellTypeVisible).Copy

    ' Paste the data into Sheet2 (assuming that it exists)
    Sheets("Sheet2").Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
    Application.CutCopyMode = False

End Sub

Ключ в том, что часть SpecialCells.

Теперь, насколько мне нравится хороший автофильтр, копируй и вставляй, когда имеешь дело с таким большим количеством данных, тебе может понадобиться использовать ADO, который позволит тебе делать запросы к твоему листу Excel с использованием SQL.

Хороший обзор ADO в VBA представлен здесь: http://www.xtremevbtalk.com/showthread.php?t=217783.

0 голосов
/ 31 мая 2013

В 1-м пустом столбце справа от ваших данных введите формулу, которая проверяет ваши критерии: например,

=if(or(a2=242,a2-244),"Move","Keep")

затем в вашем макросе отсортируйте все 200 000 строк данных, заданных в этом столбце, прежде чем пытаться выполнить фильтрацию и вырезать видимый код, описанный в answer1.

Это сделает блок данных вырезанным в одном непрерывном диапазоне. Это должно обойти ошибку «слишком большой диапазон данных».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...