Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1576to1580
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Zahlenblockabfrage in Spalte ausführen

Zahlenblockabfrage in Spalte ausführen
07.09.2017 10:54:48
Frank
Liebe Excel-Gemeinde,
ich bin auf dem Gebiet der VBA noch ein Neuling und habe folgendes Problem. Ich möchte gerne realisieren, dass die Spalte C in dem Tabellenblatt2 überprüft wird.
Im Tabelleblatt1 werden vier Ziffern eingegeben. Anhand dieses „Viererblocks“ wird die Spalte C im Tabellblatt2 überprüft.
Sollte es nun zur einer Abweichung kommen, wie im Screenshoot ab Zeile 129 (es müsste 2222 drin stehen), so soll die Zeile 128 so lange gelöscht werden, bis der nächste vollständige „Viererblock“ wieder in Zeile 128 steht. (Dieser würde im Screenshoot ab Zeile 131 beginnen)
Ein weiteres Beispiel wäre: in der Zeile 143 müsste 1111 stehen, also müsste wieder die Zeile 143 so lange gelöscht werden, bis der nächste vollständige „Viererblock“ wieder in Zeile 143 steht. (Dieser beginnt in Zeile 146) usw.
Userbild
Das sollte bis zur letzten beschriebenen Zeile vollzogen werden.
Das "Grundgerüst" des Codes hätte ich so gestaltet.

Sub kontrolle()
Dim i As Long
Dim Zeilemax As Long
Dim ziffera As Long
Dim zifferb As Long
Dim zifferc As Long
Dim ziffere As Long
Dim wksEingabe As Worksheet
Dim wksAusgabe As Worksheet
Set wksEingabe = ActiveWorkbook.Worksheets("Tabelle1")
Set wksAusgabe = ActiveWorkbook.Worksheets("Tabelle2")
ziffera = wksEingabe.Range("B7")
zifferb = wksEingabe.Range("D7")
zifferc = wksEingabe.Range("F7")
zifferd = wksEingabe.Range("H7")
Zeilemax = wksAusgabe.UsedRange.Rows.Count
For i = 1 To Zeilemax Step 4
If wksAusgabe.Cells(i, 3)  ziffera And _
wksAusgabe.Cells(i + 1, 3)  zifferb And _
wksAusgabe.Cells(i + 2, 3)  zifferb And _
wksAusgabe.Cells(i + 3, 3)  zifferb Then
wksAusgabe.Rows(i).Delete
wksAusgabe.Rows(i + 1).Delete
wksAusgabe.Rows(i + 2).Delete
wksAusgabe.Rows(i + 3).Delete
End If
Next i
Set wksEingabe = Nothing
Set wksAusgabe = Nothing
End Sub

Der Code funktioniert aber nicht.
Die Datei ist auch zum Download mit bei.
https://www.herber.de/bbs/user/116074.xlsm
Ich hoffe, ich konnte das Problem verständlich erklären und bin auf eure Lösungen gespannt.
Vielen Dank.

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zahlenblockabfrage in Spalte ausführen
07.09.2017 12:54:02
ChrisL
Hi Frank
"Mod" könnte helfen...
Teste mal...
Sub t()
Dim arEingabe(3) As Variant
Dim lngZeile As Long
With Worksheets("Tabelle1")
arEingabe(0) = .Range("B7")
arEingabe(1) = .Range("D7")
arEingabe(2) = .Range("F7")
arEingabe(3) = .Range("H7")
End With
Application.ScreenUpdating = False
With Worksheets("Tabelle2")
For lngZeile = 1 To .Cells(Rows.Count, 1).End(xlUp).Row
Do Until .Cells(lngZeile, 3) = arEingabe((lngZeile + 3) Mod 4)
If .Cells(lngZeile, 3) = "" Then Exit Do
.Rows(lngZeile).Delete
Loop
Next lngZeile
End With
End Sub
cu
Chris
Anzeige
AW: Zahlenblockabfrage in Spalte ausführen
07.09.2017 13:59:07
Frank
Hallo Chris,
danke für deine Mühen, aber der Code funktioniert nicht richtig. Wie auf dem Sreenshoot in der Problembeschreibung zu erkennen ist, ist der "Viererblock" ab Zeile 128 Fehlerhaft.
Der nächste "komplette Block beginnt ab Zeile 131.
Also hätten in diesem Beispiel Zeile 128,129 und 130 gelöscht werden müssen.
Nach Ausführen deines Codes passiert Folgendes:
Userbild
Der Fehlerblock beginnt Ab Zeile 125, was nicht weiter schlimm ist (zu erkennen an dem Datum und der Uhrzeit), weil vorher schon ein "folge Fehler" aufgetreten ist und entsprechend Zeilen gelöscht wurden.
Der erste vollständige Block im Screenshoot in der Fehlerbeschreibung beginnt dann wieder ab Zeile 131 mit der Uhrzeit 07:01:25, diese wurde nach dem Ausführen deines Codes gelöscht und folglich wäre der Block fehlerhaft.
Obwohl es rein optisch (laut der Farben) richtig erscheint...
Gruß Frank
Anzeige
AW: Zahlenblockabfrage in Spalte ausführen
07.09.2017 14:43:02
ChrisL
Hi Frank
OK, jetzt verstehe ich wie du es meinst.
Teste mal...
Sub kontrolle()
Dim i As Long
Dim Zeilemax As Long
Dim ziffera As Long
Dim zifferb As Long
Dim zifferc As Long
Dim ziffere As Long
Dim wksEingabe As Worksheet
Dim wksAusgabe As Worksheet
Set wksEingabe = ActiveWorkbook.Worksheets("Tabelle1")
Set wksAusgabe = ActiveWorkbook.Worksheets("Tabelle2")
With wksEingabe
ziffera = .Range("B7")
zifferb = .Range("D7")
zifferc = .Range("F7")
zifferd = .Range("H7")
End With
Application.ScreenUpdating = False
With wksAusgabe
Zeilemax = .UsedRange.Rows.Count
For i = 1 To Zeilemax Step 4
Do Until .Cells(i, 3) = ziffera And _
.Cells(i + 1, 3) = zifferb And _
.Cells(i + 2, 3) = zifferc And _
.Cells(i + 3, 3) = zifferd
.Rows(i).Delete
Do Until .Cells(i, 3) = ziffera
If .Cells(i, 3) = "" Then Exit Sub
.Rows(i).Delete
Loop
Loop
Next i
End With
Set wksEingabe = Nothing
Set wksAusgabe = Nothing
End Sub

