2015-09-04 44 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