Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

VBA - aktiven Pfad verwenden

512 views
Skip to first unread message

Harald Friis

unread,
Feb 25, 2018, 5:55:22 AM2/25/18
to
Hallo,

falls hier noch einige Menschen mitlesen...

Ich habe ein Makro in Word (2010), das andere Worddateien aufruft, einen
Serienbrief erstellt und diesen dann abspeichert.

Das funzt für meine Zwecke auch ganz hervorragend. Es geht sicher etwas
eleganter, vielleicht auch schneller, aber ich komme gut damit klar.
Unten* schreibe ich mal einen Teil davon, insgesamt sind es noch mehr
Briefe, die erzeugt werden.

Als Pfad habe ich fest "M:\Test\" (für die Vorlagen und das Excel-Sheet
mit den Daten) und "M:\Test\Ergebnis" (für die fertigen Serienbriefe)
eingestellt.

Nun wollte ich das flexibler gestalten. Ich lese den derzeitigen Pfad
aus und setze ihn als Vorlagenpfad. Der Ergebnispfad wäre dann der
Vorlagenpfad & "\Ergebnis\".

Ich habe statt dem konstanten Pfad:

Dim strPfad as String
strPfad = ActiveDocument.Path & "\"

versucht. In einer MsgBox gibt er auch den richtigen Pfad an. Allerdings
findet er die Vorlage nicht unter strPfad & "01_Brief_A.docx" und
schreibt auch das Ergebnis nicht unter strPfad & "Ergebnis\..."

Was mache ich falsch? Vor allem: wie mache ich es richtig?

Danke für Tipps und Infos.

Gruß

Harald Friis

*Code:

Sub Test()

' set variables
Dim iBrief As Integer, sBrief As String
Dim AppShell As Object
Dim BrowseDir As Variant
Const Path As String = "M:\Test\Ergebnis\"

' 01_Brief_A
Documents.Open FileName:="M:\Test\01_Brief_A.docx", _
ConfirmConversions:=False, ReadOnly:=False, AddToRecentFiles:=False, _
PasswordDocument:="", PasswordTemplate:="", Revert:=False, _
WritePasswordDocument:="", WritePasswordTemplate:="", Format:= _
wdOpenFormatAuto, XMLTransform:=""

On Error GoTo ErrorHandling

' hide application for better performance
Application.Visible = False

' create bulkletter and export as word
With ActiveDocument.MailMerge
.DataSource.ActiveRecord = 1
Do
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = .ActiveRecord
.LastRecord = .ActiveRecord
sBrief = Path & .DataFields("Name") & "_" &
.DataFields("Vorname") & "_01_Brief_A"
End With
.Execute Pause:=False

If .DataSource.DataFields("Name").Value > "" Then
ActiveDocument.SaveAs FileName:=sBrief
End If
ActiveDocument.Close False

If .DataSource.ActiveRecord < .DataSource.RecordCount Then
.DataSource.ActiveRecord = wdNextRecord
Else
Exit Do
End If
Loop
End With


' 01_Brief_B
Documents.Open FileName:="M:\Test\01_Brief_B.docx", _
ConfirmConversions:=False, ReadOnly:=False, AddToRecentFiles:=False, _
PasswordDocument:="", PasswordTemplate:="", Revert:=False, _
WritePasswordDocument:="", WritePasswordTemplate:="", Format:= _
wdOpenFormatAuto, XMLTransform:=""

On Error GoTo ErrorHandling

' hide application for better performance
Application.Visible = False

' create bulkletter and export as word
With ActiveDocument.MailMerge
.DataSource.ActiveRecord = 1
Do
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = .ActiveRecord
.LastRecord = .ActiveRecord
sBrief = Path & .DataFields("Name") & "_" &
.DataFields("Vorname") & "_01_Brief_B"
End With
.Execute Pause:=False

If .DataSource.DataFields("Name").Value > "" Then
ActiveDocument.SaveAs FileName:=sBrief
End If
ActiveDocument.Close False

If .DataSource.ActiveRecord < .DataSource.RecordCount Then
.DataSource.ActiveRecord = wdNextRecord
Else
Exit Do
End If
Loop
End With



' error handling
ErrorHandling:
Application.Visible = True

If Err.Number = 76 Then
' MsgBox "Der ausgewählte Speicherort ist ungültig", vbOKOnly +
vbCritical
ElseIf Err.Number = 5852 Then
' MsgBox "Das Dokument ist kein Serienbrief"
ElseIf Err.Number = 4198 Then
' MsgBox "Der ausgewählte Speicherort ist ungültig", vbOKOnly +
vbCritical
ElseIf Err.Number = 91 Then
' MsgBox "Exportieren von Serienbriefen abgebrochen", vbOKOnly
+ vbExclamation
ElseIf Err.Number > 0 Then
' MsgBox "Unbekannter Fehler: " & Err.Number & " - Bitte Makro
erneut ausführen.", vbOKOnly + vbCritical
Else
' MsgBox "Serienbriefe erfolgreich exportiert", vbOKOnly +
vbInformation
End If

Application.Quit savechanges:=False

End Sub

Wolfram Jahn

unread,
Feb 25, 2018, 7:09:43 AM2/25/18
to
Am 25.02.18 um 11:55 schrieb Harald Friis:
> Hallo,
>
> falls hier noch einige Menschen mitlesen...

Na sicher.

---

Mir fällt auf, dass ich in Deinem Beispielcode nirgends den im Text
erwähnten 'strPfad' finde.

Prüf doch mal, ob wirklich alle Variablennamen übereinstimmen.

Ich habe zu VBA Zeiten auch immer soo gerne Variablennamen verbessert
und dann eine entscheidende Stelle vergessen.

