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

Schleifen durchlauf Reihenfolge

Schleifen durchlauf Reihenfolge
29.05.2018 11:05:16
Ingo
Hallo,
ich hätte da mal eine Frage bezüglich der Reihenfolge der Durchläufe von Schleifen.
Anbei mein Code :

Sub Stunden_berechnen()
'Fehlerverwaltung
On Error Resume Next
'Neues Tabellenblatt
Dim v As String
Dim i As Integer
Dim z As Integer
Dim w As Integer
Dim wks As Worksheet
Dim blatt As String
Application.DisplayAlerts = False
blatt = "Auswertung"
For Each wks In ActiveWorkbook.Worksheets
If wks.Name = blatt Then
Sheets(blatt).Delete
End If
Next
Debug.Print ActiveSheet.Name
Sheets.Add Before:=Sheets(1)
ActiveSheet.Name = "Auswertung"
Application.DisplayAlerts = True
ActiveSheet.Select
Application.ScreenUpdating = False
For i = 1 To Sheets.Count
w = ActiveSheet.Index + 1
' Feiertagsspalte finden
Dim cell As CellFormat
Dim Feiertag As String
Dim WasFeiertag As String
Dim AdrGefFeiertag As String ' Spaltenbuchstabe
Dim SpaltenNrFeiertag As Integer ' Spaltennummer
Dim LetzteFeiertag As String ' Letzte Zeilennummer
Dim LetzteFeiertag1 As String ' Letzte Zeilennummer
Dim BeginnFeiertag1 As String
Dim AdresseFeiertag As Range 'Inhalt Feitagüberschrift /Adress als Adressangabe
Dim Bereich As String
WasFeiertag = "Feiertag 25%"
Set AdresseFeiertag = Cells.Find(WasFeiertag, lookat:=xlPart, LookIn:=xlFormulas)
AdrGefFeiertag = Left(AdresseFeiertag.Address(True, False), _
InStr(ActiveCell.Address(True, False), "$") - 1)
SpaltenNrFeiertag = Range(AdrGefFeiertag & 1).Column
LetzteFeiertag = Cells(Rows.Count, SpaltenNrFeiertag).End(xlUp).Row
LetzteFeiertag1 = Range(AdrGefFeiertag & LetzteFeiertag).Offset(-1, 0).Address
BeginnFeiertag1 = AdresseFeiertag.Offset(1, 0).Address
' Zellen runden im Bereich
Bereich = AdresseFeiertag.Address & " " & LetzteFeiertag1
Dim Zelle As Range
For Each AdresseFeiertag In Range(Bereich)
AdresseFeiertag.Offset(1, 0).Value = _
_
_
1 'Math.Round(Range(AdrGefFeiertag & z).Value, 0)
AdresseFeiertag = AdresseFeiertag. _
Offset(1, 0)
MsgBox AdresseFeiertag.Offset(1, 0).  _
_
_
Address
Next AdresseFeiertag
'Auswertentabelle mit Datenfüllen
Sheets(1).Range("A1").Value = "Dienstnummer  Name, Vorname"
Sheets(1).Range("C1").Value = "Sontagsstunden"
Sheets(1).Range("D1").Value = "Feiertagsstunden"
Sheets(1).Range("E1").Value = "Nachtstunden"
Sheets(1).Range("F1").Value = "Pausenstunden"
'Sheets(1).Range("B1").Value = "Monat"
'aaa1 = Mid(Range("E3"), 4, 2)
'Sheets(1).Range("B" & 0 + i).Value = Format(DateSerial(1, aaa1, 1), "MMMM")
Sheets(1).Range("A" & 0 + i).Value = ActiveWorkbook.ActiveSheet.Name
'Sheets(1).Range("C" & 0 + i).Value = Cells(LetzteSonntag, SpaltenNrSonntag).Value
Sheets(1).Range("D" & 0 + i).Value = Cells(LetzteFeiertag, SpaltenNrFeiertag).Value
'Sheets(1).Range("E" & 0 + i).Value = Cells(LetzteNacht, SpaltenNrNacht).Value
'Sheets(1).Range("F" & 0 + i).Value = Cells(LetztePause, SpaltenNrPause).Value
ActiveWorkbook.Worksheets(w).Activate
Next i
Sheets("Auswertung").Activate
Application.PrintCommunication = True
ActiveSheet.PageSetup.PrintArea = "R1C1:R75C6"
Cells.EntireColumn.AutoFit
MsgBox "Die Berechungen wurden durchgeführt!"
Application.ScreenUpdating = True
End Sub

Jetzt habe ich das Problem das die erste Zeile geändert wird und danach wir ins nächste Tabellenblatt gesprungen und die erste Zeile wird geändert und so fort.
Mein Wunsch ist es aber das der Bereich zuerst im ersten Tabellenblatt abgearbeitet wird. Dann ins nächste Tabellenblatt wechseln und wieder der Bereich abgearbeitet wir und so folgend.
Vielen Dank im Voraus für die Hilfe ; )

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Schleifen durchlauf Reihenfolge
29.05.2018 11:46:37
Daniel
Hi
baue deinen Code nochmal sauber strukturiert auf.
1. dh alle DIMs, kommen an den Anfang. Du dimensionierst die Variablen in der Schleife, dass ist kompletter Unfug
2. lösche die Auskommentierten Zeilen, wenn sie unnötig sind. für dich kannst du sie ja behalten, aber für diejenigen, die dir hier im Forum helfen sollen, ist es einfacher, wenn der Code möglichst kurz ist.
3. arbeite mit Einrückungen.
alles was zwischen FOR und dem dazu gehörigen NEXT steht, wird um eine TAB-Stufe nach rechts gerückt.
hast du mehrere For-Next-Schleifen ineinander geschachtelt, dann wird jede Schleife natürlich eine Stufe weiter eingerückt.
gleiches bei IF THEN - END IF, alles was zwischen diesen beiden Zeilen steht, geht eine Tabstufe nach rechts.
damit wird der Code viel übersichtlicher und du erkennst vielleicht selber, wo dein Fehler liegt.
und ganz wichtig:
schmeiß das On Error Resume Next raus. Das hat da nichts verloren.
Du willst ja wissen, wann und wo ein Fehler auftaucht, damit du den Code dann entsprechend korrigieren kannst.
Man kapselt zwar manchmal einzelne Codezeilen in das On Error Resume Next, weil der Fehler im Regulären Betrieb auftreten kann und anders nur sehr aufwendig zu vermeiden wäre, aber dann hebt man es sofort mit On Error Goto 0 wieder auf.
Für den kompletten Code ist das Unsinn.
mal ein Beispiel für eine sinnvolle Anwendung von On Error Resume Next:
diese Schleife um das Sheet "Auswertung" zu löschen, falls es vorhanden ist:
blatt = "Auswertung"
For Each wks In ActiveWorkbook.Worksheets
If wks.Name = blatt Then
Sheets(blatt).Delete
End If
Next
könnte man so vereinfachen:
On Error Resume Next
Sheets("Auswertung").Delete
On Error Goto 0

in diesem Fall ist das ok, denn er Fehler tritt auf, wenn das Blatt nicht vorhanden ist und das ist ja eigentlich genau das, was man erreichen will und kann daher mit dem nächsten Schritt weiter machen, wenn der Fehler auftritt.
Aber wie gesagt, man schaltet dann die Fehlerbehandlung nur für diese Zeile aus.
Gruß Daniel
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige