2017-05-16 16 views
0
Lastrow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row 
For i = 3 To Lastrow 

     Sheets("sample").Range("AM1000000").End(xlUp).Offset(1, 0).Select 
     Selection.FormulaArray = _ 
     "=IF(ISNUMBER(MATCH(1," & Chr(10) & " (order!R2C15:R1000000C15=RC[-24])*" & Chr(10) & " (order!R2C7:R1000000C7=RC[-32])*" & Chr(10) & " (order!R2C24:R1000000C24=RC[-15])," & Chr(10) & " 0)), ""pass"",""review"")" 

    Next i 
     Columns("AM:AM").Select 
    Selection.Copy 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 

for 루프의 일치 수식을 사용하고 있지만 너무 많은 시간이 걸립니다. 이 코드를 최적화하여 더 빠르게 진행할 수있는 방법이 있습니까?최적화 일치 수식 vba에서 반복하기

감사합니다. 문자열 조작과 마찬가지로

1) 읽기 및 워크 시트의 셀에 쓰기는 매우 느립니다 :

답변

0

주요 것들 중 몇 가지가있다, 당신이 만들 수있는 꽤 많은 개선이 있습니다. 대신 결과를 먼저 계산 한 후 수식을 셀에 쓰는 대신 시트에 씁니다. 더 나은 아직 배열에 결과를 저장하고 끝까지 모두 작성하십시오 (하지만이 질문의 범위를 벗어나면 배열을 온라인으로 검색 할 수 있습니다). application.worksheetfunction을 사용하여 VBA에서 기존 수식을 다시 만들거나 직접 수식을 작성하여이를 수행 할 수 있습니다.

2) 셀을 선택하지 마십시오. 매우 느린 작업입니다. 대신에 영향을받는 셀을 지정 Cells 참조하여 루프에 대한 귀하를 사용

For i = 3 To Lastrow 

     Sheets("sample").cells(i, 39).FormulaArray = _ 
     "=IF(ISNUMBER(MATCH(1," & Chr(10) & " (order!R2C15:R1000000C15=RC[-24])*" & Chr(10) & " (order!R2C7:R1000000C7=RC[-32])*" & Chr(10) & " (order!R2C24:R1000000C24=RC[-15])," & Chr(10) & " 0)), ""pass"",""review"")" 

Next i 

세포 구문 (행, 열)입니다. 여기서 i는 행 번호이고, 39는 AM 열입니다.

0

배열 수식에서 참조 범위를 줄이면 속도를 향상시킬 수 있습니다.

또한 클립 보드를 제거하는 것은 또한 속도를 높일 것

lastrow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row 
For i = 3 To lastrow 
    With WorksSheets("sample").Range("AM" & i) 
     .FormulaArray = _ 
      "=IF(ISNUMBER(MATCH(1," & Chr(10) & " (order!R2C15:R" & lastrow & "C15=RC[-24])*" & Chr(10) & " (order!R2C7:R" & lastrow & "C7=RC[-32])*" & Chr(10) & " (order!R2C24:R" & lastrow & "C24=RC[-15])," & Chr(10) & " 0)), ""pass"",""review"")" 
     .Value = .Value 
    End With