VBA Копирование видимых ячеек и вставка в качестве значений - самый эффективный метод - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть инструмент Excel, который использует фид из 11 различных файлов необработанных данных, сгенерированных из системы отчетов, для выполнения некоторых расчетов с этими данными.

Процесс очень прост: - открыть файл - отфильтровать содержимое - отфильтровать копию содержание - вставьте в другой файл (вкладка инструмента сводки)

. По мере того, как объемы данных и отдельных файлов увеличивались, у меня возникало больше проблем с памятью. Поэтому задайте вопрос - какой способ копирования является наиболее эффективным с точки зрения памяти и скорости / вставить эти таблицы?

  • (...). SpecialCells (xlCellTypeVisible). Копия назначения: = (...) - я не нашел способ включить параметр XLValues ​​для это (я хочу минимизировать ресурсы, занимаемые копированием форматирования, формул нет)

  • с использованием определенных диапазонов для цели копирования / вставки (диапазон имен с параметром xlCellTypeVisible, преобразование в другое диапазон для получения только значений и отправки диапазона к месту назначения) - для этого потребуются дополнительные переменные для диапазонов

  • простые старые столбцы (...). SpecialCells (xlCellTypeVisible) .Copy и Range. ("A1"). PasteSpecial Paste: = xlValues ​​- этот метод имеет как "только видимые ячейки", так и " вставьте только те значения, которые я ищу, но он использует буфер обмена в качестве посредника, и я предполагаю, что это поглощает мою память

Может быть, есть еще один метод, который я надеваю Не знаете?

Цените любые идеи!

1 Ответ

1 голос
/ 07 апреля 2020

К счастью, для этого есть встроенная функция автофильтра. Допустим, мы начинаем с:

enter image description here

и применяем к нему фильтр:

Sub Macro1()
    Columns("A:B").AutoFilter
    ActiveSheet.Range("$A$1:$B$8").AutoFilter Field:=2, Criteria1:=">50", Operator:=xlAnd
End Sub

enter image description here

==> Автофильтр имеет свойство Range, которое позволяет: <== </strong>

Sub Kopy()
    Dim rng As Range
    Set rng = ActiveSheet.AutoFilter.Range
    rng.Copy Sheets("Sheet2").Range("A1")
End Sub

Результат на Sheet2 имеет

  1. только видимые данные из Sheet1
  2. строки заголовка
  3. не фильтруется

enter image description here

ПРИМЕЧАНИЕ:

Зацикливание не требуется.
Аналогичный подход можно использовать для Tables.
SpecialCells не требуется.

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