cu
Chris
Anzeige
AW: Zahlenblockabfrage in Spalte ausführen
07.09.2017 15:32:32
Frank
Hallo nochmal,
wunderbar, es klappt einwandfrei, vielen vielen Dank.
Ich hatte es auch noch mit "einer Schleife in der Schleife" probiert, aber das Makro hatte sich scheinbar in einer Endlosschleife aufgehangen.
Könntest du mir bitte noch diese Zeilen erklären, ich will ja nicht dumm sterben...
Do Until .Cells(i, 3) = ziffera
If .Cells(i, 3) = "" Then Exit Sub
.Rows(i).Delete
Loop
Loop
- Also er löscht die Zeilen solange, bis wieder ziffera am Anfang des "Viererblocks" steht und wenn Cells(i, 3) leer ist, springt er aus dem Sub ?
Cells(i, 3) ist doch niemals leer oder? Ist das irgendwie nur ein Vorwand? Warum zweimal "Loop"?
Ansonsten, vielen Dank nochmals.....
Gruß Frank
Anzeige
AW: Zahlenblockabfrage in Spalte ausführen
07.09.2017 15:48:15
ChrisL
Hi Frank
Weil wenn du Zeilen löschst, dann stimmt die Zeilemax nicht mehr und du kommst in einen Endlos-Loop weil du keinen 4er Block mehr findest. So gesehen hätte ich die For-Next-Schleife auch durch ein Do-Loop ersetzen können und einfach wenn leer raus springen.
Der erste Loop ist für die Bedingung ob du einen vollständigen 4er Block hast. Der zweite Loop zum Löschen bis wieder 1111 kommt.
cu
Chris
AW: Zahlenblockabfrage in Spalte ausführen
07.09.2017 17:20:04
ChrisL
Hi Frank
Ein kleiner Pfusch von mir:
Set wksEingabe = Nothing
Set wksAusgabe = Nothing
Die zwei Zeilen braucht es nicht zwingend (ich bin jeweils zu faul dafür), aber absolut korrekt wenn du es machst.
Nur verlassen wir die Schleife mit Exit Sub (auch nicht ganz die feine Art), darum müsstest du das entleeren der Objektvariablen vor dem Exit machen.
If .Cells(i, 3) = "" Then
Set wksEingabe = Nothing
Set wksAusgabe = Nothing
Exit Sub
End If
Wenn nichts gelöscht wird, dann landest du aber nie im vorzeitigen Exit, darum braucht es die Zeilen zwei mal.
Um ganz sauber zu sein müsste man den Code neu strukturieren, aber wegen zwei doppelten Codezeilen lohnt es sich nicht. Scheint mir aber ein gutes Beispiel, warum solche Exits problematisch sein können. ;)
cu
Chris
Anzeige
AW: Zahlenblockabfrage in Spalte ausführen
08.09.2017 08:30:27
Frank
Hallo Chris,
ahh Okay, vielen Dank nochmals, dass du dir die Zeit genommen hast.
Ich wünsche ein entspanntes Wochenende.
Gruß Frank.

313 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige