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

Schleife laeuft nur einmal

Schleife laeuft nur einmal
abu
Guten Morgen zusammen,
habe eine kleines Problem mit einer Scheife und hoffe Ihr koennt mir ein bissel helfen.
Zur Schleife: Blatt Daily soll ab Zeile 2, in Spalte C durchsucht werden und alle Zeilen die in C den gleichen Wert haben kopieren und ins Blatt DailyMail ab Zeile 2 eingefuegt und anschliessend geloescht werden.
Die Schleife laeuft einmal durch ohne Fehler aber beim 2 Durchlauf bleibt sie immer hier haengen:
Range(Cells(2, 1), Cells(iT, 6)).PasteSpecial xlPasteAll
Warum laeuft es einmal durch und beim 2mal nicht mehr. Was ist denn beim 2ten mal anders?
Hoffe ihr koennt mir helfen.
Beste Gruesse
abu
If WorkSheetExists("Daily") Then
Worksheets("Daily").Activate
With ActiveSheet
With Range("A1:F1")
.Copy
End With
End With
Sheets.Add.Name = "DailyMail"
Worksheets("DailyMail").Activate
With ActiveSheet
Range("A1:F1").PasteSpecial xlPasteAll
End With
Worksheets("Daily").Activate
Do While MailZeile 1
Worksheets("Daily").Activate
checker = Cells(2, 3).Value
iT = 2
Do While Cells(iT, 3) = checker
iT = iT + 1
Loop
iT = iT - 1
Range(Cells(2, 1), Cells(iT, 6)).Copy
Worksheets("DailyMail").Activate
With ActiveSheet
If MailZeile 1 Then
Rows("2:" & MailZeile).Delete
End If
.Cells(2, 1).Select
Range(Cells(2, 1), Cells(iT, 6)).PasteSpecial xlPasteAll
Cells.Select
Cells.EntireColumn.AutoFit
End With
Worksheets("Daily").Activate
Range(Cells(2, 1), Cells(iT, 6)).Delete Shift:=xlUp
Loop
End If
AW: Schleife laeuft nur einmal
25.10.2010 09:41:07
Hajo_Zi
Hallo,
ich habe es jetzt nicht getestet. Es fehlt aber ein Punkt vor Range.

AW: Schleife laeuft nur einmal
25.10.2010 10:19:59
Hajo_Zi
Hi,
bereinigt würde der Code so aussehen.
Sub Abu()
If WorkSheetExists("Daily") Then
Sheets.Add.Name = "DailyMail"
Worksheets("Daily").Range("A1:F1").Copy Worksheets("DailyMail").Range("A1:F1")
With Worksheets("Daily")
Do While MailZeile  1
checker = .Cells(2, 3).Value
iT = 2
Do While .Cells(iT, 3) = checker
iT = iT + 1
Loop
iT = iT - 1
.Range(.Cells(2, 1), .Cells(iT, 6)).Copy
With Worksheets("DailyMail")
If MailZeile  1 Then
.Rows("2:" & MailZeile).Delete
End If
.Range(.Cells(2, 1), .Cells(iT, 6)).PasteSpecial xlPasteAll
.Cells.EntireColumn.AutoFit
End With
.Range(.Cells(2, 1), .Cells(iT, 6)).Delete Shift:=xlUp
Loop
End With
End If
End Sub
Gruß Hajo
Anzeige
OT @Hajo
25.10.2010 10:32:02
hary
Hallo Hajo
Hast Du mal einen Tip fuer schleifen?
Mal liest man eine Loop Schleife mal For Schleife.
Hab schon geforscht aber was besser bzw. wann welche eingesetzt wird. Evtl. auch falscher Suchbegriff.
Gruss hary
AW: Schleife
25.10.2010 10:35:55
Hajo_Zi
Hallo Hary,
ich benutze meist For. Aber bei loop hast Du den Vorteil Du kannst die Ausgangsbedingung am Anfang oder am Ende schreiben. Ich benutze so was aber selten.

AW: Schleife
25.10.2010 10:39:33
hary
Hallo Hajo
Ich nehme auch For. Also kein Unterschied von wegen Geschwindigkeit, ist nur die schreibweise.
Ist das so richtig?
gruss und Danke
hary
Anzeige
AW: Schleife
25.10.2010 10:51:53
Hajo_Zi
Hallo harry,
also das vermute ich auch das es kein Unterschied bei der Geschwindigkeit gibt.

For ... Next ist schneller
25.10.2010 10:57:05
Tino
Hallo,
im Bezug auf Geschwindigkeit ist die For Next Schleife sehr wahrscheinlich schneller.
Bei dieser steht bereits am Anfang fest wie oft diese durchlaufen wird, diese Abfrage wird nicht wiederholt.
Wenn diese langsamer ist, liegt es an der Programmierung in der Schleife.
Gruß Tino
Dank euch fuer die Info gruss hary owT.
25.10.2010 11:01:55
hary
.
AW: For ... Next ist schneller
25.10.2010 12:46:20
MichaV
Hallo,
die Prüfung wird auch bei der FOR-Schleife bei jedem Durchlauf durchgeführt. Du könntest ja innerhalb der Schleife den Zähler beeinflussen.
for i=1 to 10
i=i-1
next i
..wird nicht nur 10x durchlaufen ;o)
Gruss- Micha
Anzeige
AW: For ... Next ist schneller
25.10.2010 12:57:29
Tino
Hallo,
ein Zähler ist keine Prüfung, der Zähler wird nur einmal initialisiert,
daher ist eine For Next viel schneller als eine andere Schleife.
Gruß Tino
AW: For ... Next ist schneller
25.10.2010 13:15:25
MichaV
wie kommst Du darauf?

Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Public lngTime As Long
Sub test()
Dim i As Long
Dim s As String
Debug.Print "--"
lngTime = GetTickCount
For i = 1 To 9999000
s = CStr(i)
Next i
Debug.Print (GetTickCount - lngTime)
i = 0
lngTime = GetTickCount
Do
s = CStr(i)
i = i + 1
Loop Until i = 9999000
Debug.Print (GetTickCount - lngTime)
End Sub
..ergibt bei mir bei mehreren Versuchen fast gleiche Laufzeiten.
Auch in einer For-Schleife muss 1 x addiert und 1 x geprüft werden. Auch wenns anders in der Wikipedia steht, die Anzahl der Durchläufe muss vorher nicht feststehen.
Gruss- Micha
Anzeige
bei mir leider nicht ;-)
25.10.2010 13:33:13
Tino
Hallo,
und wenn Du die Schleife noch größer machst wird der unterschied noch größer.
Ist ja auch logisch, die For Next wird einmal initialisiert und danach läuft diese einfach durch.
Bei der Do Loop wird immer wieder geprüft ob i = 9999000 ist (dies braucht Zeit),
dies wird bei einer String Prüfung noch deutlicher.
Gruß Tino
AW: bei mir leider nicht ;-)
25.10.2010 14:05:12
MichaV
Dann hast Du ein anderes System als ich. Oder nur 1x getestet, und nicht mehrere male.
Und nun nochmal langsam zum Mitschreiben: Auch bei FOR MUSS geprüft werden!!!
Oder meinst Du wirklich dass mein kleiner Beispielcode in meinem 1. Beitrag 10x durchlaufen wird, so wie es in der Zeile FOR i=1 to 10 initialisiert wird?
Gruss- Micha
PS: hier meine Testergebnisse. Kein deutlicher Unterschied. (aufg jeden Fall nicht "viel schneller") Getestet mit 99999000 Schleifenrunden.
--
18000
18297
--
17922
18297
--
17985
17859
Anzeige
AW: bei mir leider nicht ;-)
25.10.2010 22:51:11
Tino
Hallo,
was Du meinst läuft aber nicht mehr VBA intern, soweit ich weis wird die Programmierung über C++ gemacht und da wirst auch Du VBA Technisch mit Sicherheit von der Geschwindigkeit her nicht ran kommen.
Zweitens gehe mal eine For Next Schleife von Hand durch und danach die Loop Schleife und Du wirst den großen Unterschied merken.
Ein kleines Beispiel
Sub Bsp_For()
Dim nCount As Long, varSumme
Dim sngTimer
sngTimer = Timer
For nCount = 0 To 10 ^ 8
varSumme = varSumme + 1
Next nCount
Debug.Print Timer - sngTimer
End Sub
Sub Bsp_Loop()
Dim nCount As Long
Dim sngTimer
sngTimer = Timer
Do While nCount 
Obwohl ich in der For Schleife keine Summe bräuchte, habe ich diese mit eingebaut
damit beide etwas rechnen müssen, ist der Code um Welten schneller als die Loop Schleife.
Der Grund ist einfach weil diese Prüfung immer wieder durchlaufen wird und neu abgefragt wird.
In der For Schliefe kannst Du außerdem feststellen, dass die Initialisierung- 1. Zeile nur einmal am Anfang durchlaufen wird.
Viel Spaß beim nachdenken, Gute Nacht.
Gruß Tino
Anzeige
AW: bei mir leider nicht ;-)
25.10.2010 23:02:07
MichaV
Nabend,
da brauch ich nicht lange drüber nachdenken. Bei der For- Variante wird 10^8 ein mal berechnet und dann im Speicher abgelegt. Bei Deiner While-Loop- Variante wird das 10^8 mal berechnet. Darum ist das so viel langsamer. Es hat aber nichts damit zu tun ob die Bedingung bei jedem Durchlauf geprüft wird oder nicht.
Versuch das mal und sag mir welche Schleife bedeutend schneller ist:
Sub Bsp_For()
Dim nCount As Long, varSumme
Dim sngTimer
Dim X As Long
sngTimer = Timer
X = 10 ^ 8
For nCount = 0 To X
varSumme = varSumme + 1
Next nCount
Debug.Print Timer - sngTimer
End Sub

