Clever-Excel-Forum

Normale Version: VBA If-Abfrage, wenn die Datei im Pfad/Ordner nicht gefunden wird.
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo,
in Spalte A2 einer großen Datei steht ein Datennamen. Mittels  Makro wird  diese Datei über einen Pfad in einem Ordner aufgerufen und bearbeitet. Mittels Loop/Do – Schleife wird dann in der nächsten Zelle in Spalte A das gleiche wiederholt, bis kein Dateiname mehr vorhanden ist. Das ganze Makro funktioniert einwandfrei. Hier der letzte Teil vom Makro:
                                           
 ActiveCell.Offset(0, -6).Range("A1").Select 'gehe wieder zurück zu Spalte A in der großen Datei
 Idea
    ActiveCell.Offset(1, 0).Select   'gehe eine Zelle nach unten
        If ActiveCell = "" Then
        MsgBox "In dieser Zelle steht kein Dateiname. Daher Ende."
        Exit Sub 'Makro wird abgebrochen
    End If 'Makro wird weiter durchgeführt
        Workbooks.Open (ThisWorkbook.Path & "\" & ActiveCell.Offset(0, 0).Range("A1").Value)
‘mit einer If-Abfrage ergänzen)
   ThisWorkbook.Activate 'die große Datei
 Loop    'von hier wieder zum Anfang des Makros als Schleife mit "Do"
 End Sub
 
Leider kommt es manchmal vor, dass die gesuchte Datei im Ordner nicht vorhanden ist. Die daraus resultierende Fehlermeldung möchte ich mit einer Wenn-Abfrage – mit Schleife  - vermeiden, aber es gelingt mir nicht. Das Makro soll einfach in Spalte A den nächsten Dateinamen eine Zelle tiefer nehmen. Und wenn der auch fehlt, dann wieder den nächsten, also auch eine kleine Schleife.
Theoretisch so:
 
If      Workbooks.Open (ThisWorkbook.Path & "\" & ActiveCell.Offset(0, 0).Range("A1").Value) = “”
Then     gehe zurück bis zum Smily  (Code  „gehe eine Zelle nach unten“ )   
Else
End if
 
Wie lautet die richtige If-Abfrage mit Sprung Marken?
 
Ganz herzlichen Dank für eure Hilfe im Voraus
 
Jorg
Hallo,

wenn in

A2: meineXL.xlsx

steht dann könnte man die Existenz der Datei z.B. so prüfen:

Code:
sub Datei_vorhanden()
dim Pfad as string
Pfad = "c:\temp\" '<<< anpassen backslash am Ende >>>>
if dir(Pfad & cells(2,1)) <> "" then
'code für Datei vorhanden
end if
end sub

Noch ein paar Empfehlungen:

- Vermeide Activecell
- Referenziere ordendlich (set iWorkbook = Workbooks.Open(Pfad & Name)

mfg

(ungeprüft)
Hallo Fennek,

vielen Dank für deine Antwort. Ich komme noch nicht so ganz klar. Als VBA- Anfänger habe ich mich  wahrscheinlich  ungenau ausgedrückt. Ich habe ein funktionierendes Makro, das alle Dateinamen in der Spalte A nacheinander einzeln aufruft und einige Werte in die Start-Datei überträgt. Mit einer Schleife Loop - Do kommt der nächste Dateiname aus Spalte A dran. Das geht bei einigen Hundert Dateinamen ganz automatisch, bis eine Leerzelle in Spallte A das Ende mit einer MSG-Box mitteilt. 
Um die gesuchte  Datei ist finden, ist dieser funktionierende Code im Makro schon vorhanden:

   Workbooks.Open (ThisWorkbook.Path & "\" & ActiveCell.Offset(0, 0).Range("A1").Value) 'die nächste kleine Datei

Jetzt suche ich aber nicht die Existenz, sondern die Nicht-Existenz der Datei. Und wenn die gesuchte Datei nicht vorhanden ist, dann sollte das Makro einen Sprung zurück zu der folgenden Zeile machen: 

ActiveCell.Offset(1, 0).Select        'gehe eine Zelle nach unten

In der Wenn-Abfrage könnte das dann so heißen:

  If Workbooks.Open (ThisWorkbook.Path & "\" & ActiveCell.Offset(0, 0).Range("A1").Value)=""  Then  
Else  ??????? Sprung zurück zum vorhandenen Code   "gehe eine Zeile nach unten"  
 End If

Mir fehlt also nur der Code für "Sprung zurück zum vorhandenen Code "gehe eine Zeile nach unten"


Der Sprung zurück, um dann in Spalte A eine Zeile tiefer den nächsten Dateinamen zu versuchen, hat den Vorteil, wenn mehrere Dateinamen hintereinander nicht zu finden sind.
Und wenn die Datei gefunden ist dann müßte das Makro ganz normal weiter laufen.

Ich hoffe, daß es hierfür eine Lösung gibt.

Viele Grüße
Jorg





Jorg
Hallo,

das sollte reichen:

Code:
sub T_1()
dim WB as workbook
Pfad = "c:\temp\" '<<< anpassen >>>
for i = 1 to cells(rows.count, 1).end(xlup).row
if dir(Pfad & cells(i,1)) <> "" then 'wenn die Datei existiert
    set WB = workbooks.Open(Pfad & cells(i,1)
'hier der Code für das externe Workbook
    wb.close 1 ' schließen mit speichern; 0:= schließen ohne speichern
end if
next i
end sub

mfg

(ungeprüft)
Vielen Dank Fennek,

ich werde mich morgen an die Arbeit machen.

Jorg
Hallo Fennek,
 
Die gute Nachricht:
wenn das Makro die gesuchte Datei laut Pfad in dem Ordner nicht findet, dann springt das Makro zum Code
    End If   'die Schleife ist zu Ende
und versucht es in der „großen“ Datei in der Spalte A eine Zelle weiter unten mit dem nächsten Dateinamen solange, bis eine Zelle leer ist, und das Makro das auch mit einer Nachricht bekannt gibt. Soweit OK.
 
Die schlechte Nachricht:
In der Zeile

    If Dir(Pfad & Cells(i, 1)) <> "" Then   'wenn die Datei existiert, dann...

wird die Datei leider nicht gefunden  (obwohl sie im Ordner vom Pfad steht), und deshalb springt das Makro nach „End If“ (siehe oben).
 
Trotz aller Versuche komme ich nicht drauf, was genau in den ersten 5  Zeilen passiert und weshalb die gesuchte kleine Datei nicht gefunden wird.

Wo ist der Fehler? Der erste gesuchte Dateiname steht in der Zelle A2 der großen Datei.

Vielen Dank für die Hilfe im voraus.
 
Hier ist das gesamte Makro:


Code:
Sub Auswertung() 
   
    Dim Wb As Workbook 'die "Wb" ist die geöffnete kleine Datei "1FIN_N_0321"
    Pfad = "C:\Users\Jorg\Documents\Regina\Excel-Projekt2" '<<< anpassen >>>"
    For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row

    If Dir(Pfad & Cells(i, 1)) <> "" Then 'wenn die Datei existiert, dann...
    Set Wb = Workbooks.Open(Pfad & Cells(i, 1)) 'die kleine Datei ist gefunden und geöffnet
   
    Sheets("Statistik").Select 'die kleine Datei öffnet das Tabellenblatt
    Range("B1:B5").Select 'markiere diese 5 Werte
    Selection.Copy 'kopiere die 5 Werte
    ThisWorkbook.Activate 'die große Datei
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True 'füge die 5 Werte in die große Datei ein
    Wb.Activate 'das ist die geöffnete kleine Datei
    Application.CutCopyMode = False 'mit ESC den Copy-Modus entfernen'
    Range("A1").Select 'immer noch in der kleiner Datei
 
    Wb.Close 0 ' 1 = schließen mit speichern; 0:= schließen ohne speichern
    ActiveCell.Offset(0, -2).Range("A1").Select 'große Datei,gehe wieder zurück zu Spalte A

    End If 'die Schleife ist zu Ende
   
    ActiveCell.Offset(1, 0).Select 'gehe in Spalte A eine Zelle nach unten
If ActiveCell = "" Then 'wenn die neue Zelle leer ist, dann...
        MsgBox "In dieser Zelle steht kein Dateiname. Daher Abbruch."
        Exit Sub 'Makro wird abgebrochen
    End If 'Makro wird weiter durchgeführt

    Next i 'die Schleife startet wieder von vorne

End Sub
Was steht denn in den Zellen? Zeige bitte ein Beispiel.
[
Bild bitte so als Datei hochladen: Klick mich!
]

diese Dateinamen stehen in der großen Datei in der Spalte A

1FIN_N-0322
1FIN_N-0323
1FIN_N-0324
1FIN_N-0325
1FIN_N-0326


vielleicht klappt es jetzt
Der Workbooks.Open() erwartet den Pfad + Dateiname

Falls Du mit xlsx-Dateien arbeitest wäre das:

Code:
' backslash am Ende des Pfads
Pfad = "C:\Users\Jorg\Documents\Regina\Excel-Projekt2\" '<<< anpassen >>>"
    For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row

    If Dir(Pfad & Cells(i, 1) & ".xlsx" ) <> "" Then 'wenn die Datei existiert, dann...
    Set Wb = Workbooks.Open(Pfad & Cells(i, 1) & ".xlsx") 'die kleine Datei ist gefunden und geöffnet

Falls du mit xlsm/xlsb/xls arbeiten solltest muss das entsprechend angepasst werden.
Hallo Fennek,

iich habe den Pfad entsprechend mit der Dateiendung  ".xlsb" für die gesuchte Datei ergänzt.
Ebenso in den Zeilen:  

    If Dir(Pfad & Cells(i, 1) & ".xlsb") <> "" Then  'wenn die Datei existiert, dann...
    Set Wb = Workbooks.Open(Pfad & Cells(i, 1) & ".xlsb") 'die kleine Datei ist gefunden und geöffnet

Leider ohne Erfolg. Die Datei wird bei der If Dir -Abfrage nicht geöffnet, sondern springt "zu End If"

Die große Datei hat - bedingt durch das Makro - ein ".xlsm" Format

Viele Grüße 
Jorg


Code:
  Sub Auswertung()
  
Dim Wb As Workbook 'die "WbDatei" ist die geöffnete kleine Datei "1FIN_N_0321"
  Pfad = "C:\Users\Jorg\Documents\Regina\Excel-Projekt2\.xlsb\" '<<< anpassen >>>"
    For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
   
    If Dir(Pfad & Cells(i, 1) & ".xlsb") <> "" Then  'wenn die Datei existiert, dann...
    Set Wb = Workbooks.Open(Pfad & Cells(i, 1) & ".xlsb") 'die kleine Datei ist gefunden und wird geöffnet
   
    Sheets("Statistik").Select 'die kleine Datei öffnet dieses Tabellenblatt
    Range("B1:B5").Select 'markiere diese 5 Werte

usw.....

End sub
Seiten: 1 2