2012-07-10 23 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