it-swarm.com.de

Löschen Sie eine Zeile in Excel VBA

Ich habe diesen Code, der die Excel-Zeile eines Elements aus einer Liste findet und die Elemente aus einer Liste löscht. Was ich möchte, ist, die Excel-Zeile ebenfalls zu löschen.

Der Code ist hier

Private Sub imperecheaza_Click()
Dim ws As Worksheet
Dim Rand As Long
Set ws = Worksheets("BD_IR")    
Rand = 3
Do While ws.Cells(Rand, 4).Value <> "" And Rand < 65000
   If ws.Cells(Rand, 4).Value = gksluri.Value * 1 And ws.Cells(Rand, 5).Value = gksluri.List(gksluri.ListIndex, 1) * 1 Then
            ws.Range(Rand, 1).EntireRow.Delete '(here I want to delete the entire row that meets the criteria from the If statement)
            gksluri.RemoveItem gksluri.ListIndex
            Exit Do
    End If
Rand = Rand + 1
Loop
End Sub

Wo ich ws.Range hinzugefügt habe (Rand, 1) .EntireRow.Delete ist, wo ich die gesamte Zeile löschen möchte, aber ich weiß nicht, wie ich das machen soll. Was ich möchte ... wenn in einer Zelle derselbe Wert wie in einem ausgewählten Element meiner Liste gefunden wird, um sowohl die gesamte Zeile in Excel als auch das Element aus dem Listenfeld entfernen zu können. Es funktioniert, um das Element aus dem Listenfeld zu entfernen, aber ich weiß auch nicht, wie man die Zeile entfernt

35
Andrei Ion

Die Lösung von Chris Nielsen ist einfach und funktioniert gut. Eine etwas kürzere Option wäre ...

ws.Rows(Rand).Delete

Beachten Sie, dass beim Löschen einer Zeile keine Verschiebung angegeben werden muss, da per Definition keine Verschiebung nach links möglich ist

Meine bevorzugte Methode zum Löschen von Zeilen ist übrigens die Verwendung von ...

ws.Rows(Rand) = ""

... in der Anfangsschleife. Ich verwende dann eine Sortierfunktion, um diese Zeilen an den unteren Rand der Daten zu verschieben. Der Hauptgrund dafür ist, dass das Löschen einzelner Zeilen eine sehr langsame Prozedur sein kann (wenn Sie> 100 löschen). Es stellt auch sicher, dass nach Robert Ilbrinks Kommentar nichts übersehen wird

Sie können den Code zum Sortieren lernen, indem Sie ein Makro aufzeichnen und den Code reduzieren, wie in diesem Experten-Excel-Video gezeigt. Ich habe den Verdacht, dass die sauberste Methode (Range ("A1: Z10"). Sort Key1: = Range ("A1"), Order1: = xlSortAscending/Descending, Header: = xlYes/No) 2007-Versionen von Excel ... Sie können jedoch den äquivalenten Code 2007/2010 immer reduzieren

Weitere Punkte verbinden ... Wenn Ihre Liste noch nicht nach einer Spalte sortiert ist und Sie die Reihenfolge beibehalten möchten, können Sie die Zeilennummer 'Rand' in einer freien Spalte rechts von jeder Zeile anbringen, während Sie durchlaufen. Sie würden dann nach diesem Kommentar sortieren und ihn entfernen

Wenn Ihre Datenzeilen Formatierungen enthalten, möchten Sie möglicherweise das Ende des neuen Datenbereichs ermitteln und die zuvor gelöschten Zeilen löschen. Das ist, um die Dateigröße gering zu halten. Beachten Sie, dass ein einzelnes großes Löschen am Ende des Vorgangs die Leistung Ihres Codes nicht auf dieselbe Weise beeinträchtigt wie das Löschen einzelner Zeilen

54
Ed Bolton

Besser noch, verwenden Sie union, um alle Zeilen zu packen, die Sie löschen möchten, und löschen Sie sie alle auf einmal. Die Zeilen müssen nicht kontinuierlich sein.

dim rng as range
dim rDel as range

for each rng in {the range you're searching}
   if {Conditions to be met} = true then
      if not rng is nothing then
         set rDel = union(rng,rDel)
      else
         set rDel = rng
      end if
   end if
 next

 rDel.entirerow.delete

Auf diese Weise müssen Sie sich keine Sorgen um das Sortieren machen oder Dinge, die sich unten befinden.

4
Jordan D. Karim

Ändern Sie Ihre Zeile

ws.Range(Rand, 1).EntireRow.Delete

zu 

ws.Cells(Rand, 1).EntireRow.Delete 
3
chris neilsen

So etwas wird es tun:

Rows("12:12").Select
Selection.Delete

In Ihrem Code würde es ungefähr so ​​aussehen:

Rows(CStr(Rand) & ":" & CStr(Rand)).Select
Selection.Delete
0
Matt Wilko