Anzeige
Archiv - Navigation
556to560
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
556to560
556to560
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Knifflige For-Next-Schleife

Knifflige For-Next-Schleife
01.02.2005 15:31:51
Henri
Hallo Profis,
ich habe eine Frage zu einer For-Next-Schleife.
Ist es möglich das Ende variabel zu gestalten?
Ich laufe in meiner Schleife Zeilen nach unten und füge bei Bedarf eine Zeile ein. Daher soll natürlich auch das Ende der Schleife um eins erhöht werden.
Leider funktioniert das in meinem Code so nicht, da das Ende am Anfang mit:
for i = 1 to intEnd festgelegt wird und ich nicht mitten in der Schleife intEnd = intEnd +1 machen kann.
Hier mal mein Code.
Danke für die Hilfe
Henri

Sub Einfügen()
intEnd = Range(strQuelleLand & "65536").End(xlUp).Row
Application.ScreenUpdating = False
For i = intZeile To intEnd
With wksDaten.Cells(i, strQuelleLand)
If strVergleich = "" Then
strVergleich = .Value
Else
If .Value <> strVergleich Then
If .Value <> "" Then
.EntireRow.Insert
.Offset(-1, -1).FormulaR1C1 = "Gesamt (A/M/Z):"
.Offset(-1, -1).Font.Bold = True
.Offset(-1, 0).Formula = "=GETPIVOTDATA(Statistik!A2,""" & strVergleich & " A"") & """ & "/" & """ & GETPIVOTDATA(Statistik!A2,""" & strVergleich & " M"") & """ & "/" & """ & GETPIVOTDATA(Statistik!A2,""" & strVergleich & " Z"")"
.Offset(-1, 0).Font.Bold = True
i = i + 1
intEnd = intEnd + 1
strVergleich = .Text
Else
.Offset(0, -1).FormulaR1C1 = "Gesamt (A/M/Z):"
.Offset(0, -1).Font.Bold = True
.Formula = "=GETPIVOTDATA(Statistik!A2,""" & strVergleich & " A"") & """ & "/" & """ & GETPIVOTDATA(Statistik!A2,""" & strVergleich & " M"") & """ & "/" & """ & GETPIVOTDATA(Statistik!A2,""" & strVergleich & " Z"")"
.Font.Bold = True
i = i + 1
strVergleich = .Text
End If
Else
strVergleich = .Value
End If
End If
End With
Next i
End Sub

28
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Knifflige For-Next-Schleife
Galenzo
und wenn du rückwärts zählst ?
AW: Knifflige For-Next-Schleife
01.02.2005 15:41:37
Henri
Hi,
wie soll ich das denn anstellen?
Henri
For i = intEnd To intZeile Step -1 o.w.T.
Reinhard
AW: For i = intEnd To intZeile Step -1 o.w.T.
01.02.2005 15:59:48
Henri
OK, ist eine Möglichkeit, da muss ich aber bei allem Umdenken.
Die Offsets sind falsch und die Prüfung auf leere Zelle ist auch falsch.
Gibt es keine andere Möglichkeit?
Henri
AW: For i = intEnd To intZeile Step -1 o.w.T.
u_
Hallo,
die offsets bleiben, genauso wie die Prüfung auf leer.
du musst nur I=I-1 schreiben um die eingefügte Zeile zu ignorieren.
Gruß
AW: For i = intEnd To intZeile Step -1 o.w.T.
01.02.2005 16:12:20
Henri
OK, ist eine Möglichkeit, da muss ich aber bei allem Umdenken.
Die Offsets sind falsch und die Prüfung auf leere Zelle ist auch falsch.
Gibt es keine andere Möglichkeit?
Henri
Anzeige
AW: Knifflige For-Next-Schleife
Luc
Hallo Henri und Galenzo,
rückwärts ist nicht schwer, muss bloß "i=endwert to anfangswert step -1" heißen - kannst du aber lassen, weil es nichts nutzen würde. Die Werte für die Laufvariable wdn EINmalig im Kopf der Schleife festgelegt und dann kannst du in der Schleife ändern wie du willst, es nutzt nichts. Folge: du musst eine andere Schleife nehmen! Wenn For Each ...In... nicht klappt, mal Do While/Until... Loop While/Until (While/Until nur 1x entweder oben oder unten) probieren. Kann das jetzt nicht zuende denken, probiert's halt mal selber.
Gruß Luc
AW: Knifflige For-Next-Schleife
Reinhard
Hi Henri,
ungetestet, probiers mal so:

