如何解决计数器的值未在For循环中更新
我在excel文件的B列中有数据。我做了一个循环,如果B单元格中的值大于特定的(len1)值,那么代码会将单元格(Value-Len1)值放在行末的新单元格中。
每次添加行时,我将计数器递增为lastrow = lastrow + 1。现在是问题所在。最初,在输入文件中,我有122组数据。但是,当For循环完成时,lastrow的值变为160,但循环在122退出。任何帮助将不胜感激。
For i = 1 To lastrow Step 1
If Range("B" & i).Value > len1 Then
Range("A" & lastrow + 1).Value = Range("A" & i).Value
Range("B" & lastrow + 1).Value = Range("B" & i).Value - len1
Range("B" & i).Value = len1
lastrow = lastrow + 1
End If
Next
解决方法
要获得所需的行为,您需要一个while
循环(或do
循环)
i = 1
While i <= lastrow
If Range("B" & i).Value > len1 Then
lastrow = lastrow + 1
Range("A" & lastrow).Value = Range("A" & i).Value
Range("B" & lastrow).Value = Range("B" & i).Value - len1
Range("B" & i).Value = len1
End If
i = i + 1
Wend
我用下面的sub
测试了它:
Sub LoopBeyondLastRow()
Dim i As Long,lastrow As Long,len1 As Long
len1 = 10
With ThisWorkbook.Sheets("Sheet1")
lastrow = .Cells(Rows.Count,"B").End(xlUp).Row
i = 1
While i <= lastrow
If .Range("B" & i).Value > len1 Then
lastrow = lastrow + 1
.Range("A" & lastrow).Value = .Range("A" & i).Value
.Range("B" & lastrow).Value = .Range("B" & i).Value - len1
.Range("B" & i).Value = len1
End If
i = i + 1
Wend
End With
End Sub
请注意以下几点:
- 在循环中,我先递增
lastrow
,然后在以下2条语句中使用它(以减少加法运算的次数) - 在测试代码中,我添加了
With ThisWorkbook.Sheets("Sheet1")
以完全限定所有范围。不这样做是许多错误的源头,这些错误有时很难确定。人们应该养成永不写Range
或Cells
的习惯。
请测试下一个代码,
Sub TestLoopAddedRowsInclusive()
'..... your code defining LastRow and len1
Dim lastRInit As Long
lastRInit = LastRow
For i = 1 To Rows.count
If Range("B" & i).Value = "" And i >= lastRInit Then Exit For
If Range("B" & i).Value > len1 Then
Range("A" & LastRow + 1).Value = Range("A" & i).Value
Range("B" & LastRow + 1).Value = Range("B" & i).Value - len1
Range("B" & i).Value = len1
LastRow = LastRow + 1
End If
Next
End Sub
,
一种更快的方法是将范围值导出到数组,然后进行比较。将最终输出存储到临时数组中,并将其写回到工作表中。
如果您想遵循自己的方法,这就是您要尝试的吗?我已经注释了代码,因此您在理解它时应该不会有问题。如果要重新检查在行末添加的数据,基本上需要两个循环。
Option Explicit
Sub Sample()
Dim ws As Worksheet
Dim ComparisionValue As Long
Dim countOfMatchedValues As Long
Dim lRow As Long
Dim i As Long
Dim outputRow As Long
Dim rng As Range
'~~> Change this to the relevant sheet
Set ws = Sheet1
'~~> Change this to the relevant
'~~> comparision value
ComparisionValue = 122
With ws
'~~> Start an indefinite loop
Do
'~~> Find last row
lRow = .Range("A" & .Rows.Count).End(xlUp).Row
'~~> Fix the output row for the new data
outputRow = lRow + 1
'~~> Check if there are any matches for your condition
countOfMatchedValues = Application.WorksheetFunction.CountIf( _
.Range("B1:B" & lRow),">" & ComparisionValue)
'~~> If not then exit loop
If countOfMatchedValues = 0 Then Exit Do
'~~> Do your stuff
For i = 1 To lRow
If .Range("B" & i).Value > ComparisionValue Then
.Range("A" & outputRow).Value = .Range("A" & i).Value
.Range("B" & outputRow).Value = .Range("B" & i).Value - ComparisionValue
.Range("B" & i).Value = ComparisionValue
outputRow = outputRow + 1
End If
Next i
Loop
End With
End Sub
实际操作
, for
循环使用预定义的迭代次数。对于未知数量的迭代,您需要使用while
循环。
您的代码在解释时会使用lastRow
的值,并且再也不会更新。
这类似于:
lastRow = 1
Debug.Print lastRow
lastRow = lastRow + 1
Debug.Print lastRow
您将看到:
1 2
和不:
2 2
因为执行了第一条Debug
语句后,更改lastRow
的值不再影响此特定输出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。