2015-11-06 151 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最好的方法是复制/粘贴。 –