intEnd = Range(strQuelleLand & "65536").End(xlUp).Row
Application.ScreenUpdating = False
For n = intZeile To intEnd
i = i + 1
With wksDaten.Cells(i, strQuelleLand)
If strVergleich = "" Then
strVergleich = .Value
Else
If .Value <> strVergleich Then
If .Value <> "" Then
.EntireRow.Insert
.Offset(-1, -1).FormulaR1C1 = "Gesamt (A/M/Z):"
.Offset(-1, -1).Font.Bold = True
.Offset(-1, 0).Formula = "=GETPIVOTDATA(Statistik!A2,""" & strVergleich & " A"") & """ & "/" & """ & GETPIVOTDATA(Statistik!A2,""" & strVergleich & " M"") & """ & "/" & """ & GETPIVOTDATA(Statistik!A2,""" & strVergleich & " Z"")"
.Offset(-1, 0).Font.Bold = True
i = i + 1
strVergleich = .Text
Else
.Offset(0, -1).FormulaR1C1 = "Gesamt (A/M/Z):"
.Offset(0, -1).Font.Bold = True
.Formula = "=GETPIVOTDATA(Statistik!A2,""" & strVergleich & " A"") & """ & "/" & """ & GETPIVOTDATA(Statistik!A2,""" & strVergleich & " M"") & """ & "/" & """ & GETPIVOTDATA(Statistik!A2,""" & strVergleich & " Z"")"
.Font.Bold = True
i = i + 1
strVergleich = .Text
End If
Else
strVergleich = .Value
End If
End If
End With
Next n
Gruß
Reinhard
Anzeige
AW: Knifflige For-Next-Schleife
Luc
Lass es Henri,
Reinhard, die Erhöhung der Laufvariablen einer For...Next-Schleife funktioniert in keiner Programmiersprache. Schlimmstenfalls stürzt das Pgm ab.
Gruß Luc
AW: Knifflige For-Next-Schleife
01.02.2005 16:28:29
Henri
Hallo Luc,
wie jetzt, ich soll das alles vergessen weil es nicht geht oder Reinhards Beispiel nicht testen ?
Henri
AW: Knifflige For-Next-Schleife
Luc
auf die Schnelle Henri.
muss jetzt los - Erhöhung der LVar kann nicht fkt - probier ne Schleife ohne LVar!
Gr Luc
AW: Knifflige For-Next-Schleife
01.02.2005 16:26:53
Henri
Sorry Reinhard, so funktioniert das nicht.
Die Schleife läuft auch nur bis n 956 ist, aber die Endsumme ist dann 999.
Henri
AW: Knifflige For-Next-Schleife
Reinhard
Hi Henri,
deinen Gesamtcode musst du natürlich noch anpassen.
Mir ging es nur darum, dass die ganze Spalte abgearbeitet wird, siehe auch die beiden nachfolgenden Makros als Beispiel.
Gruß
Reinhard

Sub Grundeinstellung()
Range("A1:B30").ClearContents
Range("A1:B30").Interior.ColorIndex = xlNone
Range("A2") = "a"
Range("A6") = "a"
Range("A8") = "a"
Range("A9") = "a"
End Sub


Sub Einfügen()
letzte = Range("A65536").End(xlUp).Row
For n = 1 To letzte
pos = pos + 1
If Range("A" & pos) = "a" Then
Range("A" & pos).EntireRow.Insert
Range("A" & pos).Interior.ColorIndex = 35
pos = pos + 1
End If
Next n
End Sub

