PDA

Vollständige Version anzeigen : Zeile löschen nur wenn keine Werte


jule18
21.02.2008, 05:36
Hallo Zusammen,

stehe wieder vor eine Herausforderung, habe eine Tabelle die in der Spalte F "Order No." beinhaltet.

Ich möchte gerne einen Makro erstellen, das mir alle doppelte (o. mehrere) Order No. gelöscht werden.

Es darf nur die Order No. gelöscht werden (gesamte Zeile), die keine Wert (Text oder Zahl) in der "Spalte A", "Spalte B", "Spalte C", "Spalte D" oder "Spalte E" haben.

Sprich sobald eine Order No. doppelt erscheint und in der Spalte A bis Spalte E keine Werte beinhalte soll mir die gesamte Zeile gelöschte werden.

Ich hoffe ihr wisst was ich meine.

Auf Unterstützung und Hilfe bedanke ich mich Voraus.

Gruss

jule :)

jinx
21.02.2008, 06:50
<font size="2" face="Century Gothic">Moin, jule,

in einer Schleife von unten nach oben prüfen, ob die Anzahl2 im Bereich von Spalte A bis Spalte E vorhanden ist, wenn nicht, dann löschen:

Sub jule()
Dim lngCounter As Long, lngLastRow As Long
lngLastRow = Cells(Rows.Count, 6).End(xlUp).Row
Application.ScreenUpdating = False
For lngCounter = lngLastRow To 2 Step -1
If WorksheetFunction.CountA(Range(Cells(lngCounter, 1).Address, Cells(lngCounter, 5).Address)) = 0 Then
Rows(lngCounter).Delete
End If
Next lngCounter
Application.ScreenUpdating = True
End Sub</font>

jule18
21.02.2008, 09:01
Ciao jinx,

vielen dank für die Hilfe, habe diesen Code in der Tabelle 1 eingefügt und ausgeführt.

Irgendwie braucht er ewig zu Rechnen nach 10 min habe ich die Prozedur abgebrochen.

Kann es sein das es zuviele Beiträge es sind!

Wie kann ich vorgehen das es funktioniert?

Vielen Dank im Voraus

Gruss

Jule:)

jinx
21.02.2008, 09:11
<font size="2" face="Century Gothic">Moin, Jule,

der Code gehört zwar in ein normales Modul, aber das dürfte auf die Laufzeit keine Auswirkungen haben. Ich vermute mal, Du musst neben der Bildschirmaktualisierung auch die automatsiche Berechnung ausschalten:

Sub jule2()
Dim lngCounter As Long, lngLastRow As Long
Dim lngCalc As Long

lngLastRow = Cells(Rows.Count, 6).End(xlUp).Row
With Application
.ScreenUpdating = False
lngCalc = .Calculation
.Calculation = xlCalculationManual
End With
For lngCounter = lngLastRow To 2 Step -1
If WorksheetFunction.CountA(Range(Cells(lngCounter, 1).Address, Cells(lngCounter, 5).Address)) = 0 Then
Rows(lngCounter).Delete
End If
Next lngCounter
With Application
.ScreenUpdating = True
.Calculation = lngCalc
End With
End Sub
Anmerkung: die Zellen sollten wirklich leer sein (auch keine formeln).</font>

jule18
21.02.2008, 12:35
hallo jinx,

danke für die schnelle Hilfe, es klappt wunderbar. Dauert ein bisschen aber hauptsache es klappt.

Eine bitte an dich habe ich, kannst du mir bitte den Code richtig dokumentieren welche Zeile was macht. So kann ich was lernen.

Vielen Dank im Voraus

Gruss

jule:)

jinx
21.02.2008, 16:54
<font size="2" face="Century Gothic">Moin, Jule,

grundlegend dabei ist eigentlich nur, dass man beim Löschen von Zeilen von unten nach oben arbeitet, da nur dann gewährleistet ist, dass man den Zeilenzähler nicht zu manipulieren braucht.

Beispiel für aufsteigende Werte des Zeilenzählers: Schleife läuft von 2 bis 4, Zeile 3 entspricht dem Kriterium und wird gelöscht, Zeile 4 wird zur neuen Zeile 3, der Zeilenzähler wird aber um 1 auf 4 erhöht und macht mit der neuen Zeile 4 (der vorherigen Zeile 5) weiter. Die neue Zeile 3 wird dann nicht überprüft. Und das umgeht man mit der negativen Schrittweise für den Zeilenzähler und dem Beginn in der letzten Zeile.

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Option</span> <span class="TOKEN">Explicit</span>
&nbsp;
<span class="TOKEN">Sub</span> jule2()
<span class="REM">'Dimensionierung der Variablen</span>
<span class="TOKEN">Dim</span> lngCounter <span class="TOKEN">As</span> Long, lngLastRow <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Dim</span> lngCalc <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
&nbsp;
<span class="REM">'Feststellen der letzten genutzten Zeile auf der aktiven Tabelle.</span>
<span class="REM">'Gestartet wird in der letzten Zelle der Spalte G nach oben</span>
lngLastRow = Cells(Rows.Count, 6).End(xlUp).Row
&nbsp;
<span class="TOKEN">With</span> Application
<span class="REM"> 'Ausschalten Bildschrimaktualisierung</span>
.ScreenUpdating = <span class="TOKEN">False</span>
<span class="REM"> 'Einlesen momentane Berechnung in Variable</span>
lngCalc = .Calculation
<span class="REM"> 'Setzen Berechnung auf manuell</span>
.Calculation = xlCalculationManual
<span class="TOKEN">End</span> <span class="TOKEN">With</span>
<span class="REM">' Schleife &uuml;ber den Datenbereich, beginnend mit der letzten Zeile</span>
<span class="REM">' und einer Schrittweise von -1 (sprich: von unten nach oben hinaufarbeiten)</span>
<span class="TOKEN">For</span> lngCounter = lngLastRow <span class="TOKEN">To</span> 2 <span class="TOKEN">Step</span> -1
<span class="REM"> 'Wenn die Funktion ANZAHL2 f&uuml;r den Bereich der Spalten A bis F der Zeile des Z&auml;hlers gleich Null ist, dann</span>
<span class="TOKEN">If</span> WorksheetFunction.CountA(Range(Cells(lngCounter, 1).Address, Cells(lngCounter, 5).Address)) = 0 <span class="TOKEN">Then</span>
<span class="REM"> 'l&ouml;sche die entsprechende Zeile</span>
Rows(lngCounter).Delete
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="REM">'n&auml;chste Zeile</span>
<span class="TOKEN">Next</span> lngCounter
<span class="REM">'Bildschrimaktualisierung an, Berechnung zur&uuml;ck</span>
<span class="TOKEN">With</span> Application
.ScreenUpdating = <span class="TOKEN">True</span>
.Calculation = lngCalc
<span class="TOKEN">End</span> <span class="TOKEN">With</span>
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)</font>

jule18
22.02.2008, 11:15
hallo jinx,

wollte mich noch mal herzlich bei dir bedanken, das mit dem Kommentaren fällt mir leichter zu verstehen was dieser Code macht.


Vielen Dank

gruss

jule:)