2017-02-07 1 views
-4

미리 도움을 주셔서 감사합니다. 셀 값 "True"에 대해 "ClientTradeDetails"라는 시트의 열 O를 검색하는 매크로를 만들었고, 셀 값이 "True"이면 전체 행을 가져 와서 "TrueValues"시트에 붙여 넣습니다. .코드 속도 향상 (한 시트에서 다른 시트로 복사/붙여 넣기)

작동하지만 극히 느립니다. 보시다시피 필자는 마스터 시트에 65536 행의 데이터를 가지고 있습니다. 복사/붙여 넣기가 문제라고 생각했지만 Copy 메서드를 피하기 위해이를 변경하는 방법을 모르겠습니다. 어떤 도움이 필요합니까?

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 메서드] (https://msdn.microsoft.com/en-us/library/office/aa221844.aspx)를 사용하여 한 열에서 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)를 참조하십시오.). 그 속도가 크게 증가 할 것입니다. 또한 값의 양에 따라 자동 입력기가 너무 느려질 수 있지만 모든 행을 반복하는 것보다 확실히 빠릅니다. –

답변

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 값을 가지고 있다면, 이것들을 모두 배열에 넣고 배열을 다시 워크 시트에 넣습니다. 필요에 따라 인쇄 할 부분을 다시 변경할 수 있습니다.

관련 문제