Как вывести сообщение для рабочего макроса? - PullRequest
0 голосов
/ 24 апреля 2020

Как я могу отобразить сообщение в макросе Word, которое говорит, что нужно подождать некоторое время. Поле должно просто содержать текст «Пожалуйста, подождите немного», и скрипт должен загружаться в фоновом режиме. (Мой сценарий делает это с последовательным письмом, каждый документ сохраняется индивидуально как PDF). Сообщение должно появиться до того, как оно начнет сохраняться и автоматически закрываться после его завершения.

Я работал с MsgBox раньше, но я читал, что он не загружает скрипт в фоновом режиме (только после закрытия MsgBox)

Sub SerienbriefOneDoc()
'
' SerienbriefOneDoc Makro
'
'
 Dim Dateiname As String
 Dim LetzterRec As Long
 Application.ScreenUpdating = False
 Application.Visible = False

    'Variable declaration
    Dim sFolderName As String
    Dim sDesktopPath As String, sFolderPath As String

    'Find Desktop path location
    sDesktopPath = Environ("USERPROFILE") & "\Desktop\"

    'Define folder name to create on the desktop
    sFolderName = "Serienbrief"

    'Folder Path
    sFolderPath = sDesktopPath & sFolderName

    'Create FSO Object
    Set oFSO = CreateObject("Scripting.FileSystemObject")

    'Check Specified Folder exists or not
    If oFSO.FolderExists(sFolderPath) Then
        'If folder is available on the desktop
        MsgBox "Der angegebene Ordner existiert bereits auf dem Desktop!", vbInformation, "VBAF1"
        GoTo PDFsave
    Else
        'Create Folder
        MkDir sFolderPath

        'Diplay messafe on the screen
        MsgBox "Ordner erstellt : " & vbCrLf & vbCrLf & sFolderPath, vbInformation, "VBAF1"
    End If



PDFsave:

 'Const path As String = sFolderPath                                 'Speicherpfad des Resultates     N:\Lehre\Basislehrjahr\Auftraege\Projektarbeit\WordMakro\Serienbrief\save\
 ActiveDocument.MailMerge.DataSource.ActiveRecord = wdLastRecord
 LetzterRec = Word.ActiveDocument.MailMerge.DataSource.ActiveRecord
 ActiveDocument.MailMerge.DataSource.ActiveRecord = wdFirstRecord

MsgBox "please wait a moment"

With ActiveDocument.MailMerge                                                                                               'Waehlt das aktuelle Dokument des Serienbriefs
         .DataSource.ActiveRecord = wdFirstRecord
         Do
             If .DataSource.ActiveRecord > 0 Then                                                                           'Prueft ob es mehrere Seiten fuer den Serienbrief gibt
                If .DataSource.DataFields("Name").Value <> "0" Then                                                         'zaehlt die Anzahl Datensaetz in der Spalte "Name"
                     .Destination = wdSendToNewDocument
                     .SuppressBlankLines = True
                        If Dir(sFolderPath, vbDirectory) <> "" Then                                                                'prueft ob es das Verzeichnis gibt.
                        Else
                            MsgBox "Verzeichnis existiert nicht"                                                            'Fehlermeldung falls das Verzeichniss nicht existiert
                        End If
                     With .DataSource
                         .FirstRecord = .ActiveRecord
                         .LastRecord = .ActiveRecord
                          dname = sFolderPath & "\" & .DataFields("Name").Value & "_" & .DataFields("Vorname").Value & ".pdf"            'erstellt eine Variable mit dem Pfad und dem Namen
                     End With
                        .Execute Pause:=False
                        ActiveDocument.SaveAs2 FileName:=dname, FileFormat:=wdFormatPDF                                     'benennt die Datei und aendert das Dateiformat auf PDF
                        ActiveDocument.Close False                                                                          'schliesst das Fenster
                 End If
               End If
             If .DataSource.ActiveRecord < LetzterRec Then                                                                  'prueft ob es noch eine Seite gibt im Serienbrief
                 .DataSource.ActiveRecord = wdNextRecord                                                                    'nimmt die naechste Seite des Serienbriefes
             Else
                 Exit Do                                                                                                    'wenn es keine Seite im Serienbrief mehr gibt wird die Schleife beendet
             End If
         Loop
     End With
     Application.Visible = True
     Application.ScreenUpdating = True[enter image description here][1]
End Sub

https://i.stack.imgur.com/wlznU.png На рисунке показано, как это должно быть (просто без MsgBox)

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Каждая функция в стандартной библиотеке VBA является синхронной: вы вызываете ее, она выполняет свою функцию, возвращает, выполнение возобновляется со следующей инструкцией.

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

Я бы пригласил вас прочитать Индикатор прогресса многократного использования (средний / продвинутый) для идей использование пользовательской формы (для этого забудьте MsgBox) - самый простой способ сделать это - создать немодальную пользовательскую форму для запуска шоу (статья демонстрирует, как создать отменяемый индикатор прогресса, который является модальным, но не запустить шоу).

0 голосов
/ 25 апреля 2020

Вы можете дать отчет о проделанной работе в строке состояния. Например:

Вверху кода вставьте:

Dim i As Long, j As Long, sBar As Boolean
SBar = Application.DisplayStatusBar
Application.DisplayStatusBar = True

После:

With ActiveDocument.MailMerge

вставьте:

j = .DataSource.RecordCount

После :

Do

вставка:

i = i + 1
Application.StatusBar = "Processing " & Int(i / j * 100) & "%"

После:

Application.Visible = True

вставка:

Application.StatusBar = False
Application.DisplayStatusBar = SBar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...