设置范围内的无限循环
我不知道为什么这会无限循环。虽然我设置了范围,但是我的代码在我的范围(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
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
变量被设置为B8
,C8
,D8
... B9
,rngRow
前C9
等被设置为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
道歉,如果这听起来也不会断裂居高临下,那不是我的意图。
希望这会有所帮助!
为什么不放弃可怕的剪贴板并直接赋值:'Range(“i8”)。Offset(i,0).Text = cel.Text'? – user1016274
非常感谢你! –
@ user1016274,因为有时您还希望保留格式设置,条件格式设置,验证,公式以及错误状态,而AFAIK最好的方法是复制/粘贴。 –
'对于每一个单元格在行中。单元格不是'对于rng.Rows.Cells中的每个单元格' –
@TimWilliams:没有不同意,只是想知道:如果他只想通过列表中的所有单元格,为什么两个循环,为什么不只是'对于rng.Rows.Cells中的每个单元格?'? – Ditto
@你是对的,只有一个循环是必须的,除非他想在行之间做一些事情。但是,由于OP已经写了你所说的是真的,除了删除'.rows',所以只有'对于rng.cells中的每个单元格' –