我试图写一个代码,如果有一个IR诊所已经完成,但所有的活检条目被取消的相同的ID,然后我想删除行的IR是。第1行是标题。B列为IR,L列为“活检”或"IR诊所“。C列为“已完成”或“已取消”
For i = 2 To LastRow
If Range("L" & i).Value = "IR Clinic" And Range("C" & i).Value = "Completed" Then
For j = 2 To i
If Range("B" & j).Value = Range("B" & i).Value And _
Range("L" & j).Value = "Biopsy" And _
Range("C" & j).Value = "Canceled" Then
Selection.Rows(i).EntireRow.Delete
LastRow = Cells(Rows.Count, 2).End(xlUp).Row
i = i - 1
Exit For
End If
Next j
End If
Next i此代码的问题是,如果至少取消了一次活检,它将删除IR行。我真正需要的是,如果同一个ID的所有活检被取消,它会删除它,但如果至少一个已经完成,它不会删除IR。谢谢你提前提供帮助。
发布于 2022-03-13 09:18:45
For...Next Loop简化的缺点
代码
Option Explicit
Sub Test()
i = 2
Do
'For i = 2 To LastRow ' LastRow is stored; you cannot effectively modify it
If Range("L" & i).Value = "IR Clinic" _
And Range("C" & i).Value = "Completed" Then
For j = 2 To i
' Note the change in this logic!
If Range("B" & j).Value = Range("B" & i).Value _
And Range("L" & j).Value = "Biopsy" _
And Range("C" & j).Value <> "Canceled" Then ' or '= "Completed"'
Exit For
End If
Next j
If j > i Then ' if the loop was uninterrupted; all canceled; none completed
Rows(i).Delete
LastRow = LastRow - 1
i = i - 1
'Else ' the loop was interrupted; not all canceled; at least one was completed
End If
End If
i = i + 1
Loop Until i > LastRow
End Sub外环
这说明了为什么代码中的行effect).
LastRow = LastRow - 1用于与fr或lr相同的LastRow = LastRow - 1,它只循环5次。在进入循环之前,VBA已经将数字fr和lr存储在某个地方.。
Sub ForNext1()
Dim fr As Long: fr = 2 ' irrelevant
Dim lr As Long: lr = 6
Dim i As Long
For i = fr To lr
' do your stuff
fr = 2 * i ' irrelevant
lr = 3 * i
Debug.Print "i = " & i, "fr = " & fr, "lr = " & lr
Next i
End Sub使用Do...Loop.模拟ForNext1的行为
Sub DoLoop()
Dim fr As Long: fr = 2 ' irrelevant
Dim lr As Long: lr = 6
Dim i As Long: i = fr
Do
' do your stuff
fr = 2 * i ' irrelevant
lr = 3 * i
Debug.Print "i = " & i, "fr = " & fr, "lr = " & lr
' Next
i = i + 1
lr = 6 ' Gotcha! Here we can effectively change 'lr'!!!
Loop Until i > lr
End Sub内环
这与代码中行(5).的使用有关。当不间断地退出时,j等于i + 1 (6),而不是i If j > i Then。
Sub ForNextTEST2()
Dim i As Long: i = 5
Dim j As Long
For j = 1 To i
Next j
Debug.Print "j = " & j, "i = " & i
End Subhttps://stackoverflow.com/questions/71453971
复制相似问题