首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果单元格不等于零或空白,则删除行

如果单元格不等于零或空白,则删除行
EN

Stack Overflow用户
提问于 2021-04-12 11:09:48
回答 2查看 52关注 0票数 1

我研究了几个代码,但它要么只支持空格,要么只支持零,我需要一个同时支持空格和零的代码。

我有3列要注意这是否应该被删除

我需要删除具有完整详细信息(ID和地址)的行(名称是详细信息的基础),因为我需要保留具有不完整详细信息(ID或地址为零或空白)的行。

代码语言:javascript
复制
ID        Name        Address        
1         A           123 ABC
2         B           0
          C           345 CDE
          D           
5         E           567 EFG
0         F           678 FGH
7         G           789 GHI
0         H           0

我的第一次尝试是这个代码,它适用于条件,但如果我有后续的空格,它会跳过下一行,因为该行向上

代码语言:javascript
复制
lrow = 1000
For x = 2 To lrow
If Cells(x,2)<>"" Then
If Cells(x,1) <> "" Or Cells(x,1) <> "0" Or Cells(x,3) <> "" Or Cells(x,3) <> "0" Then
Cells(x,11).EntireRow.Delete
End If
End If    
Next x

所以我尝试了这个代码,我从下往上开始。

代码语言:javascript
复制
lrow = 1000
For x = lrow To 2 Step -1
If Cells(x,2)<>"" Then
If Cells(x,1) <> "" Or Cells(x,1) <> "0" Or Cells(x,3) <> "" Or Cells(x,3) <> "0" Then
Cells(x,11).EntireRow.Delete
End If
End If    
Next x

但该代码忽略了除第一个条件之外的条件,然后还删除了具有不完整详细信息的其他行s。

我有点坚持这样做,因为我还必须创建另一个我做相反的,保留完整的细节,并删除不完整的细节。

EN

回答 2

Stack Overflow用户

发布于 2021-04-12 11:27:12

将for循环替换为do while循环。如果该行被删除,则减少总行数,否则递增行计数器。

代码语言:javascript
复制
lastRow = 1000
row = 2
Do While row <= lastRow
    If Cells(row,1)<>"" Then
        If Cells(row,1) <> "" Or Cells(row,1) <> "0" Or Cells(row,3) <> "" Or Cells(row,3) <> "0" Then
            Rows(row).Delete
            lastRow = lastRow - 1
        else
            row = row + 1
        End If
    End If    
Loop
票数 0
EN

Stack Overflow用户

发布于 2021-04-12 11:53:34

删除有条件的行

向后的循环

代码语言:javascript
复制
Sub testSimple()
    Const lrow As Long = 1000
    Dim x As Long
    For x = lrow To 2 Step -1
        If Len(Cells(x, 1)) > 0 And Cells(x, 1) <> 0 Then
            If Len(Cells(x, 3)) > 0 And Cells(x, 3) <> 0 Then
                Rows(x).Delete
            End If
        End If
    Next x
End Sub

编辑:

展示的明星是If语句,理想情况下(最有效)实际上应该是:

代码语言:javascript
复制
If Len(Cells(x, 1)) > 0 Then
    If Cells(x, 1) <> 0 Then
        If Len(Cells(x, 3)) > 0 
            If Cells(x, 3) <> 0 Then
                Rows(x).Delete
            End If 
        End If
    End If
End If

所有四个条件都必须为真。如果其中一个不是,其他的就不会被计算。

另一方面,你可以这样写它

代码语言:javascript
复制
If Len(Cells(x, 1)) > 0 And Cells(x, 1) <> 0 _
        And Len(Cells(x, 3)) > 0 And Cells(x, 3) <> 0 Then
    Rows(x).Delete
End If

..。不同之处在于,在后一种情况下(效率较低),所有四个条件都会被评估,即使第一个条件已经是假的。

相反,您可以使用相同的条件并执行以下操作(请注意Else):

代码语言:javascript
复制
If Len(Cells(x, 1)) > 0 And Cells(x, 1) <> 0 _
        And Len(Cells(x, 3)) > 0 And Cells(x, 3) <> 0 Then
    ' Do nothing
Else        
    Rows(x).Delete
End If

让我们使用Or重写相反的内容

代码语言:javascript
复制
If Len(Cells(x, 1)) = 0 Or Cells(x, 1) = 0 _
        Or Len(Cells(x, 3)) = 0 Or Cells(x, 3) = 0 Then
    Rows(x).Delete
End If

因此,类似于“相反的想法”,您可以像这样编写初始语句(注意Else):

代码语言:javascript
复制
If Len(Cells(x, 1)) = 0 Or Cells(x, 1) = 0 _
        Or Len(Cells(x, 3)) = 0 Or Cells(x, 3) = 0 Then
    ' Do nothing
Else
    Rows(x).Delete
End If

The Finale (相反)

使用Select Case语句,您可以编写相反的代码,如下所示:

代码语言:javascript
复制
Sub testSimple()
    Const lrow As Long = 1000
    Dim x As Long
    For x = lrow To 2 Step -1
        Select Case True
        Case Len(Cells(x, 1)) = 0, Cells(x, 1) = 0, _
                Len(Cells(x, 3)) = 0, Cells(x, 3) = 0
            Rows(x).Delete
        End Select
    Next x
End Sub

..。其中逗号表示“Or”,因此,如果任何表达式为真,则将删除这些行。

旧的(续):

使用 CombinedRange Function一次性删除

代码语言:javascript
复制
Sub test()
    Const lrow As Long = 1000
    Dim drg As Range
    Dim x As Long
    For x = 2 To lrow
        If Len(Cells(x, 1)) > 0 And Cells(x, 1) <> 0 Then
            If Len(Cells(x, 3)) > 0 And Cells(x, 3) <> 0 Then
                Set drg = CombinedRange(drg, Rows(x))
            End If
        End If
    Next x
    If Not drg Is Nothing Then
        drg.Delete
    End If
End Sub

使用 CombinedRange 功能一次删除改进的

代码语言:javascript
复制
Sub testImp()
    
    Const Cols As String = "A:C"
    Const fRow As Long = 2
    
    Dim rg As Range
    With Columns(Cols).Rows(fRow)
        Set rg = .Resize(.Worksheet.Rows.Count - .Row + 1) _
            .Find("*", , xlFormulas, , , xlPrevious)
        If rg Is Nothing Then Exit Sub
        Set rg = .Resize(rg.Row - .Row + 1)
    End With
    
    Dim drg As Range
    Dim rrg As Range
    For Each rrg In rg.Rows
        If Len(rrg.Cells(1)) > 0 And rrg.Cells(1) <> 0 Then
            If Len(rrg.Cells(3)) > 0 And rrg.Cells(3) <> 0 Then
                Set drg = CombinedRange(drg, rrg.EntireRow)
            End If
        End If
    Next rrg
    
    If Not drg Is Nothing Then
        drg.Delete
    End If

End Sub

CombinedRange Function

代码语言:javascript
复制
Function CombinedRange( _
    ByVal BuildRange As Range, _
    ByVal AddRange As Range) _
As Range
    If BuildRange Is Nothing Then
        Set CombinedRange = AddRange
    Else
        Set CombinedRange = Union(BuildRange, AddRange)
    End If
End Function
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67052187

复制
相关文章

相似问题

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