Avatar billede Pdahl Juniormester
04. maj 2020 - 16:16 Der er 12 kommentarer

Omdøb PDF-fil med FSO via VBA til WORDS

Jeg mangler en VBA-procedure, der kan omdøbe pdf-filer via FSO
(skal køre via en VBA-brugerformular i MS Word)

Er der nogen som har et godt og funktionelt bud?
- jeg har efterhånden søgt og afprøvet mange fundne eksempler, uden at jeg har fået det til at virke?
Avatar billede thomas_bk Ekspert
05. maj 2020 - 13:38 #1
Når du skriver 'omdøbe' pdf filer, mener du så konvertere til word format?

Kan du evt. beskrive mere konkret hvad du har behov for?
Avatar billede Pdahl Juniormester
05. maj 2020 - 14:53 #2
Jeg ønsker at omdøbe selve filnavnet.

PDF-filen får (ved oprettelse) automatisk tildelt et "anonymt" filnavn ud fra oprettelsesdato og tidspunkt, f.eks. "Faktura2020-05-0514.21.18.pdf"

Denne skal omdøbes til "'Faktura' + [fakturanummer] + [kundenavn].pdf"
(f.eks. "Faktura 200195 Arne Strøm.pdf")

Fakturanummer og kundenavn skal udlæses fra indholdet i pdf-filen
Avatar billede thomas_bk Ekspert
05. maj 2020 - 15:20 #3
Hvis ikke nogen kan give bedre hjælp, så er der måske lidt inspiration i dette link angående at hente data ud af pdf'en. Specielt ser det interessant ud at bruge word som mellemled.

https://stackoverflow.com/questions/36270247/extract-data-from-pdf-and-add-to-worksheet
Avatar billede Pdahl Juniormester
05. maj 2020 - 16:25 #4
Takker for linket - jeg kigger på det :-)

Jeg har dog allerede nogenlunde styr på udlæsningen fra pdf-filen via Word (har dog en udfordring med at indholdets placering, da det kan variere lidt, alt efter længde på modtageradresse og variation i andet indhold, f.eks. om der er tale om en kreditnota eller en faktura. Der er her behov for en række betingede procedurer og if-konstruktioner)

Men jeg mangler løsningen på at omdøbe filen. Dette skal nemlig foregå via FSO,
da pdf-filen ikke kan omdøbes, så længe den allerede er åben.
Avatar billede thomas_bk Ekspert
06. maj 2020 - 07:57 #5
Det er jo selvfølgeligt lidt en dumsmart bemærkning og sikkert allerede undersøgt.

Er det ikke muligt at softwaren der danner fakturaen er i stand til at give et filnavn ud fra en parameteropsætning!
Avatar billede Pdahl Juniormester
08. maj 2020 - 19:16 #6
Ganske naturligt spørgsmål, og forståeligt at du spørger. Det er undersøgt og desværre ikke muligt at opnå det ønskede navneformat.

Jeg er dog ganske langt med selve udlæsning af indhold (til navngivning) fra pdf-filen, selvom indholdet som nævnt ikke er helt konsekvent ens hver gang.

Til at omdøbe filer via FSO har jeg fundet følgende (afprøvet og virker):

Sub Rename()
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.MoveFile "\TEST.pdf", "\TEST2.pdf"
End Sub

(kræver blot registrering af Microsoft Scripting Runtime object library)
Avatar billede Pdahl Juniormester
08. maj 2020 - 19:23 #7
Nedenstående procedure gennemløber en fil-mappen og åbner relevante pdf-filer i WORD for videre behandling.

Proceduren fungerer, men makroen fortsætter med at kører ???

Sub LoopThroughFiles()
Dim MyObj As Object
Dim MySource As Object
Dim Archive As String
Dim file As Variant

On Error GoTo Errorhandler

  'Application.ScreenUpdating = False
  Archive = "C:\Users\Administrator\Documents\TEST\"
  file = Dir(Archive)
 
  While (file <> "")
     
  If Right(file, 4) = ".pdf" Then '--- Check if file is PDF type ------------
       
        If Left(file, 10) = "Faktura202" Then  'Only if filename begins with "FAKTURA" open file
           
            ChangeFileOpenDirectory Archive
            Documents.Open FileName:=file, ConfirmConversions:= _
                False, ReadOnly:=False, AddToRecentFiles:=False, PasswordDocument:="", _
                PasswordTemplate:="", Revert:=False, WritePasswordDocument:="", _
                WritePasswordTemplate:="", Format:=wdOpenFormatAuto, XMLTransform:=""
           
            '---- Handle and rename document something something ....
           
            MsgBox file & " er en faktura-fil" 'Temporary Break Control
            ActiveDocument.Close
           
        End If
         
        If Left(file, 16) = "Ordrebekr‘ftelse" Then 'Only if filename begins with "Ordrebekr‘ftelse" open file

            ChangeFileOpenDirectory Archive
            Documents.Open FileName:=file, ConfirmConversions:= _
                False, ReadOnly:=False, AddToRecentFiles:=False, PasswordDocument:="", _
              PasswordTemplate:="", Revert:=False, WritePasswordDocument:="", _
                WritePasswordTemplate:="", Format:=wdOpenFormatAuto, XMLTransform:=""
           
            '---- Handle and rename document something something ....
           
            MsgBox file & " er en ordrebekræftelse" 'Temporary Break Control
            ActiveDocument.Close

        End If
 
  End If
       
        file = Dir

  Wend
   
    'Application.ScreenUpdating = True

Errorhandler:
Resume Next
End Sub
Avatar billede thomas_bk Ekspert
08. maj 2020 - 19:40 #8
Om muligt er det måske bedre med en ‘for each’ i relation til filerne istedet for while/wend.
Avatar billede Pdahl Juniormester
08. maj 2020 - 20:33 #9
Okay?
- hvilken betydning har det at bruge 'for each' i stedet for while/wend?
Jeg spørger af ren interesse, da nuværende procedure jo fungerer
(- bortset fra at makroen som nævnt fortsætter med at køre)
Avatar billede thomas_bk Ekspert
08. maj 2020 - 22:31 #10
At makroen bliver ved med at køre tyder på at den ikke kommer ud af while løkken.

Derfor mit forslag om at forsøge med en ‘for each’ løkke istedet.
Avatar billede thomas_bk Ekspert
08. maj 2020 - 22:35 #11
Lidt info i linket om alternative loop metoder.
https://trumpexcel.com/vba-loops/
Avatar billede Pdahl Juniormester
08. maj 2020 - 22:50 #12
Jeg prøver at ændre
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester