首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Excel VBA用于下一步和如果然后删除行

Excel VBA用于下一步和如果然后删除行
EN

Stack Overflow用户
提问于 2022-03-13 02:29:21
回答 1查看 96关注 0票数 2

我试图写一个代码,如果有一个IR诊所已经完成,但所有的活检条目被取消的相同的ID,然后我想删除行的IR是。第1行是标题。B列为IR,L列为“活检”或"IR诊所“。C列为“已完成”或“已取消”

代码语言:javascript
复制
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。谢谢你提前提供帮助。

EN

回答 1

Stack Overflow用户

发布于 2022-03-13 09:18:45

For...Next Loop简化的缺点

代码

代码语言:javascript
复制
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).

  • Whatever是多余的(您可能已经将LastRow = LastRow - 1用于与frlr相同的LastRow = LastRow - 1,它只循环5次。在进入循环之前,VBA已经将数字frlr存储在某个地方.

代码语言:javascript
复制
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的行为

代码语言:javascript
复制
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

代码语言:javascript
复制
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 Sub
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71453971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档