( Hilfe benötigt ) Automatische Umbenennung von Dateinamen

Sorry!

Kann mir jemand vielleicht noch einen Code schreiben damit nicht vorhandene PDF´s übersprungen werden?

Code:
if dir(PDFDir & "\" & tmpFile(0) & "-" & tmpFile(1) & ".pdf")<>"" then

Name PDFDir & "\" & tmpFile(0) & "-" & tmpFile(1) & ".pdf" as PDFDir & "\" & FileName & ".pdf"

End If

Damit wird geprüft, ob die PDF, die du umbenennen willst, überhaupt im PDF-Ordner existiert.
 
Wie muss ich diese Abfrage einbauen?

Ich bekomme im Einzelschrittverfahren in der Zeile :

Code:
Name PDFDir & "\" & tmpFile(0) & "-" & tmpFile(1) & ".pdf" As PDFDir & "\" & FileName & ".pdf"

die Fehlermeldung:

Laufzeitfehler `53`
Datei nicht gefunden

mfg,

Georg
 
Lass Dir doch einfach im Einzelschritt-Ablauf mal anzeigen, was in den Variablen nun drin steht, und dann schau nach, ob es diese Datei mit dem exakten Namen auch so gibt.

Wenn Dein Programm Dir sagt, dass es die Datei nicht findet, dann ist sie in aller Regel auch nicht da. Da können wir doch von hier aus auch nicht auf Deinen Rechner gucken, um die Datei zu suchen.

Mit:
Code:
   Debug.Print PDFDir & "\" & tmpFile(0) & "-" & tmpFile(1) & ".pdf"
wird Dir im VB-Direktfenster angezeigt, was in der Variablen nun genau drin steht.

Grüsse
ronaldh
 
Einfach ein

On Error Resume Next

als erste Zeile der Sub.

Wenn der Fehler 53 ausgelöst wird, weil die Datei fehlt, wird die Name As Anweisung übersprungen, und der Code setzt mit der nächsten Zeile fort
 
Okay, danke! Hat super funktionniert!

Aber was jetzt noch fehlt ist, das man beim start nach dem "DOC-Verzeichnis" & "PDF-Verzeichnis" gefragt wird! Am besten durch eine normale Ordnerauswahl wie beim öffnen einer Datei. Nur das hier ein Ordner ( bzw. Verzeichnis ) ausgewählt wird!

Ist sowas möglich?

Hintergrund:

Es gibt für jedes Jahr immer neue Ordner. Dass heißt es müsst jedesmal die Zeile

Code:
ReName "Q:\Q1-Office\40-Fähigkeitsuntersuchungen\20-U-Berichte 2000-2007\Uber2008", "Q:\Q1-Office\40-Fähigkeitsuntersuchungen\20-U-Berichte 2000-2007\Uber2008\_PDF-Dateien"
umgeschrieben werden.

Gibt es eine Möglichkeit eine Abfrage des Verzeichnisses beim Start zu haben?

Das wär dann auch das letzte von mir ;D

mfg,

Georg
 
Okay, danke! Hat super funktionniert!

Aber was jetzt noch fehlt ist, das man beim start nach dem "DOC-Verzeichnis" & "PDF-Verzeichnis" gefragt wird! Am besten durch eine normale Ordnerauswahl wie beim öffnen einer Datei. Nur das hier ein Ordner ( bzw. Verzeichnis ) ausgewählt wird!

Ist sowas möglich?

Ist möglich! Der ganze Spass nennt sich API-Aufruf von "SHBrowseForFolder"

guggst du hier: http://www.vbarchiv.net/api/api_shbrowseforfolder.html
 
Also ich hab jetzt lange probiert und gelesen, aber ich komm nicht drauf wie ich das für mein Makro benutze bzw. eintrage!

Was mach ich falsch?
 
Also ich hab jetzt lange probiert und gelesen, aber ich komm nicht drauf wie ich das für mein Makro benutze bzw. eintrage!

Was mach ich falsch?

Den ganzen Code von der Website in ein normales Modul rein, anstatt Private kannst/musst du alles Public machen, und natürlich anstatt Command1_Click musst du natürlich den Namen deines eigenen Buttons nehmen. Die für dich interessante Variable ist RetStr, so diese eventuell Modulweit deklarieren.
 
Den ganzen Code von der Website in ein normales Modul rein, anstatt Private kannst/musst du alles Public machen, und natürlich anstatt Command1_Click musst du natürlich den Namen deines eigenen Buttons nehmen. Die für dich interessante Variable ist RetStr, so diese eventuell Modulweit deklarieren.

Sorry, aber ich bin hier gerade auf Arbeit und kann immer nur zwischendurch reinschauen. Jetzt allerdings ein paar Anmerkungen/Änderungen zu meinem vorigen Post:

Einfach reinkopieren funktioniert natürlich nicht, da kein einziges Objekt in Excel eine hWnd-Eigenschaft hat. Lässt sich äusserst einfach umgehen:

im VB-Editor Doppelclick auf "DieseArbeitsmappe" und folgenden Code 1:1 reinsetzen:
Code:
Private Declare Function FindWindow Lib "user32.dll" _
  Alias "FindWindowA" ( _
  ByVal lpClassName As String, _
  ByVal lpWindowName As String) As Long

Public Function hWnd() As Long

    hWnd = FindWindow(vbNullString, Application.Caption)

End Function

Dann am besten ein eigenes Modul erstellen und folgenden Code reinsetzen
Code:
Private Declare Function SHBrowseForFolder Lib "shell32.dll" _
  Alias  "SHBrowseForFolderA" ( _
  lpbi As BROWSEINFO) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" _
  Alias  "SHGetPathFromIDListA" ( _
  ByVal pidl As Long, _
  ByVal pszPath As String) As Long
Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal pv As Long)
 