Mein jetziger Liebling Perl weist mich schonend darauf hin, wenn die
(falsch geschriebene) Variable nur einmal vorkommt.


Harald Friis

unread,
Feb 25, 2018, 11:18:56 AM2/25/18
to
Hallo,

Am 25.02.2018 um 13:09 schrieb Wolfram Jahn:
> Am 25.02.18 um 11:55 schrieb Harald Friis:
>> Hallo,
>>
>> falls hier noch einige Menschen mitlesen...
>
> Na sicher.

das ist gut ;-)


> Mir fällt auf, dass ich in Deinem Beispielcode nirgends den im Text
> erwähnten 'strPfad' finde.

Das war im Fließtext, den du nicht mit kopiert hast. Im Code war ein

'Const Path As String = "M:\Test\Ergebnis\" '

das möchte ich ersetzen durch ein 'strPfad'

Dadurch sollte sich - nach meiner Hoffnung - die Codezeile:

alt: 'Documents.Open FileName:="M:\Test\01_Brief_A.docx" '
ändern zu
neu: 'Documents.Open FileName:=strPfad & "01_Brief_A.docx"

und die Codezeile:

alt: 'sBrief = Path & .DataFields("Name") & "_" &
..DataFields("Vorname") & "_01_Brief_A" '
ändern zu
neu: 'sBrief = strPfad & "Ergebnis\" & .DataFields("Name") & "_" &
..DataFields("Vorname") & "_01_Brief_A" '

Das klappt aber bislang leider nicht

Gruß

Harald Friis

Wolfram Jahn

unread,
Feb 25, 2018, 4:15:05 PM2/25/18
to
Am 25.02.18 um 17:18 schrieb Harald Friis:
> Hallo,
>
> Am 25.02.2018 um 13:09 schrieb Wolfram Jahn:
>> Am 25.02.18 um 11:55 schrieb Harald Friis:
>>> Hallo,
>>>
>>> falls hier noch einige Menschen mitlesen...
>>
>> Na sicher.
>
> das ist gut ;-)
>
>
>> Mir fällt auf, dass ich in Deinem Beispielcode nirgends den im Text
>> erwähnten 'strPfad' finde.
>
> Das war im Fließtext, den du nicht mit kopiert hast. Im Code war ein
>
> 'Const Path As String = "M:\Test\Ergebnis\" '
>

...


> Das klappt aber bislang leider nicht
>
> Gruß
>
> Harald Friis

Schade, hat nicht geklappt; ich dachte es wäre vielleicht was ganz
einfaches. :-)

Hast du denn mal durchgestepped im Einzelschritt Modus und geschaut, was
in den Variablen während dessen so alles drin steht?

Die VBA Umgebung ist doch da sehr komfortabel.

Ich habe schon öfter direkt im Debugger entwickelt und fand es sehr
effizient, vor allem bei kleinen aber hakligen Problemen.

Harald Friis

unread,
Feb 27, 2018, 5:16:01 PM2/27/18
to
Hallo,

hat niemand eine Idee?

Danke

Harald Friis
> ..DataFields("Vorname") & "_01_Brief_A"
> ..DataFields("Vorname") & "_01_Brief_B"

Carlos Naplos

unread,
Feb 28, 2018, 1:10:19 AM2/28/18
to
An welcher Stelle steigt Dein Makro denn aus?
Bei Documents.Open FileName:=strPfad & "01_Brief_A.docx" ?

Dann setze in der Zeile davor doch mal:
Debug.Print Documents.Open FileName:=strPfad & "01_Brief_A.docx"

Und schau Dir die Ausgabe im Direktbereich an!

Was ich nicht verstehe, ist die Wertzuweisung zu der Variablen "strPfad"
und das (anschließende) Öffnen der Datei:

"ActiveDocument.Path" ist leer, wenn kein Dokument geöffnet ist.
Wenn aber das Dokument schon geöffnet ist, dann brauchst Du kein
"Documents.Open" mehr.

Gruß CN

Harald Friis

unread,
Feb 28, 2018, 2:19:33 PM2/28/18
to
Hallo,

oh, Asche auf mein Haupt. Herzlichen Dank an euch, dass ihr mir die
Tomaten weggenommen habt.

Es war alles richtig, was ich in das Makro geschrieben habe. Nur
schließt mein Makro alle Dokumente, ohne sie zu speichern. Deshalb waren
die Änderungen im Makro wieder weg...

Nun klappt alles, wie gewünscht.

Am 28.02.2018 um 07:10 schrieb Carlos Naplos:

> Was ich nicht verstehe, ist die Wertzuweisung zu der Variablen "strPfad"
> und das (anschließende) Öffnen der Datei:
>
> "ActiveDocument.Path" ist leer, wenn kein Dokument geöffnet ist.
> Wenn aber das Dokument schon geöffnet ist, dann brauchst Du kein
> "Documents.Open" mehr.

Das passt schon: Dokument mit Makro wird im "ActiveDocument.Path"
geöffnet. Vom Makro werden dann (im selben Pfad, also im strPfad) alle
weiteren Dokumente geöffnet und mit den Daten aus dem Daten-Excel
gefüllt. Der Serienbrief wird dann Dokument für Dokument im strPfad &
"Ergebnis\" gespeichert.


Danke nochmals

Gruß

Harald Friis

Wolfram Jahn

unread,
Mar 1, 2018, 3:15:56 PM3/1/18
to
Am 28.02.18 um 20:19 schrieb Harald Friis:
Ende gut, alles gut.

(Und glaub bloß nicht dass du eine Exklusivlizenz auf sowas hast!)
0 new messages