2017-12-20 3 views
0

Ich habe mich gefragt, ob es eine Lösung für diese nur durch eine Formel oder Verknüpfungen oder wenn ich etwas für VBA verwenden musste. Die Tabelle, mit der ich arbeite, enthält 112 Zeilen, 31 Spalten und 33 Zeilen mit einem "Y" (Y = positiv für den Zweck des Berichts, für den dieser verwendet wird). Ich versuche Zeilen zu löschen, die kein einziges "Y" enthalten (Spalten E-AA), so dass nur die Zeilen und Namen von Personen, die ein "Y" irgendwo in der Zeile enthalten, im Tabellenblatt verbleiben . Ich fand einen Ausschnitt aus VBA-Code von jemand anderem, der etwas erfolgreiche Ergebnisse hervorbrachte, aber nicht jede Zeile mit einem "Y" enthielt (ich zählte 33 Zeilen mit einem Y, der VBA-Code zeigte nur 14).Löschen von Zeilen in Excel, die einen einzelnen Buchstaben in mehreren Zellen in einer Zeile enthalten

enter image description here

Der Code I wurde unter Verwendung von:

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 

Der obige Code diese Ergebnisse erzeugt:

enter image description here

die Spalten von Interesse, die entweder einen "Y" oder " N "in ihren Zellen sind die Spalten E bis AA. Wenn ich nicht klar genug war oder weiter ins Detail gehen muss, lass es mich wissen.

+0

In der Schleife Verwendung COUNTIF die Anzahl zu zählen von Ys und löschen Sie die Zeile, wenn gleich Null ist. – SJR

Antwort

2

Dies würde die Arbeit an der Hand tun, obwohl ich sicher bin, es weiter optimiert werden:

diese Formel hinzufügen:

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 
+0

Xabier das hat wunderbar funktioniert! Vielen Dank! – KyleC

+0

@KyleC bitte könnten Sie meine Antwort als Antwort markieren? Vielen Dank. – Xabier

+0

sicher, dass ich das Kontrollkästchen traf, also wenn es nicht als beantwortet erscheint, lassen Sie mich wissen, Nochmals vielen Dank. – KyleC

1

Um es Formel, Filtern und Kopieren/Einfügen verwenden zu tun zu jeder Reihe: =COUNTIF($E2:$AA2,"Y")
Dies zählt die Zellen, die ein einzelnes Y enthalten.

Fügen Sie einen Filter über Ihre Daten und Filter hinzu, um 0 in der Formel auszuschließen.

Kopieren Sie den gefilterten Datensatz und fügen Sie ihn in ein neues Arbeitsblatt ein. Sie können dann die ursprünglichen Daten löschen und erneut einfügen. Nützlich, wenn Sie das nur einmal machen.

Edit:

das oben beschriebene Verfahren in VBA zu tun (aber die an Ort und Stelle löschen tun, anstatt Umzug in ein zweites Blatt):

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 
Verwandte Themen