【问题标题】:Deleting rows in excel that contain a single letter in multiple cells across a row删除excel中包含一行中多个单元格中的单个字母的行
【发布时间】:2017-12-20 14:24:49
【问题描述】:

我想知道是否仅通过公式或快捷方式就可以解决此问题,或者是否需要使用 VBA。我正在使用的电子表格包含 112 行、31 列和 33 行,其中包含“Y”(Y = 正用于此报告的目的)。我正在尝试删除不包含单个“Y”的行(列 E-AA),因此只有在该行某处包含“Y”的行和人员姓名保留在电子表格中.我从其他人那里找到了一个 VBA 代码的 sn-p 代码,它产生了一些成功的结果,但没有将每一行都包含一个“Y”(我数了 33 行包含一个 Y,VBA 代码只显示了 14 行)。

我使用的代码:

Sub sbDelete_Rows_IF_Cell_Contains_String_Text_Value()
    Dim lRow As Long
    Dim iCntr As Long
    lRow = 112
    For iCntr = lRow To 1 Step -1
        If Cells(iCntr, 5).Value = "N" Then
            Rows(iCntr).Delete
        End If
    Next
    End Sub

上面的代码产生了这些结果:

在其单元格中包含“Y”或“N”的感兴趣的列是 E 到 AA 列。如果我不够清楚或需要进一步详细说明,请告诉我。

【问题讨论】:

  • 在您的循环中使用 COUNTIF 来计算 Y 的数量,如果等于 0,则删除该行。

标签: excel excel-formula vba


【解决方案1】:

这将完成手头的工作,尽管我确信它可以进一步优化:

Sub foo()
    Dim lRow As Long
    Dim iCntr As Long
    lRow = 112
    For iCntr = lRow To 1 Step -1
        For i = 5 To 27 Step 2
        If Cells(iCntr, i).Value = "N" Then
            Value = Value & " Delete"
        Else
            Value = Value & " Keep"
        End If
        Next i

        If Not InStr(Value, "Keep") > 0 Then
            Rows(iCntr).Delete
        End If
        Value = ""
    Next iCntr
End Sub

【讨论】:

  • @KyleC 能否将我的回复标记为答案?谢谢。
  • 确定我点击了复选框,所以如果它没有显示为已回答,请告诉我,再次感谢。
【解决方案2】:

使用公式、过滤和复制/粘贴来做到这一点:

将此公式添加到每一行:=COUNTIF($E2:$AA2,"Y")
这将单独计算包含单个 Y 的单元格。

在您的数据中添加过滤器并过滤以排除公式中的0

将过滤后的数据集复制并粘贴到新工作表中。然后,您可以清除原始数据并重新粘贴。如果您只执行一次,这很有用。

编辑:

在 VBA 中执行上述过程(但在原地执行删除而不是移动到第二张表):

Public Sub Test()

    Dim rDataRange As Range

    'Define range to look at.  NB:  This is a basic set-up.
    'Real scenario would allow user to make selection, or find the limits of the dataset with a FindLastCell function.
    Set rDataRange = ThisWorkbook.Worksheets("Sheet1").Range("E1:AA112")

    'This block will remove any autofilters that already exist, and then put a formula to the right of the dataset
    'to count the Y.
    With rDataRange
        .Parent.AutoFilterMode = False
        .Offset(1, .Columns.Count).Resize(.Rows.Count - 1, 1).FormulaR1C1 = "=COUNTIF(RC5:RC27,""Y"")"
    End With

    With rDataRange
        'This block filters the dataset to only show 0 in the formula.
        'The dataset is resized to include the formula.
        With .Resize(, .Columns.Count + 1)
            .AutoFilter Field:=rDataRange.Columns.Count + 1, Criteria1:="0"
            .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlVisible).EntireRow.Delete 'Resized again to exclude the header.
        End With

        'The formula and filter are removed.
        .Offset(1, .Columns.Count).Resize(.Rows.Count - 1, 1).ClearContents
        .Parent.AutoFilterMode = False
    End With

End Sub

【讨论】:

    猜你喜欢
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    相关资源
    最近更新 更多