Felix: Wichtig: VBA-Script!? Dateiprüfung?

hallo,

leider passt mein post nicht ganz in das forum, aber dieses script stammt auch hierher.

ich habe eine excel und in der 1. spalte stehen die kundennummern und in der 2. die kundenberater.

habe nun ein makro:

Sub Makro1()
'
' Makro1 Makro
' Makro am 11.01.06 von **** aufgezeichnet
'

Dim lngZ As Long
Dim strQuellpfad As String, strZielpfad As String
Dim datname As String

'Schleife über die Zellen:
For lngZ = 1 To Cells(Rows.Count, 1).End(xlUp).Row
    'Quellpfad zusammenbasteln:
    strQuellpfad = "C:\test" & Cells(lngZ, 1) & ".pdf"
    'Zielpfad zusammenbasteln:
    strZielpfad = "C:\test" & Cells(lngZ, 2) & "" & Cells(lngZ, 1) & ".pdf"
    'Kopieren:
    FileCopy strQuellpfad, strZielpfad
    End If
Next
End Sub

das makro kopiert die pdfs ("kundenummer".pdf) in den ordner der kundenberater ...

bricht dies aber ab, weil in der excel auch kundennummern vorhanden sind, wo es keine pdfs gibt.

wie könnte man dies prüfen?

habe auch schon etwas rumprobiert:

datname = Cells(lngZ, 1) & ".pdf"
    If Dir(datname) <> "" Then

es gab aber keinen erfolg, da ich in diesem gebiet nicht ernsthaft ahnung habe.

günstig wäre vielleicht, auch wie eine messagebox, die sagt, welche kundennummer nicht vorhanden ist ...

ich danke schonmal für die kompetenten antworten ...

have a nice day!

lg felix

  1. Hallo,

    ich habe eine excel und in der 1. spalte stehen die kundennummern und in der 2. die kundenberater.

    das makro kopiert die pdfs ("kundenummer".pdf) in den ordner der kundenberater ...

    bricht dies aber ab, weil in der excel auch kundennummern vorhanden sind, wo es keine pdfs gibt.

    wie könnte man dies prüfen?

    habe auch schon etwas rumprobiert:

    datname = Cells(lngZ, 1) & ".pdf"
        If Dir(datname) <> "" Then

    es gab aber keinen erfolg, da ich in diesem gebiet nicht ernsthaft ahnung habe.

    günstig wäre vielleicht, auch wie eine messagebox, die sagt, welche kundennummer nicht vorhanden ist ...

    Such mal in der VBA-Hilfe nach "On Error". Damit kannst Du eine Fehlerbehandlung für Laufzeitfehler implementieren.

    Sub Makro1()
    '
    ' Makro1 Makro
    ' Makro am 11.01.06 von **** aufgezeichnet
    '

    Dim lngZ As Long
    Dim strQuellpfad As String, strZielpfad As String
    Dim datname As String

    'Fehlerbehandlung abschalten
       On Error GoTo 0

    'Schleife über die Zellen:
    For lngZ = 1 To Cells(Rows.Count, 1).End(xlUp).Row
        'Quellpfad zusammenbasteln:
        strQuellpfad = "C:\test" & Cells(lngZ, 1) & ".pdf"
        'Zielpfad zusammenbasteln:
        strZielpfad = "C:\test" & Cells(lngZ, 2) & "" & Cells(lngZ, 1) & ".pdf"

    'Fehlerbehandlung aktivieren
           On Error GoTo mark

    'Kopieren:
        FileCopy strQuellpfad, strZielpfad
    Next

    'ohne Fehler ist hier Schluss
       Exit Sub
       'bei Fehler
       mark:
           MsgBox ("C:\test" & Cells(lngZ, 1) & ".pdf" & " ist nicht vorhanden.")
           'setze in der Zeile nach der Fehlerzeile fort
           Resume Next
       End Sub

    viele Grüße

    Axel

    1. Hallo

      bricht dies aber ab, weil in der excel auch kundennummern vorhanden sind, wo es keine pdfs gibt.

      wie könnte man dies prüfen?

      Nutze die MSDN, Shell Lightweight API. Du benötigst aus dem Artikel folgende Deklaration:

      ' ======= FILE FUNCTIONS ========
      Private Declare Function PathFileExists Lib "Shlwapi" _
         Alias "PathFileExistsW" _
         (ByVal lpszPath As Long) As Boolean

      und diese Funktion:

      ' ==============================================
      ' Testing the validity of file and folder names.
      ' ==============================================
      Public Function FileExists(Path As String) As Boolean
        ' Returns True if the path name is valid.
        FileExists = PathFileExists(StrPtr(Path))
      End Function

      Anwendung:

      ' Stattdessen Existenz überprüfen.
         ' Es wird kein eventuell teurer Versuch gemacht, eine nicht
         ' vorhandene Datei zu öffnen
         if FileExists(strQuellpfad) then
             FileCopy strQuellpfad, strZielpfad
         else
             ' Generiere z.B. einen Eintrag in einem Fehlerlog
         end if

      Anmerkung:
      Bitte beachte die Systemvoraussetzungen in verlinktem Artikel,
      d.h. IE 4 oder höher unter Windows 95/NT4 erforderlich, alle
      neueren Versionen von Windows problemlos.

      Freundliche Grüße

      Vinzenz

      1. Hallo,

        Nutze die MSDN, Shell Lightweight API.

        Meinst Du mich?
        Nein, das werde _ich_ nicht tun. Solange es geht, verlasse ich mich lieber auf das, was nativ vorhanden ist.

        Felix kann Deinen Vorschlag natürlich gerne mit in seine Überlegungen einbeziehen.

        Du benötigst aus dem Artikel folgende Deklaration:

        ' ======= FILE FUNCTIONS ========
        Private Declare Function PathFileExists Lib "Shlwapi" _

        ^eben...
        viele Grüße

        Axel

      2. Hallo Vinzenz,

        ' ======= FILE FUNCTIONS ========
        Private Declare Function PathFileExists Lib "Shlwapi" _
           Alias "PathFileExistsW" _
           (ByVal lpszPath As Long) As Boolean

        meinst Du nicht, dass das etwas wie das Schießen mit Kanonen auf  Spatzen ist?

        if dir(strQuellPfad) <> "" then FileCopy strQuellpfad, strZielpfad

        tut es auch.

        Viele Grüße

        Jörg

  2. Hi felix,

    datname = Cells(lngZ, 1) & ".pdf"
        If Dir(datname) <> "" Then

    fast. ;-)

    Dim lngZ As Long
    Dim strQuellpfad As String, strZielpfad As String
    Dim datname As String

    'Schleife über die Zellen:
    For lngZ = 1 To Cells(Rows.Count, 1).End(xlUp).Row
        'Quellpfad zusammenbasteln:
        strQuellpfad = "C:\test" & Cells(lngZ, 1) & ".pdf"
        'Zielpfad zusammenbasteln:
        strZielpfad = "C:\test" & Cells(lngZ, 2) & "" & Cells(lngZ, 1) & ".pdf"
        'Kopieren:
        if dir(strquellpfad) <> "" then
           FileCopy strQuellpfad, strZielpfad
        else
           msgbox strquellpfad & " nicht vorhanden."
        end if
    Next
    End Sub

    (ungetestet)

    Viele Grüße

    Jörg