2015-11-06 117 views
1

我不知道爲什麼這會無限循環。雖然我設置了範圍,但是我的代碼在我的範圍(rng)中的所有行都已經過檢查之後不會退出循環。設置範圍內的無限循環

Option Explicit 

Sub prnt() 
    Dim i As Long 
    Dim rng As Range 
    Dim cell As Range 
    Dim row As Range 

    Set rng = ActiveSheet.Range("B8:F57") 

    For Each row In rng.Rows 
     For Each cell In rng.Rows.Cells 
      If cell <> "" Then 
       cell.Copy 
       Range("i8").Offset(i, 0).PasteSpecial 
       i = i + 1 
      Else 
      End If 

     Next cell 

    Next row 


End Sub 
+2

'對於每一個單元格在行中。單元格不是'對於rng.Rows.Cells中的每個單元格' –

+1

@TimWilliams:沒有不同意,只是想知道:如果他只想通過列表中的所有單元格,爲什麼兩個循環,爲什麼不只是'對於rng.Rows.Cells中的每個單元格?'? – Ditto

+1

@你是對的,只有一個循環是必須的,除非他想在行之間做一些事情。但是,由於OP已經寫了你所說的是真的,除了刪除'.rows',所以只有'對於rng.cells中的每個單元格' –

回答

2

OK,我只好來正確地格式化代碼來看待這個問題,在這裏它是,適當的縮進沒有空格,並與cell可變換成cel,和row可變換成rngRow

Sub prnt() 
    Dim i As Long 
    Dim rng As Range 
    Dim cel As Range 
    Dim rngRow As Range 

    Set rng = ActiveSheet.Range("B8:F57") 

    For Each rngRow In rng.Rows 
     For Each cel In rng.Rows.Cells 
      If cel <> "" Then 
       cel.Copy 
       Range("i8").Offset(i, 0).PasteSpecial 
       i = i + 1 
      Else 

      End If 
     Next cell 
    Next row 
End Sub 

立即我注意到你的第一個循環對代碼沒有任何意義。您使用rngRow(或原始中的row)作爲循環控制變量,但從未在代碼本身中引用它,因此程序的處理時間已超過50倍,因爲您正在循環250個單元,每次循環50次目前的原因。

對於每個循環,rngRow變量被設置爲B8:F8,然後B9:F9等。

cel變量被設置爲B8C8D8 ... B9rngRowC9等被設置爲B9:F9,所以正如我上面所說,你會用50個重複值最終在任何細胞範圍,不評估爲「」。

此代碼修復,並且它檢查該單元的文本屬性,因此,如果它遇到一個單元錯誤(#N/A等)

Sub prnt() 
    Dim i As Long 
    Dim rng As Range 
    Dim cel As Range 
    Dim rngRow As Range 

    Set rng = ActiveSheet.Range("B8:F57") 

    For Each cel In rng.Rows.Cells 
     If cel.Text <> "" Then 
      cel.Copy 
      Range("i8").Offset(i, 0).PasteSpecial 
      i = i + 1 
     End If 
    Next cel 
End Sub 

道歉,如果這聽起來也不會斷裂居高臨下,那不是我的意圖。

希望這會有所幫助!

+0

爲什麼不放棄可怕的剪貼板並直接賦值:'Range(「i8」)。Offset(i,0).Text = cel.Text'? – user1016274

+0

非常感謝你! –

+0

@ user1016274,因爲有時您還希望保留格式設置,條件格式設置,驗證,公式以及錯誤狀態,而AFAIK最好的方法是複製/粘貼。 –