Эффективно копировать и вставлять блок ячеек по нескольким критериям

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

Я хочу избежать уникального столбца, который требуется для функции поиска, поскольку это затрудняет поиск данных. Я рассматривал попытку использовать какую-то функцию FindAll, но не могу понять, как ее запустить.

Я много видел о фильтрах, но они, похоже, работают, копируя всю строку, которую я хочу избежать.

Как я уже сказал, этот код работает отлично, но это способ замедлить работу, поскольку он будет запускаться 1000 раз во время модельного запуска. У меня также есть несколько подобных субтитров, в которых я надеюсь, что вы сможете перевернуть решение

Sub Join(CI, FI, FSD) Dim a, b, LastRow As Long LastRow = Fcst_Cust.Range("a1048576").End(xlUp).Row + 1 'find all values for that customer ID for dates greater than the forecast start date and copy onto forecast tab. a = 3 b = 2 Do Until ((Raw_IFcst.Cells(b + 1, 2) = CI) And (Raw_IFcst.Cells(b + 1, 3) >= FSD)) a = a + 1 b = b + 1 Loop Do Until Raw_IFcst.Cells(b + 1, 2) <> CI b = b + 1 Loop Raw_IFcst.Range("A" & a & ":AZ" & b).Copy Fcst_Cust.Range("C" & LastRow).PasteSpecial xlPasteValues Raw_IFcst.Range("BB" & a & ":CW" & b).Copy Fcst_Cust.Range("BG" & LastRow).PasteSpecial xlPasteValues End Sub 

Вероятно, метод AdvancedFilter объекта Range будет наиболее эффективным … и ему определенно не нужно копировать полные строки. Вы можете выбрать, какие столбцы вы хотите.

Однако я реорганизовал ваш код без использования AdvancedFilter. Это должно быть значительно быстрее:

 Sub Join_(CI, FI, FSD) Dim a&, b&, LastRow&, v LastRow = Fcst_Cust.[a1048576].End(xlUp).Row + 1 a = 3 b = 2 With Raw_IFcst v = .Cells(1, 2).Resize(.[b1048576].End(xlUp).Row, 2).Value2 Do If If v(b + 1, 1) = CI Then If v(b + 1, 2) >= FSD Then Exit Do End If End If a = a + 1 b = b + 1 Loop Do Until v(b + 1, 1) <> CI b = b + 1 Loop .Range("A" & a & ":AZ" & b).Copy Fcst_Cust.Range("C" & LastRow).PasteSpecial xlPasteValues .Range("BB" & a & ":CW" & b).Copy Fcst_Cust.Range("BG" & LastRow).PasteSpecial xlPasteValues End With End Sub 

Примечание. Я не тестировал это, поэтому, пожалуйста.

Примечание. Я изменил имя Sub. Неправильно использовать имя существующей функции VBA в качестве имени процедуры, если вы действительно не хотите переопределить эту функцию.

Примечание. Я изменил строку Dim. У вас были a и b как варианты, когда они должны быть длинными.

Примечание. Что замедляло вашу процедуру, большинство из них выполнялось по ячейкам, читаемым через столбцы 2 и 3. Чтение и запись в ячейки по одному, возможно, является самым неэффективным процессом, доступным для разработчика Excel. Что делает мой код, так это перенос используемой части столбцов 2 и 3 в массив, v . Это очень быстро, и доступ к отдельным элементам массива в отличие от отдельных ячеек чрезвычайно быстрый.

Примечание. Я изменил первый цикл Do While . Оценка экспрессии VBA не вызывает коротких замыканий нескольких статей. Итак, если clause 1 И clause 2 должен быть истинным (как в вашем случае), то clause 2 будет оценено EVEN WHEN, clause 1 ложно. Это отходы обработки с нулевой выгодой. В вашей первоначальной настройке, что отходы были усилены из-за медленного чтения отдельных ячеек. Оптизация состоит в том, чтобы разбить предложения на отдельные строки. Таким образом, если первое не удается, второе никогда не оценивается. Это понятие может быть дополнительно отпитовано, поставив предложение, которое, скорее всего, потерпит неудачу в первой строке. Я не знаю, что, скорее всего, не сработает в вашем сценарии, поэтому я поместил ваше первое предложение в первую строку.

  • VBA Excel 2007 меняет макрос на поиск с использованием диапазона вместо того, чтобы помещать данные в макрос
  • Поиск текста в коде VBA (в какой строке)
  • Как построить оператор IF для соответствия только определенному тексту
  • Excel: найти значение в столбцах (столбцах)
  • Извлечь значение из основного листа, где дата падает в диапазоне
  • Excel 2013, как нам «искать», например, vlookup
  • Подстановочный поиск MS Excel
  • Проблема, указывающая путь для открытия Woorbook в приложении vb.net
  • Excel - найти все ячейки, содержащие значение и изменить цвет фона
  • Вопросы для оценки и округления
  • Как найти значения в строке excel, начинающиеся с определенных букв
  • Interesting Posts

    POI – SXSSFWorkbook – Excel нашел нечитаемый контент

    Копирование данных из одного листа Excel в другой с помощью VLOOKUP

    VBA Excel: как проверить, находится ли значение в выбранном диапазоне значений (или текущей ячейки)

    Ошибка во время выполнения Excel VBA при пакетировании 1004: Определенная пользователем или объектная ошибка

    Как повысить производительность Excel UDF, вызывающего веб-службы?

    Как обрабатывать несколько запросов IFTHEN по столбцам в Excel?

    Как скопировать данные в диапазон Excel, отформатированный как таблица, и не потерять форматирование таблицы

    Колонка с несколькими столбцами не отображает данные, которые я хочу?

    Объединенные ячейки VSTO

    Показатель Отрицательный процент в excel вместо 0.0%

    Создание таблицы Excel в VBScript

    ось времени превосходит относительные расстояния

    Формула Excel для дней и времени

    Более быстрый способ хранения листа Excel в файле system.data.datatable с использованием C #

    Включить внешние данные Excel в локальную копию

    Давайте будем гением компьютера.