2012-07-10 62 views
3

我发现,直接应用到,我想在这里Excel VBA: Loop through cells and copy values to another workbook构建代码的线程。使用的IsEmpty停止循环

Sub test() 

Dim ws1 As Worksheet, ws2 As Worksheet 
Dim CurCell_1 As Range, CurCell_2 As Range 
Dim Ran As Range 
Dim Group As Range, Mat As Range 

Application.ScreenUpdating = True 

Set ws1 = ActiveWorkbook.Sheets("Scrap") 
Set ws2 = ActiveWorkbook.Sheets("FC Detail") 

For Each Mat In ws1.Range("E:E") 
    Set CurCell_2 = ws2.Range("F8") 
    For Each Group In ws1.Range("E:E") 
     Set CurCell_1 = ws1.Cells(Group.Row, Mat.Column) 
     If Not IsEmpty(CurCell_2) Then 
      CurCell_2.Value = CurCell_1.Value 
     End If 
    Next 
Next 

End Sub 

此代码有一个例外,它不断循环。

我认为If Not IsEmpty将是描述符VBA,一旦到达列表的末尾停止该程序。

+0

你是什么意思的“循环不断?”如果代码从不退出循环,你怎么知道代码“有效”? – 2012-07-10 22:39:45

+0

它正在连续运行,因为您正在处理整个列......两次。为什么不找到最后一行然后限制你的范围,如其他链接所示? – 2012-07-10 23:13:51

回答

5

而且我的评论,试试这个。这将更快

Sub Test() 
    Dim ws1 As Worksheet, ws2 As Worksheet 
    Dim CurCell_1 As Range, CurCell_2 As Range 
    Dim Group As Range, Mat As Range, Ran As Range 
    Dim lRow As Long 

    Set ws1 = ActiveWorkbook.Sheets("Scrap") 
    Set ws2 = ActiveWorkbook.Sheets("FC Detail") 

    With ws1 
     lRow = .Range("E" & .Rows.Count).End(xlUp).Row 

     Set Ran = .Range("E1:E" & lRow) 

     For Each Mat In Ran 
      Set CurCell_2 = ws2.Range("F8") 
      For Each Group In Ran 
       Set CurCell_1 = .Cells(Group.Row, Mat.Column) 
       If Not IsEmpty(CurCell_2) Then 
        CurCell_2.Value = CurCell_1.Value 
       End If 
      Next 
     Next 
    End With 
End Sub 
+1

+1。科林,如果你完成Excel VBA的开发工作,找到最后一行是你一直会做的事情。 Siddharth在上面的代码中发现它的方式是你应该记住的。您还需要养成逐步浏览代码的习惯(F8),看看它实际上在做什么。 – 2012-07-10 23:54:54

+0

说到的良好习惯,把中的DoEvents所有的循环,特别是在开发过程中。那样的话,你总是可以入门,在无限循环的情况下。 – ForEachLoop 2012-07-11 15:14:43

+0

非常感谢您的帮助,只需进行一些修改就可以实现出色的效果。 – 2012-07-11 17:10:55