Anzeige
AW: Knifflige For-Next-Schleife
Luc
Salve Reinhard,
die Änderung des Bis-Wertes in einer For...Next-Schleife bewirkt nichts (höchstens Fehler)! Leg doch mal einen Haltepunkt auf For und setze dann die Abarbeitung fort! Das Pgm hält nicht noch mal an, d.h., der veränderte Wert wird nicht zur Kenntnis genommen! Eine Erhöhung der LfVar bewirkt nur ein schnelleres Erreichen des ursprüngl Bis-Wertes unter Auslassung von Zeilen!
Mach das gleiche mal mit einer While...Wend- oder Do...Loop-Schleife mit while/until-Bedingung! Da wird die Bedingung bei jedem Zyklus abgefragt. Da geht dann sowas.
n'Abend Luc
OT. AW: Knifflige For-Next-Schleife
Reinhard
Hallo Luc,
ich ändere doch nirgends den bis-Wert. zumindest nicht bewusst, und der Gesamtcode war mir zu lang zum korregieren.
Gruß
Reinhard
Anzeige
bis-Wert nicht, war aber vorher diskut word - owT
Luc
AW: Knifflige For-Next-Schleife
02.02.2005 08:35:07
Henri
Morgen,
ich probier es mal mit einer anderen Schleife.
Kann aber einen Moment dauern.
Ich melde mich wieder.
Henri
AW: Knifflige For-Next-Schleife
Luc
Morgen Henri,
war ich doch zu langsam?! Hoffentlich schaust du gleich noch mal rein. Habe dir nämlich letzte Nacht ein Bsp gebastelt (fkt!), an dem du dein Makro orientieren könntest:

Sub varZyk()
Dim i As Long, stZ As Range
With ActiveCell
Set stZ = Range(Cells(1, .Column), Cells(10, .Column + 1))
End With
i = 1
Do
Cells(i, stZ.Column).Select
With ActiveCell
Set stZ = Range(Cells(.Row, .Column), Cells(stZ.End(xlDown).Row, .Column))
If .Value <> 1 Then
i = i + 1
Cells(.Row + 1, .Column + 1).Value = ActiveCell.Value
Range(Cells(.Row + 1, .Column), Cells(stZ.End(xlDown).Row, .Column)).Cut
Cells(i + 1, stZ.Column).Select
ActiveSheet.Paste
Cells(i, stZ.Column).Value = "x"
End If
End With
i = i + 1
Loop Until i = stZ.End(xlDown).Row
End Sub

