2014-11-13 2 views
0

데이터를 찾고 행을 복사하고 다른 시트에 붙여 넣고 여러 시트 사이의 값을 바꿀 속도를 향상 시키려고합니다.VBA 찾기, 복사, 붙여 넣기, 시트 간 교체 속도 향상

현재 각 시트를 활성화하고 cells.Find를 사용하고 있지만 60k + 행을 검색 할 때 매우 느리거나 전혀 진행되지 않습니다. 여기

내가 "개선하기 위해 노력하고있어 기본적인 프로세스입니다.

Sub UpdateSKU() 
'On Error GoTo ErrorCatch 


Dim OldSKU As Long 
Dim NewSKU As Long 
Dim SKUSubset As String 
Dim SubsetRange As Range 

OldSKU = Sheets("Rollover Request").Range("A2") 
NewSKU = Sheets("Rollover Request").Range("B2") 


'UPDATE NEW SKU IMPORTER 
Sheets("SKU Exporter").Activate 

Cells.Find(what:=OldSKU, after:=ActiveCell, LookIn:=xlFormulas, _ 
    Lookat:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
    MatchCase:=False, SearchFormat:=False).Activate 
ActiveCell.EntireRow.Copy 
Sheets("New SKU Importer").Range("A2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
Application.CutCopyMode = False 
Worksheets("New SKU Importer").Columns("A:A").Replace what:=OldSKU, Replacement:=NewSKU, Lookat:=xlPart _ 
    , SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ 
    ReplaceFormat:=False 


End Sub 

내가 통합 문서에서 여러 다른 시트에 대해이 작업을 수행

어떤 도움도 대단히 감사하겠습니다 감사합니다

!
+0

[이 게시물은 많은 것을 다룹니다.] (http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) 그것에. 또한 켜고 끄기 * screenupdating *; 변수 선언 다음에'Application.ScreenUpdating = False', 서브를 끝내기 전에'Application.ScreenUpdating = True'가됩니다. – L42

+0

범위 또는 워크 시트를 활성화 (또는 선택) 할 수있는 이유가 거의 없습니다 (코드에는 포함되지 않음). 그렇게하면 코드가 상당히 느려집니다. 범위를 직접 참조하십시오. 또한 ScreenUpdating을 해제해야합니다. 계산을 수동으로 설정하십시오. 이벤트 매크로가 실행 중이면 이벤트를 비활성화하십시오. –

+0

안녕하세요, 화면을 업데이트하지 않아서 도움이되었습니다. 나는 VBA에 새로운 슈퍼이므로 범위를 직접 언급하는 것은 내가하는 방법을 알아 내려고 노력하고있는 것이다. –

답변

0

나는 당신의 문제가 옳은지 확신 할 수 없다. 전체 소스 시트에서 특정 값을 찾고 있는가? 하나의 단일 발생이 나타날 때마다, 값을 찾은 열을 대상 시트에 붙여 넣을 수 있는가? 그 값은 한 번만 나타 납니까? 전체 시트에서 또는 여러 번 한 열에서?

어쨌든, 검색의 속도를 높이고 작업의 일부를 복사하는 방법에 대한 아이디어가 있습니다. 배열을 사용하면 이러한 프로세스가 매우 빨라진다는 것을 알게 될 것입니다. 이 도움이

희망 ...

Sub SF_row() 

Dim arr_DB As Variant 
Dim i As Long, j As Long 
Dim no_col As Integer, no_rows As Long 
Dim col_no As Integer 

Dim ws1 As Worksheet, ws2 As Worksheet 
Set ws1 = ThisWorkbook.Worksheets("SKU Exporter") 
Set ws2 = ThisWorkbook.Worksheets("New SKU Importer") 
ws1.Activate 
no_rows = ws1.Range(Cells(Rows.Count, 1), Cells(Rows.Count, 1)).End(xlUp).Row 
no_cols = ws1.Range(Cells(1, Columns.Count), Cells(1, Columns.Count)) _ 
    .End(xlToLeft).Column 
arr_DB = ws1.Range(Cells(1, 1), Cells(no_rows, no_cols)) 
For i = 1 To no_rows 
    For j = 1 To no_cols 
     If InStr(arr_DB(i, j), "String or Value you search for") <> 0 Then 
      col_no = j 
     GoTo copy_column 
     End If 
    Next 
Next 
copy_column: 
ws1.Range(Columns(col_no), Columns(col_no)).Select 

With Selection 
    .Copy 
End With 
ws2.Activate 

ws2.Range("A1").Select 
ActiveSheet.Paste 
End Sub 
+0

@ L42 : 나는 여기에서 새로운 사람이다. 내 대답에서 당신은 무엇을 바꾸 었습니까? 포럼을 사용하는 방식을 개선 할 수 있습니까? – jemmy

+0

안녕하세요. 어떤 식 으로든 변경하지 않았으며 단지 가독성을 높이고 실행 코드 스 니펫을 제거했습니다. 적용 할 수 있다고 생각하지 않기 때문입니다. 만족스럽지 않으면 언제든지 다시 되돌릴 수 있습니다. – L42

+0

안녕하세요 @ jemmy, 고마워요! 불행히도,이 부분에서 1004 (Appliction-defined object-defined error)를 얻었습니다 : skuExp.Range (Columns (col_no), Columns (col_no)).선택 또한, 위에서 언급 한 스레드의 조언을 기반으로, 나는 가능한 한 많이 사용하십시오. 선택을 피하려고합니다. 사용하지 않고 행을 복사하는 방법에 대한 아이디어 .Select? –

0

찾기를 사용하여 천 개 이상의 몇 가지 레코드가 느립니다. 경우에 따라 검색되는 레코드 수를 줄이기 위해 데이터를 필터링하거나 정렬 할 수 있었지만 작업 한 정확한 데이터에 따라 달라질 수 있습니다.

보고있는 SKU 중 일부가 변경되지 않은 경우 변경된 것으로 알고있는 SKU 만 실행하면 조금 더 빠릅니다.

0

그래서 제 질문에 대한 답변을 찾을 수 없었습니다. OLDSKU 값을 찾는 대신 각 시트에 하나의 인스턴스 만 있기 때문에 필자는이를 필터링하기로 결정했습니다.

코드는 다음과 같습니다

Sub UpdateSKU() 

Application.ScreenUpdating = False 

Dim OldSKU As Long 
Dim NewSKU As Long 
Dim skuExp As Worksheet, skuImp As Worksheet 
Set skuExp = Sheets("SKU Exporter") 
Set skuImp = Sheets("New SKU Importer") 

OldSKU = Sheets("Rollover Request").Range("A2") 
NewSKU = Sheets("Rollover Request").Range("B2") 



'UPDATE SKU IMPORTER 

skuExp.Range("A1").AutoFilter _ 
           Field:=1, Criteria1:=OldSKU 

skuExp.Range(skuExp.Cells(2, 1), skuExp.UsedRange. _ 
        SpecialCells(xlLastCell)).Copy 

skuImp.Cells(Rows.Count, 1).End(xlUp).Offset(1).PasteSpecial _ 
     Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False 

skuImp.Columns("A:A").Replace What:=OldSKU, Replacement:=NewSKU, LookAt:=xlPart _ 

skuExp.ShowAllData 

End Sub 

모든 당신의 도움을 주셔서 감사합니다!