Sub Bsp_Loop()
Dim nCount As Long
Dim sngTimer
Dim X As Long
sngTimer = Timer
X = 10 ^ 8
Do
nCount = nCount + 1
Loop Until nCount = X
Debug.Print Timer - sngTimer
End Sub
Dir auch ne Gute Nacht.
Anzeige
fast 8 Sekunden Unterschied
25.10.2010 23:26:53
Tino
Userbild
nö, nich bei mir
26.10.2010 07:10:58
MichaV
Guten Morgen,
vergessen das Direktausgabefenster zu löschen? Oder wir müssen uns auf eine andere Testmethode einigen?
Userbild
Gruss- Micha
Excel97 Test
26.10.2010 08:18:17
hary
Hallo Tino / MichaV
Ist alles sehr informativ.
Hab mal bei mir unter '97 getestet, wobei mein Laptop schon in die Jahre gekommen ist.
1. Versuch For: 6,734375
2. Versuch For: 6,625
1. Versuch Loop: 65,29688
2. Versuch Loop: 53,32813
Gruss hary
Anzeige
AW: Excel97 Test
26.10.2010 08:36:29
MichaV
Hallo,
mir gehts ja nicht darum zu beweisen dass Do-Loop schneller ist als For. For ist eine spezielle Schleifenkonstrunktion (man kann damit nur zählen, also Zahlen vergleichen, keine Wahrheitswerte oder Strings usw.) und dadurch steckt dahinter eine andere, für diesen Zweck optimierte Programmierung und Speicherverwendung als bei Do-Loop. Mir geht es vorrangig darum zu unterstreichen dass auch bei For bei jedem Durchlauf die Bedingung geprüft wird. Egal ob Do-Loop oder For, die Bedingung wird bei jedem Durchlauf geprüft. Dass die Prüfung bei For mit einer anderen Geschwindigkeit abläuft als bei Do-Loop ist unbestritten. Aber es wird immer geprüft, auch wenn beim schrittweisen Debuggen mit F8 der gelbe Balken nur am Anfang auf der For- Zeile steht (die Prüfung findet tatsächlich erst beim "next" statt), denn sonst würde dieser Code hier nur 10x laufen:
for i=1 to 10
i=i-1
next i
..und das macht er nicht.
Gruss- Micha
Anzeige
AW:jepp
26.10.2010 09:20:37
hary
Hallo Micha
jetzt hab ich's.
Danke
gruss hary
AW: Schleife laeuft nur einmal
25.10.2010 11:34:03
abu
Hallo Hajo,
habe festgestellt das nach dem loeschen der Daten, also hier:
If MailZeile 1 Then
.Rows("2:" & MailZeile).Delete
End If
auch die Daten die kopiert wurden nicht mehr im Speicher sind. Wenn ich .Rows("2:" & MailZeile).Delete einfach direkt nach meine Aktion laufen lasse, kopiert er im naechsten Schleifendurchlauf auch wieder.
Danke fuer Deine Unterstuertzung und auch den bereinigten Code.
Gruss
Abu

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige