Clever-Excel-Forum

Normale Version: VBA wenn Datei nicht vorhanden
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,
ich stoße gerade an meine Grenzen in VBA.
Ich lese aus einzelnen Dateien innerhalb einer Zählschleife drei einzelne Werte aus und schreibe diese in ein anderes Tabellenblatt.

Hierzu benutze ich folgenden Code, der fehlerfrei klappt:

For a = 2 To Range("i1")

    With oBlatt
        .Range("f" & a).FormulaLocal = "='X:\Ankdg\Plan\[" & Range("B" & a) & ".xlsm]plng'!$I$2"
        .Range("g" & a).FormulaLocal = "='X:\Ankdg\Plan\[" & Range("B" & a) & ".xlsm]plng'!$J$2"
        .Range("h" & a).FormulaLocal = "='X:\Ankdg\Plan\[" & Range("B" & a) & ".xlsm]plng'!$K$2"
    End With
   
Next a


In I1 steht die Zahl, wie oft die Schleife durchlaufen werden soll.

Es kommt jedoch vor, dass die Quelldatei (eine 6stellige Auftragsnummer), die in Spalte B steht, manchmal nicht gefunden werden kann.
Wie kann ich diesen Fehler überspringen, damit das Makro von alleine weiterläuft?

Gedanklich bin ich an einer Abfrage sinngemäß:

    If Dir("X:\Ankdg\Plan\" & Range("B" & a) & ".xlsm") <> "" Then a = a + 1 Else a = a + 2

weiß aber nicht wo ich die korrekt einbauen soll, bzw. ob die überhaupt so richtig und sinnvoll ist.

Weiß jemand einen Rat?

Vielen Dank vorab!

... btw: die Originaldatei hochzuladen macht wenig Sinn, weil diese mit vielen externen Quellen verknüpft ist.
Moin,

den Schleifenzähler solltest du nicht erhöhen. Mach doch einfach nix, wenn die Datei nicht da ist:
Code:
For i = 1 to 12
   If Dir("C:\Daten\" & i & ".xlsx") <>"" Then
      'Mach was
   End If
Next i

Viele Grüße
derHöpp
Danke, der Hinweis war gut. Hat mit einer kleinen Änderung funktioniert.
Anstelle von <> ""
habe ich = <> Then a = a+1
benutzt. Damit läuft das Makro ohne Unterbrechung.

18
Hallo noch einmal,

Zähle in Schleifen niemals die Zählvariable hoch! 

Zudem, wie willst du sicherstellen, dass die Folgedatei da ist?

Nutze wir gezeigt einen If-Block und keine Einzelzeile.

Viele Grüße
derHoepp
Hallöchen,

Zitat:Zähle in Schleifen niemals die Zählvariable hoch!

Oder, um es mit einem gewissen Herrn mit der fortlaufenden Nummer 007 zu sagen - Sag niemals nie ... (1983, Titel der Neuverfilmung von Feuerball 1965)
(29.10.2022, 08:40)schauan schrieb: [ -> ]Sag niemals nie ... (1983, Titel der Neuverfilmung von Feuerball 1965)

Moin,

nagut, ich relativiere: Zähle niemals in Schleifen die Zählvariable hoch, es sei denn du verhinderst damit, das Spectre zwei Atomsprengköpfe in seine Gewalt bringt :)

Zum Hintergrund:
Mit deiner Codeänderung sorgst du nur dafür, dass das Programm zufällig durchläuft, wenn die Datei mit dem Folgezähler auch da ist. Angenommen die Dateien 3 und 4 fehlen beide:
Code:
Sub test()

   Dim i As Long
   For i = 1 to 12 'die ersten zwei Schleifendurchläufe funktionieren problemlos, weil die Dateien da sind.
      If Dir("C:\Daten\Datei" & i & ".xlsx") = "" Then i = i + 1 ' Wenn Datei 3 nicht gefunden wurde...
      Cells(i,1).FormulaLocal = "='C:\Daten\[Datei" & i & ".xlsx]Tabelle1'!$I$2" '... wird hier versucht Datei 4 zu verlinken. Wenn die nicht da ist, hast du den Fehler nicht abgefangen.
   Next i
End Sub

Ich hoffe, mein Einwand ist verständlich.

Viele Grüße
derHöpp
Hallöchen,

es geht mir darum, Dogmen in Frage zu stellen. Oft sollen Anwender grundsätzlich von irgendwas abgehalten werden. Ein Online-Rubbellos mit einem scharfen Gegenstand am Monitor zu rubbeln würde ich natürlich auch ablehnen.
Frei nach dem Motto "Nichts ist unmöööglich" kann es durchaus angebracht sein, in einer Schleife den Schleifenzähler zu bein flussen Smile.

Hauptsache, man weiß als Ersteller oder Programmierer, was man tut, und denkt daran, dass der Anwender vielleicht Jahre damit leben muss - heißt, dass eine einfache Anwendung ggf. eine höhere Prio hat als eine einfache Erstellung oder Programmierung Smile Schön, wenn man beides verbinden kann und das Kosten-Nutzen-Verhältnis passabel ist.