' Den folgenden in ein Modul einfügen
Private Declare Function SendMessage Lib "user32" _
  Alias "SendMessageA" ( _
  ByVal hwnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  lParam As Any) As Long
 
' SendMessage SHBrowseForFolder-Messages
' --------------------------------------
 
' Enabled den OK-Button, wenn lParam ungleich 0 ist,
' andernfalls wird der Button Disabled
Private Const BFFM_ENABLEOK = &H465
 
' Setzt die Selektierung auf einen Verzeichnisbaumeintrag
' lParam gibt hierbei den Pfad an und wParam muss ungleich 0 sein
Private Const BFFM_SETSELECTION = &H466
 
' Setzt den Staustext des Dialogs.
' lParam gibt den auszugebenden Text an
Private Const BFFM_SETSTATUSTEXT = &H464
 
' Callback Ereignis-Messages
' --------------------------
 
' Dialog wurde initialisiert, lParam ist 0
Private Const BFFM_INITIALIZED = 1
 
' Benutzer hat ein anderen Verzeichnisbaumeintrag gewählt
Private Const BFFM_SELCHANGED = 2
 
' (ab IE 4.0) Benutzer hat eine falsche Angabe
' in der Textbox des Dialogs gemacht
Private Const BFFM_VALIDATEFAILED = 3

Private Type BROWSEINFO
  hwndOwner As Long
  pidlRoot As Long
  pszDisplayName As String
  lpszTitle As String
  ulFlags As Long
  lpfn As Long
  lParam As Long
  iImage As Long
End Type
 
Private Type SHITEMID
  cbSize As Integer
  abID As String * 256
End Type
 
Private Type ITEMIDLIST
  mkid As SHITEMID
End Type
 
' Nur Computer als Auswahl erlaubt. Wenn der Anwender andere 
' Ordner markiert, kann der OK-Schalter nicht ausgewählt 
' werden.
Private Const BIF_BROWSEFORCOMPUTER = &H1000
 
' Nur Drucker als Auswahl erlaubt. Wenn der Anwender andere 
' Ordner markiert, kann der OK-Schalter nicht ausgewählt 
' werden.
Private Const BIF_BROWSEFORPRINTER = &H2000
 
' Der Dialog zeigt neben den Ordnern auch Dateien.
Private Const BIF_BROWSEINCLUDEFILES = &H4000
 
' Der Dialog zeigt keine Netzwerkordner unterhalb der
' aktuellen Domain.
Private Const BIF_DONTGOBELOWDOMAIN = &H2
 
' Nur Dateisystemobjekte als Auswahl erlaubt. Wenn der 
' Anwender andere Ordner markiert, kann der OK-Schalter 
' nicht ausgewählt werden.
Private Const BIF_RETURNFSANCESTORS = &H8
 
' Nur Dateisystemordner als Auswahl erlaubt. Wenn der
' Anwender andere Ordner markiert, kann der OK-Schalter
' nicht ausgewählt werden.
Private Const BIF_RETURNONLYFSDIRS = &H1
 
' Der Dialog enthält eine Statuszeile. Die Rückruffunktion
' kann die Statuszeile ausfüllen
Private Const BIF_STATUSTEXT = &H4
 
' (Win 2000) Zeigt ein neuen Dialog an mit mehr
' benutzerfreundlichen Änderungen
Const BIF_USENEWUI = &H40
 
' (ab IE 4.0) Sendet an die Callback Funktion eine
' BFFM_VALIDATEFAILED Message, wenn in der Textbox eine falsche
' Eingabe gemacht wurde
Const BIF_VALIDATE = &H20
 
Private Const BIF_EDITBOX = &H10

Public Function BrowseFolder(ByVal WindowHandle as Long) as String
  Dim BI As BROWSEINFO
  Dim Item As ITEMIDLIST
  Dim Retval As Long
  Dim RetStr As String * 256
 
  ' Dialog-Eigenschaften und Vorgabewerte setzen
  With BI
    .hwndOwner = WindowHandle
    .pszDisplayName = Space(260)
    .lpszTitle = "Ordner wählen"
    .ulFlags = BIF_RETURNONLYFSDIRS Or BIF_VALIDATE Or _
      BIF_STATUSTEXT Or BIF_EDITBOX 
    .lpfn = 0
  End With
 
  ' Dialog aufrufen
  Retval = SHBrowseForFolder(BI)
  If Retval = 0 Then
    MsgBox "Es ist ein Fehler aufgetreten oder Sie haben " & _
      " auf 'Abbrechen' geklickt."
    Exit Function
  End If
 
  ' Ausgewählten Pfad ermitteln
  Retval = SHGetPathFromIDList(Retval, RetStr)
  If Retval = 0 Then
    MsgBox "Fehler beim Extrahieren des ausgewählten Pfades"
    Exit Function
  End If
 
  BrowseFolder=Left$(RetStr, InStr(1, RetStr, vbNullChar) - 1)
 
  ' Ressourcen wieder freigeben
  CoTaskMemFree Retval
End Function

Der Aufruf erfolgt dann mit:

Dim DOCDir as String
Dim PDFDir as String

DOCDir=BrowseFolder(DieseArbeitsmappe.hWnd)
PDFDir=BrowseFolder(DieseArbeitsmappe.hWnd)

EDIT: Ich hab eben das ganze Callback-Gedöns rausgeworfen, da man es hierfür nicht wirklich braucht
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück