Avatar billede kll1978 Nybegynder
10. april 2010 - 04:01 Der er 4 kommentarer og
1 løsning

Fra Excel til PDF og sendes som vedhæftet - VBA

Har brug for lidt hjælp med mht til VBA kodning.

Opgaven går ud på at udskrive en arkfane som pdf-udskrift og sendes som vedhæftet via MS Outlook (2003).

Selve VBA-koden på udskrivning til PDFD er lykkdes, men at vedhæftet pfd filen lykkedes ikke første gang. Men når koden køres igen, bliver pdf-filen vedhæftet. Problemet er at pdf-filen når ikke at blive generet færdig, inden der bliver sendt en mail.

Hvordan kan nedenstående kode tager hensyn til, således at mailen først skal vedhæfte pdf-filen, når den er blevet generet færdig.

-------------------------------------------------

Sub PrintSheetAsPDFwithBullZip()

Dim FileExtStr As String
Dim FileFormatNum As Long
Dim Sourcewb As Workbook
Dim TempFilePath As String
Dim TempFileName As String
Dim FileNames As String
Dim FileName As String
Dim OutApp As Object
Dim OutMail As Object
Dim cell As Range

'must add a reference to BullZip
Dim myobject As New Bullzip.PDFPrinterSettings
Dim SavePath As String, FileName As String
SavePath = Environ("HOMEDRIVE") & Environ("HOMEPATH") & "\Desktop\"
FileNames = Range("A1") 'InputBox("Save PDF to desktop as:", "Sheet '" & ActiveSheet.Name & "' to PDF...", ActiveSheet.Name)
If LCase(Right(FileName, 4)) <> ".pdf" Then FileName = FileNames & ".pdf"


'see default settings in
'Environ("HOMEDRIVE") & Environ("APPDATA") & "\Bullzip\PDF Printer\settings.ini"
myobject.SetValue "output", SavePath & FileName
myobject.SetValue "showsettings", "never"
myobject.SetValue "ConfirmOverwrite", "no"
myobject.SetValue "showPDF", "no"
myobject.SetValue "ShowProgressFinished", "no"
myobject.WriteSettings (True) 'writes the settings in a runonce.ini that it immediately deleted after being used.

'change to bullzip printer...
If InStr(ActivePrinter, "PDF Printer på Ne00") = 0 Then
Dim storeprinter$, PrinterChanged As Boolean
PrinterChanged = True
OldPrinter = ActivePrinter
ActivePrinter = "PDF Printer på Ne00" 'GetFullNetworkPrinterName("BullZip")
End If

ActiveSheet.PrintOut

'If PrinterChanged Then ActivePrinter = storeprinter

    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)

        On Error Resume Next
        With OutMail
            .From = Range("E5").Value
            .To = Range("B1")
            '.CC = Range("E4").Value & "; " & Range("E3").Value
            .BCC = ""
            .Subject = "Test"
            .Body = ""
            .Attachments.Add SavePath & FileName
            'You can add other files also like this
            .Display
            'Send
        End With

    'On Error GoTo 0
        '.Close saveChanges:=False
    'End With

    'Delete the file you have send
    'Kill TempFilePath & TempFileName & FileExtStr
    SendKeys "%{s}", True
    Set OutMail = Nothing
    Set OutApp = Nothing

    With Application
        .ScreenUpdating = True
        .EnableEvents = True
    End With

'Application.ActivePrinter = strCurrentPrinter

End Sub

---------------------------------
Avatar billede stefanfuglsang Juniormester
10. april 2010 - 14:36 #1
Prøv at teste for om filen findes med noget i stil med nedenstående
(path= fuld sti til din fil)

dim fs as object

Set fs = CreateObject("Scripting.FileSystemObject")

while not fs.FileExists(path & FileName) 
  call doevents
wend
' attach file


Ovenstående er ikke afprøvet, så der er sikkert fejl i!
Avatar billede kll1978 Nybegynder
11. april 2010 - 22:17 #2
Nope, det virkede desværre ikke.

Når man kører koden første gang, når pdf-filen ikke at blive generet færdig, inden mailen bliver sendt.

Når man koden anden gang, kan den vedhæftet filen, fordi der er filen blevet generet.

Hvordan kan man lave en kode, som gør at der skal først sende en mail, når pdf-filen er generet færdig og den ligger i mappen.
Avatar billede stefanfuglsang Juniormester
12. april 2010 - 11:47 #3
> Nope, det virkede desværre ikke.
Hvis din kode genererer en fil, må det være muligt at teste om den findes, som vist i min kode - men jeg havde overset at doevents er en function:

Dim fs As Object
Dim d As Integer
'lav først filen
'Test om fil eksisterer:
Set fs = CreateObject("Scripting.FileSystemObject")

While Not fs.FileExists(SavePath & FileName)
  d = DoEvents 
Wend
Avatar billede kll1978 Nybegynder
17. april 2010 - 01:46 #4
Det funger. Jeg takker. Kan du ikke komme med et svar.
Avatar billede stefanfuglsang Juniormester
25. september 2010 - 10:16 #5
Beklager at jeg ikke har set på dette i lang tid...
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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