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

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

Я хочу избежать уникального столбца, который требуется для функции поиска, поскольку это затрудняет поиск данных. Я рассматривал попытку использовать какую-то функцию 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 ложно. Это отходы обработки с нулевой выгодой. В вашей первоначальной настройке, что отходы были усилены из-за медленного чтения отдельных ячеек. Оптизация состоит в том, чтобы разбить предложения на отдельные строки. Таким образом, если первое не удается, второе никогда не оценивается. Это понятие может быть дополнительно отпитовано, поставив предложение, которое, скорее всего, потерпит неудачу в первой строке. Я не знаю, что, скорее всего, не сработает в вашем сценарии, поэтому я поместил ваше первое предложение в первую строку.

  • Excel - заполнение данных до тех пор, пока не найдет правильный
  • Столбец поиска, определяемый номером VBA
  • Подстановочный поиск MS Excel
  • Проблема, указывающая путь для открытия Woorbook в приложении vb.net
  • Возвращаемое значение из одной ячейки, основанной на другой
  • Подключить Excel PivotTable к нескольким БД доступа для поиска данных
  • 4 бинарных критерия для возврата списка результатов
  • Excel - получение местоположения ячейки
  • Как построить оператор IF для соответствия только определенному тексту
  • Как рассчитать сумму дней в пределах диапазона в течение нескольких лет
  • Excel - поиск текста в фигурах
  • Давайте будем гением компьютера.