Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1524to1528
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

Probleme mit der Do und For Schleife ineinander

Probleme mit der Do und For Schleife ineinander
21.11.2016 09:05:35
Weber
Hallo VBA Experten,
ich habe aktuell folgendes Problem:
In der Spalte A, B und C befinden sich Zahlen und Texte,
sowie im Bild in der "Datei1" zu sehen sind.
Nun soll folgendes gemacht werden:
1) Prüfe ob in der Spalte A = 1
2) danach Prüfe ob in der Spalte C = Festwert und
3) wenn in der Spalte B nicht "Du nicht" und/oder "Du auch nicht" steht,
4) soll der Inhalt von der Spalte B kopiert werden.
5) Das Ergebnis wird "aufsummiert" oder "aufgesammelt" kopiert und
6) anschließend in der "Datei 2" Spalte A Zeile 1 zusammenhängend eingefügt.
Die Schleife geht weiter mit der Prüfung
1) ob in der Spalte A = 2... (Die restliche Prüfung 2) bis 5) folgt identisch)
6) Einfügen sollte dann immer eine Spalte weitergehen, so dass der kopierte Inhalte in der Schleife in der Spalte B Zeile 1 zusammenhängend eingefügt werden
Mein Problem:
So wie man im Bild sehen kann, prüft das Programm nur mit der i=1
sprich, ob in der Spalte A = 1 ist.
Beim Einfügen jedoch wird "i" weitergezählt, sowie gewünscht ist.
Wenn ich mit "F8" das Programm laufen lasse, sehe ich
dass die Schleife an der Stelle Next i nicht auf For i = 1 To 15 springt,
sondern auf For zz = 1 To 15...
Danke schon Mal für eure Hilfe!
Sub Test2()
Dim zz As Long
Dim sAdr As String
Dim i As Long
Application.ScreenUpdating = False 'Das "Flackern" ausstellen
Workbooks.Open Filename:="C:\Users\weber\Desktop\Datei2.xlsx"
Windows("Datei1.xlsm").Activate
Sheets("Test").Select
For i = 1 To 5
For zz = 1 To 15
x = i
If Cells(zz, 1) = x And _
Cells(zz, 3) = "Festwert" And _
Cells(zz, 2)  "Du nicht" And _
Cells(zz, 2)  "Du auch nicht Then
sAdr = sAdr & "; " & Cells(zz, 2)
End If
Next zz
Windows("Datei2.xlsx").Activate
Sheets("Tabelle1").Select
Cells(1, i) = Mid(sAdr, 3)
Next i
End Sub

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Probleme mit der Do und For Schleife ineinander
21.11.2016 09:07:10
Weber
Userbild
AW: Probleme mit der Do und For Schleife ineinander
21.11.2016 14:02:26
Werner
Hallo,
hab nur mal kurz drüber geschaut und da ist mir folgendes Aufgefallen:
1. sollte es Bei "Du nicht" bzw. "Du auch nicht" or heißen und nicht and
2. hattes du die schließenden Gänsefüßchen bei "Du auch nicht" nicht drin
For zz = 1 To 15
x = i
If Cells(zz, 1) = x And _
Cells(zz, 3) = "Festwert" And _
Cells(zz, 2)  "Du nicht" Or _
Cells(zz, 2)  "Du auch nicht" Then
sAdr = sAdr & "; " & Cells(zz, 2)
End If
Next zz
Gruß Werner
Anzeige
Dann sollten diese beiden Or-Verbundenen ...
21.11.2016 14:42:13
Luc:-?
…aber besser noch geklammert wdn, Werner (& Weber)!
Gruß, Luc :-?
Besser informiert mit …
AW: Probleme mit der Do und For Schleife ineinander
22.11.2016 09:03:48
Weber
Hallo Werner, hallo Luc,
Danke für den Hinweis. Aber die Schleife läuft trotzdem nicht richtig :/
Und was an dem Problem ist jetzt neu?...
21.11.2016 15:19:46
Michael
Weber?!
Mich wundert's nur, weil ich Dir im alten Faden genau für diese Anforderung Code geschrieben habe, den Du aufgrund "neuer Anforderungen" nicht nutzen konntest - und hier die selbe Anforderung beschreibst.
Nicht nur, dass das irgendwie meiner Zeit gegenüber etwas unverfroren ist, beschäftigst Du jetzt auch noch andere HelferInnen damit?
Ich bin ajF raus, falls für andere HelferInnen noch interessant, hier der "Originalfaden" mit einem Lösungsvorschlag (und Warnhinweisen!) von mir: https://www.herber.de/forum/archiv/1524to1528/t1525353.htm#1525353
LG
Michael
Anzeige
AW: Und was an dem Problem ist jetzt neu?...
22.11.2016 09:01:56
Weber
Hallo Michael,
zuerst tut es mir leid. Deine Hilfe und dein Code war super!
Die zu prüfende Spalte haben sich geändert und die Spalte für Kopie und
2 Bedingungen sind neu dazu gekommen.
Ich habe mit deinem Code versucht, habe aber nicht mehr durchblicken können und
bevor der Beitrag unzählig lang wird, habe ich einfacher gefunden neue Thema aufzumachen.
Ich wollte dich und deine Hilfe hiermit nicht noch Mal in Frage stellen.
Noch Mal vielen Dank für die Hilfe.
Okay, dann hier noch zwei andere Varianten...
22.11.2016 10:17:17
Michael
Weber,
... mit denen Du evtl. leichter zurechtkommst:
Variante A) entspricht am ehesten der von Dir gesuchten Vorgehensweise mit zwei Laufvariablen:
Sub a()
'Ausgangs-Arbeitsmappe = DIESE Arbeitsmappe (in der das Makro liegt)
Dim Wb As Workbook: Set Wb = ThisWorkbook
'Das Quell-Blatt bestimmen, hier Tabelle1, ggf. anpassen
Dim WsQ As Worksheet: Set WsQ = Wb.Worksheets("Tabelle1")
'Das Ziel-Blatt bestimmen, hier Tabelle2, ggf. anpassen
Dim WsZ As Worksheet: Set WsZ = Wb.Worksheets("Tabelle2")
'Zählvariablen und Text-Sammel-Variable deklarieren
Dim i As Long, j As Long, t As String
For i = 1 To 5 'Ziffern 1 - 5 in A:A
For j = 1 To 15 'Zeile 1 - 15
'Mit dem Quell-Blatt
With WsQ
If .Cells(j, 1) = i And _
.Cells(j, 3) = "Festwert" And _
.Cells(j, 2)  "Du nicht" And _
.Cells(j, 2)  "Du auch nicht" Then
t = t & .Cells(j, 2) & ";"
End If
End With
Next j 'Nächste Zeile
'Mit dem Ziel-Blatt
With WsZ
'In der nächsten freien Zelle der Zeile 1 den gesammelten
'Text eintragen (davon wird hinten ein Trennzeichen entfernt)
.Cells(1, .Columns.Count).End(xlToLeft).Offset(, 1) = _
Left(t, Len(t) - 1)
End With
'Die Text-Sammel-Variable leeren vor der nächsten PruefZiffer
t = vbNullString
Next i 'Nächste Ziffer in A:A
End Sub
Oder Variante B) die etwas flexibler ohne fixe Laufvariablen auskommt:
Sub b()
'Ausgangs-Arbeitsmappe = DIESE Arbeitsmappe (in der das Makro liegt)
Dim Wb As Workbook: Set Wb = ThisWorkbook
'Das Quell-Blatt bestimmen, hier Tabelle1, ggf. anpassen
Dim WsQ As Worksheet: Set WsQ = Wb.Worksheets("Tabelle1")
'Das Ziel-Blatt bestimmen, hier Tabelle2, ggf. anpassen
Dim WsZ As Worksheet: Set WsZ = Wb.Worksheets("Tabelle2")
'Die Liste und einzelne Zellen der Liste deklarieren
Dim Liste As Range, Eintrag As Range
'Sammlung an Prüfziffern aus Spalte A, Zähl-Variable und Text-Sammel-
'Variable deklarieren
Dim PruefZiffern, i As Long, t As String
'Sammlung an Ziffern, die in Spalte A geprüft werden, hier 1 bis 5
PruefZiffern = Array(1, 2, 3, 4, 5)
'Mit dem Quell-Blatt
With WsQ
'Den Bereich, der die zu kopierenden Zell-Texte enthält bestimmen
'Hier B1:Bx, wobei x gleich der letzten gefüllten Zelle in B:B entspricht
Set Liste = .Range(.Cells(1, 2), .Cells(.Rows.Count, 2).End(xlUp))
'Alle Elemente der o.a. PruefZiffern einzeln durchgehen...
For i = LBound(PruefZiffern) To UBound(PruefZiffern)
'Innerhalb jedes PruefZiffer-Durchlaufs
'jede Zelle der oben definierten Liste durchlaufen
For Each Eintrag In Liste
'Prüfungen:
'WENN die linke Zelle (Spalte A) die aktuelle PruefZiffer enthält
' UND wenn die rechte Zelle (Spalte C) "Festwert" enthält
'  UND wenn in der aktuellen Zelle der Liste weder "Du nicht" noch
'   "Du auch nicht steht"...
'DANN nimm den aktuellen Wert/Text der Zelle in eine Sammel-Variable auf
'zusammen mit einem Trennzeichen (hier ";")
If Eintrag.Offset(, -1) = PruefZiffern(i) And _
Eintrag.Offset(, 1) = "Festwert" And _
Eintrag  "Du nicht" And _
Eintrag  "Du auch nicht" Then
t = t & Eintrag & ";"
End If
Next Eintrag 'Nächste Zelle in der Liste (hier Spalte B)
'Mit dem Ziel-Blatt
With WsZ
'Die nächste freie Zelle bestimmen
'Hier die nächste freie Spalte in Zeile 1
'und den aktuellen Inhalt der Text-Sammel-Variablen dort eintragen
'Vom Text wird hinten ein Trennzeichen entfernt
.Cells(1, .Columns.Count).End(xlToLeft).Offset(, 1) = _
Left(t, Len(t) - 1)
End With
'Die Text-Sammel-Variable leeren vor der nächsten PruefZiffer
t = vbNullString
Next i
End With
End Sub
Habe Dir die Codes kommentiert, damit Du leichter nachvollziehen kannst, was da passiert. Kommst Du nun damit zurecht?
LG
Michael
Anzeige
AW: Okay, dann hier noch zwei andere Varianten...
22.11.2016 10:39:28
Weber
Hallo Michael,
vielen Dank noch mal, dass du mir weiter hilfst.
Beide Varianten habe ich ausprobiert und soweit läuft es ganz gut.
Nur die If Bedingung für "Du nicht" und "Du auch nicht" funktioniert noch nicht optimal.
Eines der beiden taucht trotzdem beim Einfügen auf.
Vermute, dass das Problem an "AND" liegt. Wenn ich das mit "OR" ersetzen, hilft es leider auch nicht..
AW: Okay, dann hier noch zwei andere Varianten...
22.11.2016 11:21:19
Werner
Hallo,
kann ich nicht nachvollziehen, der Code von Michael läuft (wie auch nicht anders zu erwarten).
Ich habe nur noch eine Abfrage eingebaut (If Not t = vbNullString Then), weil der Code sonst in einen Fehler läuft wenn t bei einem Schleifendurchlauf leer ist.
https://www.herber.de/bbs/user/109630.xlsm
Gruß Werner
Anzeige
Code stimmt! Ist gänzlich nicht nachvollziehbar...
22.11.2016 11:25:22
Michael
Weber,
...was Du damit treibst bzw. worauf Du ihn anwendest - denn bezogen auf die von Dir dargestellten Bsp-Szenarien stimmt das
Nur die If Bedingung für "Du nicht" und "Du auch nicht" funktioniert noch nicht optimal. Eines der beiden taucht trotzdem beim Einfügen auf.
bezogen auf meinen Code definitiv nicht.
Sorry, aber jetzt bin ich wirklich raus!
LG
Michael
AW: Code stimmt! Ist gänzlich nicht nachvollzi..
22.11.2016 12:21:30
Weber
Hallo Werner,
hallo Michael,
stimmt, mit dem Beispiel läuft das wirklich ohne Probleme und optimal!
Ich muss wohl in der Übersetzung in der richtigen Liste Fehler gemacht habe.
Sorry und vielen Dank noch Mal!
Anzeige

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige