Папка VBA Word с электронной почтой в формате pdf

Я хочу отправить PDF-файлы из файла MS Word. Этот файл связан с исходным файлом Excel для выполнения функции слияния. При поддержке http://word.officeacademy.it/450/word-come-fare-stampa-unione-direttamente-in-singoli-file-pdf-vba/ и http://www.rondebruin.nl/win/s7/win001.htm Я начал создавать макрос:

Sub NewZip(sPath)
'Create empty Zip File
'Changed by keepITcool Dec-12-2005
    If Len(Dir(sPath)) > 0 Then Kill sPath
    Open sPath For Output As #1
    Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0)
    Close #1
End Sub

Sub Unione_in_pdf()

Dim fd As FileDialog
Dim file As Variant

'Crea un oggetto FileDialog per scegliere la cartella in cui salvare i file
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
With fd

    'Usa il metodo Show per mostrare la finestra di dialogo e restituire l'azione dell'utente
    If .Show = -1 Then
            For Each vrtSelectedItem In .SelectedItems

            'vrtSelectedItem è una stringa che contiene l'indirizzo di ogni elemento selezionato.
            'E' possibile usare qualsiasi funzione di I/O sui file utilizzando questo indirizzo.
            SelectedPath = vrtSelectedItem

            Next vrtSelectedItem

    Else
            MsgBox ("Nessuna cartella è stata selezionata.")
            Exit Sub
    End If

End With

'Imposta la variabile oggetto a Nothing
Set fd = Nothing

Application.ScreenUpdating = False

MainDoc = ActiveDocument.Name
ChangeFileOpenDirectory SelectedPath
For i = 1 To ActiveDocument.MailMerge.DataSource.RecordCount
    With ActiveDocument.MailMerge
        .Destination = wdSendToNewDocument
        .SuppressBlankLines = True
        With .DataSource
            .FirstRecord = i
            .LastRecord = i
            .ActiveRecord = i

            'Utilizza alcuni campi del file sorgente per impostare il nome del file pdf
            'IMPORTANTE: tali campi vanno personalizzati in base a quelli effettivamente
            'presenti nella sorgente dati
            docName = "Lettera_" & .DataFields("NomeCentro").Value & "_" & .DataFields("Allievo").Value & ".pdf"
            Value = .DataFields("NomeCentro").Value
        End With
        .Execute Pause:=False

        Application.ScreenUpdating = False

    End With

    ActiveDocument.ExportAsFixedFormat OutputFileName:=docName, _
        ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:= _
        wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=1, To:=1, _
        Item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _
        CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, _
        BitmapMissingFonts:=True, UseISO19005_1:=False
    ActiveWindow.Close SaveChanges:=False

    Folder = ActiveDocument.Path
    DestFolder = Folder & Application.PathSeparator & Value
    If Len(Dir(DestFolder, vbDirectory)) = 0 Then

        MkDir DestFolder

        Dim FileNameZip
        Dim oApp As Object

            If Right(DestFolder, 1) <> "\" Then
                DestFolder = DestFolder & "\"
            End If

        FileNameZip = DestFolder & "MyZip" & ".zip"

        'Create empty Zip File
        NewZip (FileNameZip)

        Set oApp = CreateObject("Shell.Application")
        'Copy the files to the compressed folder
        oApp.Namespace(FileNameZip).CopyHere oApp.Namespace(DestFolder).items

        'Keep script waiting until Compressing is done
        On Error Resume Next
        Do Until oApp.Namespace(FileNameZip).items.Count = _
           oApp.Namespace(DestFolder).items.Count
            Application.OnTime When:=Now + TimeValue("00:00:15"), _
  Name:="MyDelayMacro"
        Loop
        On Error GoTo 0

        'Create the mail
        Set OutApp = CreateObject("Outlook.Application")
        Set OutMail = OutApp.CreateItem(0)
        strbody = "Hi there" & vbNewLine & vbNewLine & _
                  "This is line 1" & vbNewLine & _
                  "This is line 2" & vbNewLine & _
                  "This is line 3" & vbNewLine & _
                  "This is line 4"

        On Error Resume Next
        With OutMail
            .To = "ron@debruin.nl"
            .CC = ""
            .BCC = ""
            .Subject = "This is the Subject line"
            .Body = strbody
            .Attachments.Add FileNameZip
            .Send   'or use .Display
        End With
        On Error GoTo 0         

        End If

Next i

       Application.ScreenUpdating = True

End Sub

Я создаю pdf файлы, создаю папки, но я не могу заархивировать файлы в созданных папках.

Мне нужно найти все файлы с ключевым словом в Dim Value (поле "NomeCentro" в исходном файле Excel), а также архивировать и копировать в ранее созданную папку "NomeCentro".

Наконец, мне нужно отправить письмо для каждого zip-файла (я не проверял почтовый код, потому что отладка останавливает меня раньше).

Изменить: ошибка генерирует всплывающее окно с (попробуйте перевести сообщение) "Не удается переместить сжатую (сжатую) папку в себя" в строке

oApp.Namespace(FileNameZip).CopyHere oApp.Namespace(DestFolder).items

1 ответ

Вы получаете какие-либо сообщения об ошибках? Если да, можете ли вы предоставить их здесь и указать, в какой строке вы их получаете?

Редактировать: на основании сообщения об ошибке, приведенного ниже в комментарии, проблема заключается в том, что zip-файл находится по пути, указанному в DestFolder, а затем вы пытаетесь скопировать все элементы в DestFolder в zip-файл, но все элементы включают сам zip-файл,

Создайте zip-файл по пути, который не будет затронут вызовом копирования.

Другие вопросы по тегам