2017-02-07 3 views
-4

Благодарим за помощь заранее. Мне удалось создать макрос, который ищет столбец O листа под названием «ClientTradeDetails» для значения ячейки «True», и, если значение ячейки «True», оно занимает всю целую строку и вставляет ее в лист под названием «TrueValues», ,Необходимо ускорить код (копировать/вставлять с одного листа на другой)

Это работает, НО очень медленно. Как вы можете видеть, у меня есть 65536 строк данных на моем главном листе, чтобы пройти. Я думал, что проблема с копией/вставкой была проблемой, но я не знаю, как это изменить, чтобы избежать метода копирования. Любая помощь?

Sub MoveTrue() 

Sheets("ClientTradeDetails").Select 

Dim tfCol As Range, Cell As Object 

    Set tfCol = Range("O2:O439050") 'Substitute with the range ' 

    For Each Cell In tfCol 

     If Cell.Value = "True" Then 
      Cell.EntireRow.Cut 
      Sheets("TrueValues").Select 
      ActiveSheet.Range("A65536").End(xlUp).Select 
      Selection.Offset(1, 0).Select 
      ActiveSheet.Paste 
     End If 

    Next 

End Sub 
+0

Проблема в том, что у вас столько данных на одном листе excel, и вы ожидаете, что макрос наверстает упущенное решение по управлению данными. – DejaVuSansMono

+2

Используйте метод [AutoFilter method] (https://msdn.microsoft.com/en-us/library/office/aa221844.aspx), чтобы отфильтровать значение true в одном столбце и передать массовые значения. При необходимости повторите для других столбцов. Вы в настоящее время ищете (для всех целей и задач) весь рабочий лист. Конечно, у вас есть только несколько столбцов, которые могут содержать true. – Jeeped

+0

Что такое @Jeeped означает сказать, что я считаю заменой 'Cell.Entire.Cut' чем-то вроде' Intersect (UsedRange, Cell.EntireRow) .Cut'. Таким образом, вы копируете только нужные столбцы. Не вся строка (которая, вероятно, не заполняется во всех столбцах. Также см. [Избегать выбора] (http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros), Что значительно увеличит вашу скорость. Кроме того, в зависимости от количества значений AutoFitler может быть слишком медленным, но определенно быстрее, чем цикл всех этих строк. –

ответ

0

Это может быть немного более сложным, чем вы искали, но работает гораздо эффективнее, чем копирование и вставка данных:

Sub GetTrueValues() 

Dim ws As Worksheet 
Dim arr() As Variant 
Dim arrFound() As Variant 
Dim arrOut() As Variant 

Dim i As Long 
Dim j As Long 
Dim k As Long 

Dim lConst As Long: lConst = 15 ' For the O column 

Set ws = ActiveWorkbook.Sheets("SheetName") 
arr() = ws.UsedRange.Value 

For i = LBound(arr()) To UBound(arr()) 
    If arr(i, lConst) = "True" Then 
     k = k + 1 
     ReDim arrFound(1 To k) 
     arrFound(k) = i 
    End If 
Next 

ReDim arrOut(1 To k, 1 To UBound(arr(), 2)) 
For i = 1 To UBound(arrFound()) 
    For j = LBound(arr()) To UBound(arr(), 2) 
     arrOut(i, j) = arr(arrFound(k), j) ' Using the previously stored integer, 
              ' retrieve the records of interest. 
    Next 
Next 

ActiveWorkbook.Sheets.Add 
ActiveSheet.Range("A1").Resize(UBound(arrOut(), 1), UBound(arrOut(), 2)).Value = arrOut() 

End Sub 

Что этот макрос по существу делает это находит количество записей которые имеют значение true, затем помещают все это в массив и выплескивают массив обратно в рабочий лист. Вы можете изменить часть, в которой она отпечатывается, если необходимо.

Смежные вопросы