Hinweise zum Test: Du brauchst nur eine Spalte beliebiger Zeilenzahl mit Werten zu füllen (überwiegend 1 und einige andere, keine Leerfelder!) und ein Feld der Spalte markieren. Die Prozedur ermittelt dann den Gesamtbereich der Spalte und legt nach jedem Feld mit von 1 verschiedenem Wert eine neue Zeile an, die x in der Spalte und im Feld rechts daneben den von 1 verschiedenen Wert enthält. Die Zeile wird nicht direkt eingefügt, sondern alle Folgezeilen nach unten gerückt. Da das letzte Feld der Spalte nicht mitverarbeitet wdn kann, solltest du da Ende o.ä. reinschreiben. Ein Spaltenkopf ist nicht vorgesehen; die Spalte muss mit Zeile 1 beginnen.
Gut Test! Luc
PS: Mir ist beim Entwicklungstest xl mind 3x abgeschmiert.
Anzeige
@Luc, brauche doch Hilfe
02.02.2005 09:50:26
Henri
bei der alternativen Schleife mir fehlt der Ansatz.
Danke
Henri
na, ist das ein Timing?! - owT
Luc
AW: na, ist das ein Timing?! - owT
02.02.2005 11:14:10
Henri
Was meinst du mit Timing? Muss ich das verstehen?
War das jetzt ein JA ich überleg mir was oder ?
Mit @Luc, brauche doch Hilfe habe ich nur gemeint, dass ich im letzten Post versuchen wollte selbst eine(n) Lösung/Ansatz zu finden aber leider gescheitert bin.
Henri
Tschuldigung, wer lesen kann ...
02.02.2005 11:15:51
Henri
Hab dein Posting davor nicht gelesen, sorry.
Vergiss das letzte.
Henri
@Luc nochmal
02.02.2005 13:06:37
Henri
Hi,
hier https://www.herber.de/bbs/user/17335.xls habe ich mal meine Datei hochgeladen (ein paar Spalten habe ich gelöscht, aber die beiden relevanten sind drin).
Meine Vorgabe besteht darin, nach jedem Land die Daten A/M/Z auszuwerten.
Das heist nach jedem Land eine Leerzeile einfügen (wenn möglich variabel, also wenn schon eine vorhanden ist, dann keine mehr einfügen, habe ich schon eingebaut) und dort die Statistik aus der Pivottabelle rein. So will es mein Chef.
Da ich aber immer mehrere Tabellen bekomme mit den unterschiedlichsten Daten muss alles soweit variabel gehalten werden.
Ich habe mir dein Beispiel angeschaut, bin aber mit meinen begrenzten VBA Kenntnissen nicht zu einer Realisierung bzw. Anpassung an meine Vorgaben gekommen.
Vielleicht hilft dir meine Tabelle mit meinem komplettem Code um mir einen weiteren Vorschlag zu machen.
Vielen Dank für deine Hilfe.
Henri
Anzeige
AW: @Henri: mal sehen - evtl morgen owT
Luc
AW: Fortsetzung - Schleife läuft
Luc
Mahlzeit Henri,
komme erst jetzt dazu - 1 gute & 1 schlechte Nachricht!
1. neue Schleife funktioniert und nur Kopf und Fuß auszutauschen, dann läuft's so wie du wolltest,
2. du wirst noch viel Arbeit haben - die PivotTabÜbernahme klappt offensichtlich nicht. In deinen Algorithmen muss ein Denkfehler stecken, so dass nicht existente Pivotdaten angesprochen wdn (#BEZUG!). Wenn du dabei Hilfe brauchst, musst du mir die IF-Verzweigung unter Bezug auf die jeweils generierten Formeln und ihren Bezug erklären (aber möglichst einfach - prägnant/symbolisch).
Dann noch eine Empfehlung: Die Daten aus der Datenbank entweder ohne Endsumme (compute weglassen) ausgeben oder die 2 Zeilen bei der Abarbeitung in xl weglassen (auch in PivotTab) - sieht doof aus (Summe kann bei Bedarf auch xl bilden). Ins Pgm könntest du außerdem noch Spaltenformatierung einbauen für die "Gesamt"-Einschübe (ist das mit der 3.Spalte so beabsichtigt?). Ansonsten doch recht clever gemacht, da wundert's mich schon, dass du nur eine Schleifenart kennst! So, jetzt aber die Austauschzeilen:
Schleifenkopf:
statt `For i = intZeile To intEnd´ jetzt 2 Zeilen...
`i = intZeile´ und danach der neue Kopf `Do While i &lt intEnd - 1´
Schleifenfuß:
statt `Next i´ jetzt 2 Zeilen...
`i = i + 1´ und danach der neue Fuß `Loop´
Ja, und dann lief alles durch bis oberhalb Endsumme (hab ich hier schon korrigiert).
Übrigens habe ich eine neue Parametereingabe, bei der alle Angaben auf 1x in eine Inputbox eingegeben wdn) für das Pgm geschrieben. Diese wdn außerdem auf formale Richtigkeit geprüft. Falls' dich interessiert... sag's und du kannst es bekommen.
So, dann teste mal schön. Die Formelgenerierung ist aber auch tückisch mit ihren vielen verschachtelten "-Zeichen.
Gruß Luc
PS: Falls das alles vorzeitig im Archiv verschwinden sollte, such einfach nach Luc oder poste 'ne neue mail mit Luc im Betreff.
Anzeige
@Henri: was'n los - schon gefeuert? - owT
Luc
AW: @Henri: was'n los - schon gefeuert? - owT
03.02.2005 20:06:35
Henri
Hallo Luc,
sorry, bin heute schon 13Uhr von Arbeit wech. Meine Freundin hat einen Zahn gezogen bekommen und ich musste dringend (500km) nach Hause fahren. Ich komme erst wahrscheinlich Dienstag zum testen, weil Rosenmontag in Köln gefeiert wird und ich da Urlaub nehmen muss.
Tausen Dank für deine Mühe, ich melde mich.
Henri
OK - Mitgefühl !!! bis dann - owT
Luc

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige