2015-09-04 45 views
2

任何人都可以幫助我優化下面的簡單代碼 需要永久完成執行。 也許我在某處遇到了無限循環。 它所做的僅僅是兩個字符串,如果它們相等,那麼它會根據這裏提到的單元格對位置進行混洗。如何提高下列代碼的效率

Sub sort() 

Dim astid As String 
Dim partno As String 
Dim FinalRow As Long 
Dim i, j As Integer 

FinalRow = Sheets("Combined Version").Range("H9000").End(xlUp).Row 

For i = 5 To FinalRow 

    partno = Sheets("Combined Version").Cells(i, 7).Value 

    For j = 5 To FinalRow 

     astid = Sheets("Combined Version").Cells(j, 8).Value 

     If astid = partno Then 

      Cells(j, 8).Select 
      Selection.Copy 
      Range("N5").Select 
      ActiveSheet.Paste 

      Cells(i, 8).Select 
      Application.CutCopyMode = False 
      Selection.Copy 
      Cells(j, 8).Select 
      ActiveSheet.Paste 

      Range("N5").Select 
      Application.CutCopyMode = False 
      Selection.Copy 
      Cells(i, 8).Select 
      ActiveSheet.Paste 

     End If 

    Next j 
Next i 
End Sub 
+0

這應該在代碼審查 – brettdj

+0

'End(xlUp).Row'將給你在H列的頂部單元格,即第一行!你在尋找最後一個!循環將是無限的,因爲j和i的值會增加! – MarmiK

+0

@MarmiK - 我和j是行號。 'Cells(i,8)'中的8表示第8列(又名H列)。有關完整的說明,請參見[Range.Cells屬性](https://msdn.microsoft.com/en-us/library/office/ff196273.aspx)。 – Jeeped

回答

2

爲臨時存放區的使用iterim N5的是不必要的,因爲你已經存儲了值在astid var。

Sub mysort() 
    Dim astid As String, partno As String 
    Dim fr As Long, i, j As Long 

    With Sheets("Combined Version") 
     fr = .Cells(Rows.Count, "H").End(xlUp).Row 
     For i = 5 To fr 
      partno = .Cells(i, 7).Value2 
      For j = 5 To fr 
       astid = .Cells(j, 8).Value2 
       If LCase(astid) = LCase(partno) Then 
        .Cells(j, 8) = .Cells(i, 8).Value2 
        .Cells(i, 8) = astid 
       End If 
      Next j 
     Next i 
    End With 
End Sub 

使用該With ... End With statement降低了重複調用,以確定工作表。

這可以使變體陣列更快。

+0

最後2分鐘還在運行嗎?沒有其他辦法可以讓它快速執行嗎?還需要大量的CPU資源來加熱處理器...... –

+0

如果您問是否可以更快地完成好的;我在上面解釋過。在樣本數據之前和之後提供一些信息,我可以看到我能想出什麼。 – Jeeped

2

看起來您正在掃描工作表中的每一行,以查看您工作的每一行!這可以通過Find進一步改進,選擇匹配的列中的所有單元格,然後簡單列舉它們。查看Chip Pearson的FindAll函數可以獲得這方面的幫助。 http://www.cpearson.com/excel/FindAll.aspx

此外,您正在使用剪貼板很多不必要的。您只需在切換時保存變量中的值。

嘗試了這一點(使用你有沒有優化「的FindAll」選項相同的結構): -

Sub sort() 

Dim astid As String 
Dim partno As String 
Dim FinalRow As Long 
Dim i, j As Integer 

Dim Cell_I As String 
Dim Cell_J As String 

Dim ws As Worksheet 

'Don't update the screen until the end 
Application.ScreenUpdating = False 

Set ws = Sheets("Combined Version") 

FinalRow = ws.Range("H9000").End(xlUp).Row 

For i = 5 To FinalRow 

    partno = ws.Cells(i, 7).Value 

    For j = 5 To FinalRow 

     astid = ws.Cells(j, 8).Value 

     If astid = partno Then 

      Cell_I = ws.Cells(i, 8).Value 
      Cell_J = ws.Cells(j, 8).Value 

      ws.Cells(j, 8).Value = Cell_I 
      ws.Cells(i, 8).Value = Cell_J 

     End If 

    Next j 
Next i 

Set ws = Nothing  

Application.ScreenUpdating = True 

End Sub