Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Bedingung innerhalb einer "Do While"-Schleife

Bedingung innerhalb einer "Do While"-Schleife
w.k.schmidt@gmx.de
Hallo, Forum,
ich möchte gerne zum Jahreswechsel meine Mitabeitertabellen mit einem Makro bearbeiten. Hierfür gebe ich ein das betreffende Verzeichnis an, in dem sich aber auch die Konsolidierungstabelle befindet. Es gelingt mir mit meinem Modul nicht, alle Tabellen im Verzeichnis ohne die Konsolidierungstabelle zu bearbeiten. Wahrscheinlich ein Klacks für die Profis, ich bekomme bei dem unten stehenden Code den Laufzeitfehler 9, Index ausserhalb des gültigen Bereichs
.

Sub OpenWkb()
Dim sFile As String, sPath As String
Application.ScreenUpdating = False
sPath = InputBox( _
prompt:="Pfad:", Default:="c:\eigene dateien")
If Right(sPath, 1)  "/" Then
sPath = sPath & "\"
End If
sFile = Dir(sPath & "*.xls")
Do While sFile  ""
If Not Workbooks(sFile).Name = "Konsolidierung_Mitarbeiter.xls" Then _
Workbooks.Open sPath & sFile
Application.Run "VBATestmappe.xlsm!NeuesJahr"
ActiveWorkbook.Close savechanges:=True
sFile = Dir()
Loop
Application.ScreenUpdating = True
End Sub

Für Hilfe wäre ich sehr dankbar!
Freundliche Grüße
Matthias

  • Anzeige
    AW: Bedingung innerhalb einer "Do While"-Schleife
    05.01.2011 23:48:56
    Gerd
    Hallo Matthias,
    mit Workbooks("xyz").Name kannst Du eine Datei ansprechen, die bereits geöffnet ist.
    Versuche es mit
    If sFile "Konsoliderung_Mitarbeiter.xls" Then
    Gruß Gerd
    ...Besser wäre wohl 1 vollständiges If...Then...
    06.01.2011 00:34:11
    Luc:-?
    …Else-Konstrukt, Gerd & Matthias
    
    If Not Workbooks(sFile).Name = "Konsolidierung_Mitarbeiter.xls" Then
    Workbooks.Open sPath & sFile
    Application.Run "VBATestmappe.xlsm!NeuesJahr"
    ActiveWorkbook.Close SaveChanges:=True
    sFile = Dir()
    End If
    
    innerhalb von Do While…Loop, das so auch ein While…Wend sein könnte. Ohne Notwendigkeit einer Abbruchbedingung reichte das. Das If-Konstrukt ist ja nur 'ne Auslassungs-, keine Abbruchbedingung. Allerdings setzt das voraus, dass sFile wenigstens eine Datei enthält. Komisch kommt's mir ohnehin vor — normalerweise benötigt man ja ein Konstrukt, dass eine Datei nach der anderen aufruft wie bspw For Each…Next. Passiert das hier? Ich weiß ja nicht…! Und dann noch sFile = Dir()
    Der Fehler deutet jedenfalls darauf hin, dass (irgendwann) keine Datei bereit gestellt wurde.
    Gruß Luc :-?
    Anzeige
    AW: If...Then...
    06.01.2011 00:44:56
    Gerd
    Hallo Luc,
    vollständige If .. then .. End If - Bedingung stimmt. Dies hatte ich übersehen.
    Dennoch kannst Du auf ein (noch) nicht geöffnetes Workbook nicht mit der Name-Eigenschaft zugreifen.
    Gruß Gerd
    Ja, da hast du recht! Wenigstens "Öffnen im...
    06.01.2011 14:25:53
    Luc:-?
    …Hintergrund", Gerd…
    Scheint mir recht ungeeignet zu sein, die Proz…
    Gruß Luc :-?
    Anzeige
    AW: Ja, da hast du recht! Wenigstens "Öffnen im...
    06.01.2011 16:40:31
    Josef

    Hallo Luc:-?,
    warum, die Prozedur läuft astrein, er hatte nur die Prüfung auf den Dateinamen falsch aufgezogen.

    Gruß Sepp

    Anzeige
    Na gut, kam mir merkwürdig vor, aber zZ...
    06.01.2011 17:06:32
    Luc:-?
    …beschäftigt mich Anderes, da bin ich bei so etwas nicht mehr ganz auf der Höhe… ;-)
    Gesundes Neues, Sepp!
    Gruß Luc :-?
    AW: Bedingung innerhalb einer "Do While"-Schleife
    06.01.2011 00:44:47
    Josef

    Hallo Matthias,
    wie Gerd schon richtig bemerkt hat, muss "Workboos(sFile).name" auf eine Fehler laufen, weil du diese Datei ja noch nicht geöffnet hast.
    Folgender Code sollte laufen.

    Sub OpenWkb()
      Dim objWb As Workbook
      Dim strFile As String, strPath As String
      
      On Error GoTo ErrExit
      
      Application.ScreenUpdating = False
      
      strPath = InputBox("Pfad:", Default:="c:\eigene dateien")
      
      strPath = IIf(Right(strPath, 1) = "\", strPath, strPath & "\")
      
      strFile = Dir(strPath & "*.xls")
      
      Do While strFile <> ""
        If strFile <> "Konsolidierung_Mitarbeiter.xls" Then
          Set objWb = Workbooks.Open(strPath & strFile)
          Application.Run "VBATestmappe.xlsm!NeuesJahr"
          objWb.Close True
        End If
        strFile = Dir
      Loop
      
      ErrExit:
      Application.ScreenUpdating = True
      Set objWb = Nothing
    End Sub
    Gruß Sepp

    Anzeige
    AW: Bedingung innerhalb einer "Do While"-Schleife
    06.01.2011 11:31:03
    Matthias
    Hallo, Luc:-?, Gerd und Sepp,
    erstmal ganz herzlichen Dank für Eure Antworten, das ging ja schneller als ich dachte! Nachdem Eure Antworten noch in der Nacht kamen, finde ich meine Annahme bestätigt, dass die Programmier-und Computerbegeisterten dazu verdammt sind, Nachts ihre Arbeit zu verrichten, um den häuslichen Frieden nicht zu gefährden, oder seid Ihr alles Nachteulen? ;-))
    @Sepp: ist die savechanges-angabe überflüssig, wenn man das Workbook der Variable objwb zuweist und dann schließt?
    @ Luc:-?: wenn die Konsolidierungstabelle aus dem Verzeichnis genommen wird, läufts ohne Probleme durch, nur ist die Tabelle mit Passwort geschütz, deswegen kam ein Laufzeitfehler auch dann, wenn ich die Bedingung mit Namensprüfung nach der Öffnen-Anweisung eingefügt habe. Ansonsten bin ich wie viele Amateure ein Copy and Past-Spezialist, wo leider sicherlich Fragmente von nicht benötigtem oder falschem Code übrig bleiben ( ich dachte, dass sFile = Dir() in Verbindung mit Loop die nächste Tabelle aufruft, habs noch nicht ohne probiert!)
    @ Gerd: danke, da hab ich wieder was dazugelernt mit dem Öffnen,des WBk und dann erst die Name-Eigenschaft zu verändern,
    ganz herzlichen Dank nochmal, ich werds gleich mal austesten und poste nochmal das Ergebnis!
    Erfolgreiches und gesundes Neues Jahr wünscht
    Matthias
    Anzeige
    AW: Bedingung innerhalb einer "Do While"-Schleife
    06.01.2011 11:51:06
    Josef

    Hallo Mtthias,
    eigentlich ist es überflüssig, aber ich setze diesen Parameter fast immer - sicher ist sicher.

    Gruß Sepp

    Anzeige
    AW: Bedingung innerhalb einer "Do While"-Schleife
    07.01.2011 10:59:07
    Matthias
    Hallo nochmal,
    Modul läuft jetzt wie zu erwarten reibunglos durch,
    allen Mitwirkenden nochmals vielen Dank!
    Freundliche Grüße
    Matthias
    ;

    Forumthreads zu verwandten Themen

    Anzeige
    Anzeige
    Anzeige
    Anzeige
    Anzeige

    Infobox / Tutorial

    Bedingung innerhalb einer "Do While"-Schleife in Excel VBA


    Schritt-für-Schritt-Anleitung

    1. Makro erstellen: Öffne Excel und drücke ALT + F11, um den VBA-Editor zu starten. Füge ein neues Modul hinzu.

    2. Code eingeben: Verwende den folgenden Code als Vorlage, um mehrere Excel-Dateien in einem Verzeichnis zu öffnen, während du eine bestimmte Datei ausschließt:

      Sub OpenWkb()
         Dim objWb As Workbook
         Dim strFile As String, strPath As String
      
         On Error GoTo ErrExit
         Application.ScreenUpdating = False
      
         strPath = InputBox("Pfad:", Default:="c:\eigene dateien")
         If Right(strPath, 1) <> "\" Then
             strPath = strPath & "\"
         End If
      
         strFile = Dir(strPath & "*.xls")
      
         Do While strFile <> ""
             If strFile <> "Konsolidierung_Mitarbeiter.xls" Then
                 Set objWb = Workbooks.Open(strPath & strFile)
                 Application.Run "VBATestmappe.xlsm!NeuesJahr"
                 objWb.Close True
             End If
             strFile = Dir
         Loop
      
      ErrExit:
         Application.ScreenUpdating = True
         Set objWb = Nothing
      End Sub
    3. Makro ausführen: Schließe den VBA-Editor, gehe zurück zu Excel und führe das Makro aus.


    Häufige Fehler und Lösungen

    • Laufzeitfehler 9 (Index außerhalb des gültigen Bereichs): Dieser Fehler tritt auf, wenn du versuchst, auf ein Workbook zuzugreifen, das nicht geöffnet ist. Stelle sicher, dass du die Datei mit Workbooks.Open öffnest, bevor du auf die Name-Eigenschaft zugreifst.

    • Falscher Dateiname: Achte darauf, dass der Name der auszuschließenden Datei korrekt geschrieben ist (z.B. Konsolidierung_Mitarbeiter.xls).


    Alternative Methoden

    • For Each Schleife: Anstelle einer Do While-Schleife kannst du eine For Each-Schleife verwenden, um alle Dateien in einem Verzeichnis zu durchlaufen. Dies kann einfacher sein und oft zu weniger Fehlern führen.

      Dim file As String
      file = Dir(strPath & "*.xls")
      For Each file In file
         If file <> "Konsolidierung_Mitarbeiter.xls" Then
             ' Code zum Öffnen und Bearbeiten
         End If
      Next file

    Praktische Beispiele

    Hier sind einige Szenarien, in denen die Do While-Schleife in Excel VBA nützlich sein kann:

    • Jahreswechsel-Makro: Automatisiere die Aktualisierung von Mitarbeiterdaten zum Jahreswechsel, indem du gezielt alle relevanten Dateien bearbeitest.

    • Berichtsgenerierung: Erstelle Berichte aus mehreren Excel-Dateien, indem du nur die benötigten Daten von den offenen Workbooks extrahierst.


    Tipps für Profis

    • Fehlerbehandlung: Verwende On Error Resume Next, um Fehler zu ignorieren, die beim Öffnen einer Datei auftreten können. Dies kann nützlich sein, wenn du mit einer großen Anzahl von Dateien arbeitest.

    • Vermeide zu viele If...Then-Bedingungen: Halte deinen Code sauber und strukturiert. Wenn du mehrere Bedingungen überprüfen musst, ziehe in Betracht, eine separate Funktion zu erstellen.


    FAQ: Häufige Fragen

    1. Was ist der Unterschied zwischen Do While und While...Wend?
    Do While prüft die Bedingung vor dem ersten Durchlauf, während While...Wend die Prüfung am Ende durchführt.

    2. Wie kann ich mehrere Bedingungen in einer Do While-Schleife überprüfen?
    Du kannst If ... And ... verwenden, um mehrere Bedingungen in einer Do While-Schleife zu kombinieren.

    3. Funktioniert dieser Code in Excel 2016?
    Ja, der bereitgestellte VBA-Code funktioniert in Excel 2016 sowie in nachfolgenden Versionen.

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Entdecke mehr
    Finde genau, was du suchst

    Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

    Suche nach den besten Antworten
    Unsere beliebtesten Threads

    Entdecke unsere meistgeklickten Beiträge in der Google Suche

    Top 100 Threads jetzt ansehen
    Anzeige