MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Office > Microsoft Word
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 21.05.2019, 20:14   #1
Lichtwelle
Neuer Benutzer
Neuer Benutzer
Standard VBA - Fußnoten über Makro einfügen

Hallo,

in Excel programmiere ich ein Makro, das Word-Dateien generiert. Abhängig von den Eingaben in dem Excel-Formular werden in Word gewisse Textbausteine verwendet und diese oder jene Zahlen / Worte usw. geschrieben.

Aktuell kämpfe ich besonders mit der Frage, wie dieses Makro eine generierte Word-Datei mit Fußnoten versehen soll. Die Fußnote soll links ein bestimmtes Wort (Titel des Dokuments) und rechts die Seitenzahl (nach dem Muster Seitennummer / Seitenzahl) enthalten.

Wie programmiert man das? Was ist der Code? Ich habe schon einiges recherchiert aber alles, was ich bis Dato im Netz gefunden habe, generiert systematisch den einen oder anderen Fehler. Ich habe auch umgekehrt ein Makro mit Word aufgezeichnet aber wenn ich den Code dann in das Excel-Makro einbaue, klappt es nicht.

Hat jemand eine Idee? Gehört meine Frage vielleicht ins Excel-Forum?

Ich arbeite mit Office 2016. Das Programm soll auch auf anderen Rechnern mit Office 2016 laufen, also keine User-spezifische Parameter verwenden.

Im Voraus vielen Dank für eure Hilfe!
Lichtwelle ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2019, 00:13   #2
Gerhard H
MOF Guru
MOF Guru
Standard

Hallo Lichtwelle,

ich nehm mal an, du meinst keine Fußnoten, sondern eine Fußzeile. Dann gilt es vor dem Programmieren noch zu bedenken, dass es in Word außer der "normalen" (primären) Fußzeile auch noch Fußzeilen nur für die erste Zeile und Fußzeilen für gerade / ungerade Seiten gibt. Wenn das Dokument mehrere nicht miteinander verbundene Abschnitte enthält, vervielfachen sich u.U. die genannten Fußzeilen mit jedem Abschnitt.

Der Code für eine normale Fußzeile in einem Dokument mit nur einem Abschnitt lautet, unter der Voraussetzung, dass du das Word-Dokument als Objektvariable bereits erzeugt ist, z.B. so:
Code:

Set fussBereich = wrdDoc.Sections(1).Footers(wdHeaderFooterPrimary).Range
fussBereich.InsertAfter wrdDoc.BuiltInDocumentProperties(wdPropertyTitle) _
& vbTab & vbTab  ' & hier den Textbaustein für die Seitenzahlen
Für Kombination aus Seitenzahl und Gesamtseitenzahl würde ich die beiden zuständigen Felder als Autotext abspeichern und in einem Aufwasch einfügen.

__________________

Gruß
Gerhard
Gerhard H ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2019, 05:36   #3
Lichtwelle
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Danke für die blitzschnelle Antwort!

Ja, ich meinte Fußzeile.

Ich habe den Code eingebaut aber bekomme folgenden Fehler: "Fehler beim kompilieren: Variable nicht definiert". Scheinbar stört er sich an "wdHeaderFooterPrimary". Ich habe also wdHeaderFooterPrimary als String definiert und dem einen Textinhalt zugewiesen (vor dem Code, den du mir gegeben hast, natürlich):

Dim wdHeaderFooterPrimary As String
wdHeaderFooterPrimary = "Name der Datei"

War das falsch?

Ich habe es nochmal kompiliert und es kam die gleiche Fehlermeldung aber scheinbar stört er sich nun an wrdDoc. Das Word-Dokument ist als Objektvariable bereits erzeugt aber ich hatte es ObjWord genannt, also nehme ich folgenden Code:

Dim wdHeaderFooterPrimary As String
wdHeaderFooterPrimary = "Vorlage"
Set fussBereich = ObjWord.Sections(1).Footers(wdHeaderFooterPrimary).Range
fussBereich.InsertAfter ObjWord.BuiltinDocumentProperties(wdPropertyTitle) & vbTab & vbTab ' & hier den Textbaustein f?r die Seitenzahlen

Nun stört er sich an fussbereich, mit der gleichen Fehlermeldung...

Was soll ich dann machen? Danke im Voraus.
Lichtwelle ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2019, 07:25   #4
Gerhard H
MOF Guru
MOF Guru
Standard

Hallo Lichtwelle,

wdHeaderFooterPrimary ist eine Word-Konstante, keine Variable. Die musst du nicht deklarieren. Allerdings darfst du, da du Word von Excel aus steuerst, nicht die textliche Form dieser Konstanten verwenden, sondern die numerische. Daran hab ich nicht gedacht, sorry.

Diese Konstanten findest du in der Word-VBA-Hilfe unter dem Stichwort WdHeaderFooterIndex-Enumeration

Auch die Dokument-Eigenschaft-Konstante musst du als Zahlenwert einsetzen (siehe WdBuiltInProperty-Enumeration). Hier mal ein kleines Gesamtwerk, wobei ich als Dokumenteigenschaft den Autor eingesetzt habe, da ein neu geöffnetes Dokument ja noch keinen Titel hat.
Code:

Sub fuss()
Dim WordObj As Object, wordDoc As Object, fussbereich As Object

Set WordObj = CreateObject("Word.Application")
WordObj.Visible = True
Set wordDoc = WordObj.documents.Add

'oder bereits vorhandenes Dokument öffnen:
'Set wordDoc = documents.Open('hier Pfad und Dateiname)

Set fussbereich = wordDoc.sections(1).footers(1).Range
fussbereich.InsertAfter wordDoc.BuiltinDocumentProperties(3)
End Sub

__________________

Gruß
Gerhard
Gerhard H ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2019, 13:33   #5
Lichtwelle
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hi danke für die Rückmeldung.

Wir kommen dem ganzen schon näher aber funktionieren tut es noch nicht so richtig. Mit dem letzten Vorschlag hat Excel eine 2. Datei aufgemacht und ganz oben im Textkörper den Inhalt der Fußzeile geschrieben. Ich glaub aber, ich habe mich nicht klar ausgedruckt.

Die Word-Datei ist bereits vorhanden: das Excel-Makro hat das Dokument neu erstellt, einiges drin geschrieben und es ist noch nicht gespeichert. Es muss m.M.n. kein neues Makro generiert werden sondern ich möchte den Code einfach dem bestehenden Code hinzufügen.

Zu Beginn des Makros habe ich
Dim ObjWord as Object
Set ObjWord = CreateObject("Word.application")
With ObjWord.Application
.Visible = True
.documents.Add Template:="Normal", NewTemplate:=False, DocumentType:=0
[ab hier schreibt das Excel-Makro ein Haufen Zeug in Word]

[am Ende soll das Makro eine Fußzeile in dem offenen Dokument einfügen. Mit diesem Teil habe ich noch zu kämpfen...]

[Abschluss mit]
End With
Set ObjWord = Nothing
Danke für die Hilfe.
Lichtwelle ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2019, 14:59   #6
Gerhard H
MOF Guru
MOF Guru
Standard

Hallo Lichtwelle,

"Mit dem letzten Vorschlag hat Excel eine 2. Datei aufgemacht und ganz oben im Textkörper den Inhalt der Fußzeile geschrieben."

Wieso eine zweite? Es sollte 1 neue sein. Und der Inhalt der Fußzeile wird bei dir auch dann in den Textkörper geschrieben, wenn du das Makro aus Beitrag #4, so wie es ist, nach Excel kopierst und von dort laufen lässt? Bei mir nicht.

Mach es doch so wie vorgeschlagen: Nicht nur die Word-Instanz, sondern auch das Word-Dokument und den Fußnotenbereich zum Objekt machen, dann kannst du dein Zeug auch gezielt abfüllen, also z.B. so:
Code:

Sub fuss()
Dim WordObj As Object, wordDoc As Object, fussbereich As Object

Set WordObj = CreateObject("Word.Application")
WordObj.Visible = True

Set wordDoc = WordObj.documents.Add(Template:="Normal", NewTemplate:=False, DocumentType:=0)
Set fussbereich = wordDoc.sections(1).footers(1).Range

'[ab hier schreibt das Excel-Makro ein Haufen Zeug in Word]
    'also arbeitest du ab hier auch mit dem Object WordDoc, es sei denn,
    'du hast auch Einstellungen zu treffen, die die Application und nicht das Dokument betreffen, z.B.
With wordDoc
    .PageSetup.Orientation = 1  '(Querformat, als Beispiel für 1 Zeug)
    .paragraphs(1).range.text = "Ich bin das neue Dokument" 'Ersten Absatz füllen, als Beispiel für 1 weiteres Zeug)
    'und so auch den Fußzeilenbereich
    fussbereich.InsertAfter .BuiltinDocumentProperties(3)
End With
End Sub
Falls du weiter Probleme damit hast, kopier zur Fehlereingrenzung bitte dieses Makro erst mal so, wie es ist in ein Modul deiner Excel-Mappe. Wenn es dort auch Fehler gibt, liegts an meinem Makro, wenn nicht, dann an deiner Umsetzung. Je nachdem muss es dann weiter gehen.

__________________

Gruß
Gerhard

Geändert von Gerhard H (22.05.2019 um 15:03 Uhr).
Gerhard H ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2019, 20:14   #7
Lichtwelle
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hi Gerhard,

Ich habe dein Makro aus dem letzten Beitrag in ein Modul eingegeben und lasse mein ursprüngliches Makro dein Makro aufrufen (Call fuss).

Ergebnis:
- an meiner ursprünglichen Word-Datei wird nichts geändert
- es wird aber eine 2. Word-Datei mit Querformat eröffnet. Im Textkörper kommt "ich bin das neue Dokument" und in der Fusszeile steht mein Vor- und Nachname.

Nun, wie schafft man es, dass keine 2. Datei eröffnet wird sondern in der bestehenden und noch offenen Word-Datei eine Fusszeile eingefügt wird? (links: Vorlage, rechts: Seite / Seitenzahl). Ich habe schon einige Sachen ausprobiert aber er meckert ständig...
Lichtwelle ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.05.2019, 21:59   #8
Gerhard H
MOF Guru
MOF Guru
Standard

Hallo nochmal,

"es wird aber eine 2. Word-Datei mit Querformat eröffnet.." Ist ja auch kein Wunder: In deinem Code lässt du ja auch ein neues Dokument erstellen:
Code:

.documents.Add Template:="Normal", NewTemplate:=False, DocumentType:=0
Das hab ich übernommen, weil ich dachte, du wolltest das so, zumal du geschrieben hast: "in Excel programmiere ich ein Makro, das Word-Dateien generiert" . Und Generieren beginnt halt nun mal mit einem neuen leeren Dokument.

Dann aber muss dieses Dokument das Ziel deiner Bearbeitung sein, und im Weiteren Verlauf dieses Codes kommt all dein gesamtes Zeug rein, wie im Beitrag 6 angedeutet. Und nicht ein - aus mir unbekannten Gründen - anderes bereits geöffnetes Dokument.

Falls du mit Generieren meinst, dass du ein ein bereits gespeichertes Dokument öffnen und weiterbearbeiten willst, würde die entsprechend Zeile lauten:
Code:

Set wordDoc = Wordobj.documents.Open(Pfad & Dateiname)
Vielleicht solltest du mal ein bisschen mehr Code herzeigen und dabei erklären, warum dein Makroschnipsel einerseits ein neues Dokument aufmacht und andererseits ein schon geöffnetes anderes Dokument bearbeiten soll.

Dann erst können wir uns über die Fehlermeldungen unterhalten, wobei dir klar ist, dass "ich hab schon einiges probiert" danach schreit, das auch herzuzeigen, und "aber er meckert ständig" eine denkbar schlechte Fehlerbeschreibung ist. Wahrscheinlich ist "er" eh eine Frau, aber das tut nichts zur Sache.

__________________

Gruß
Gerhard
Gerhard H ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 23.05.2019, 05:14   #9
Lichtwelle
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hi Gerhard,

danke für deinen Einsatz. Ich habe mir deine Beiträge noch angeschaut, durch den Kopf gehen lassen und dein Makro ein wenig gekürzt. Folgendes habe ich am Ende meines Makros eingefügt:


Dim wordDoc As Object, fussbereich As Object

Set wordDoc = ObjWord.ActiveDocument
Set fussbereich = wordDoc.sections(1).footers(1).Range

With wordDoc
fussbereich.InsertAfter .BuiltinDocumentProperties(3)
End With

Jetzt klappt es schon ziemlich gut: Der Rechner eröffnet keine 2. Datei sondern schreibt meinen Namen in der Fusszeile. Na das ist schon ein Riesenschritt nach vorne.

Jetzt muss ich noch ein wenig tüfteln, damit er nicht meinen Namen sondern den gewünschten Text einfügt, also "Vorlage soundso 1 / 6". Das probiere ich heute noch im Büro aus.

Das müsste gehen.

Vielen Dank!
Lichtwelle ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 23.05.2019, 14:47   #10
Lichtwelle
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hi,

ich habe den folgenden Text eingegeben und erziele schon Teilerfolge:
Dim WordDoc as Object
Dim Fusszeile as Object

Set WordDoc = ObjWord.ActiveDocument
Set Fusszeile = WordDoc.sections(1).footers(1).Range

Fusszeile.InsertAfter "Vorlage soundso" & vbTab & vbTab
Also Vorlage soundso wird in der Fusszeile geschrieben, das ist schon eine gute Sache. An folgenden Punkten arbeite ich noch:

- Wie kann ich die Seitennummer und die Seitenzahl anzeigen lassen? Der Text, den ich bei der Makroaufzeichnung extrahiert hatte (Text:="PAGE *Arabic " usw.), funktioniert nicht bzw. es wird keine Formel eingefügt sondern den Text "PAGE...". Noch nicht ganz das, wonach ich suche...

- Wie kann ich Änderungen an der Schriftart, -größe und -farbe vornehmen? Wenn ich mit Selection.Font. usw. arbeite, tut sich in der Fusszeile nichts, im Haupttext schon. Scheinbar muss man die Fusszeile anders ansprechen. Aber wie?

Vielen Dank für die Hilfe.
Lichtwelle ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 23.05.2019, 16:17   #11
Gerhard H
MOF Guru
MOF Guru
Standard

Hallo Lichtwelle,

zunächst muss ich Bedenken anmelden. Die Zeile
Set WordDoc = ObjWord.ActiveDocument geht höchstens dann gut, wenn entweder zum Zeitpunkt des Makroablaufs nur 1 Dokument offen ist oder (bei mehreren) zufällig dasjenige das aktive ist, das du auch meinst.

Sicherer wäre es da, die offenen Dokumente durchzuschleifen, und auf eine eindeutige Eigenschaft hin zu untersuchen. Das Dokument mit dieser Eigenschaft wird dann zum Objekt WordDoc gemacht.

Leider hab ich aber keine Ahnung, wie man aus Excel heraus die Anzahl der geöffneten Word-Dokumente feststellt. Das kann dir vielleicht jemand anderes beantworten. Und wieso du auf ein schon offenes Dokument zugreifen musst, wo du doch angeblich ein Dokument generierst, hab ich immer noch nicht verstanden. Wer macht das eigentlich bei welcher Gelegenheit auf? Woher weißt du, dass es dasjenige ist, das du (weiter?)bearbeiten musst? Was ist denn da schon drin?

Deine letzte Frage ist wieder einfach: Selection.Font bearbeitet halt die Schrift, die grad markiert ist. Du müsstest also erst mal in die Fußzeile springen. Hast du aber gar nicht nötig, denn die Fußzeile wurde doch grad vorher zum Range-Objekt gemacht, das man wunderbar ansprechen kann.
Nach dieser Zeile
Code:

Set Fusszeile = WordDoc.sections(1).footers(1).Range
kannst du weiter machen mit:
Code:

fusszeile.font.size = ....
fusszeile.font.name = ...
usw. Ich würd es trotzdem anders lösen, im Zusammenhang mit der vorhergehenden Frage nach den Seitenzahlen:
du kannst Felder nicht als Text eintippen, sondern nur über fields.add erstellen. Einfacher wäre es u.U. die komplette Fußzeile als Autotext zu erfassen und diesen dann in einem Aufwasch in die Fußzeile einfügen. Kommt natürlich drauf an, ob bzw. welche Teile du drin hast, die variabel sein müssen.

__________________

Gruß
Gerhard
Gerhard H ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 23.05.2019, 20:21   #12
Lichtwelle
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hi Gerhard,

das mit ActiveDocument ist ok: Excel öffnet ein neues Word-Dokument, schreibt Dinge drin und anschließend kommt die Fusszeile. Es wird also immer das aktive Dokument angesprochen (das noch nicht gespeichert ist).

Folgenden Code habe ich verwendet (steht am Ende des Makros):

Dim WordDoc As Object
Dim Fusszeile As Object

Set WordDoc = ObjWord.ActiveDocument
Set Fusszeile = WordDoc.sections(1).footers(1).Range

Fusszeile.Font.Name = "Arial"
Fusszeile.Font.Size = 8

Fusszeile.InsertAfter "Vorlage soundso" & vbTab & vbTab

Ich weiß nicht, was es mit dem Range ansprechen auf sich hat. Wie macht man das? Aber benötigt man das auch?

Wie kann ich nun in der Fusszeile rechts die Seitennummer / Seitenzahl anzeigen lassen? Wie geht es mit fields.add?

AutoText ist mir auch ein Rätsel...

Sorry, diese Fachbegriffe sind mir nicht gängig.
Lichtwelle ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 24.05.2019, 00:30   #13
Gerhard H
MOF Guru
MOF Guru
Standard

Hallo Lichtwelle,

"AutoText ist mir auch ein Rätsel..."
Langsam komm ich ins Grübeln. Schriebst du nicht in deinem ersten Beitrag: "...werden in Word gewisse Textbausteine verwendet.."? Sind das keine Autotexte? Ich dachte, du weißt, was du tust?

Die Autotext-Idee wäre eine sehr elegante Lösung, vorausgesetzt, es wird mit eigenen Dokumentvorlagen gearbeitet. Dein geheimnisvolles offenes ungespeichertes Dokument beruht, soweit ich weiß, auf der normal.dotm. Dann wird die Autotext-Methode nur auf deinem eigenen Computer funktionieren, weil du den Autotext nicht weitergeben kannst.

Da ich aber annehme, dass du dein Dokument nicht nur für dich verwenden willst, schlage ich vor, die Einzelteile der Fußzeile in einer Tabelle unterzubringen. Dass sie vierspaltig ausgefallen ist, kommt daher, dass es mir nicht gelungen ist, per VBA hinter das Seitenzahlfeld noch weiteren Text einzufügen. Frag mich nicht warum.

Hier das nur grob formatierte Beispiel:
Code:

Sub fuss()
Dim WordObj As Object, wordDoc As Object, fussbereich As Object
Dim wordTabelle As Object, rngSeite As Object

Set WordObj = CreateObject("Word.Application")
WordObj.Visible = True

Set wordDoc = WordObj.documents.Add 'das mit ActiveDocument musst du selber machen
Set fussbereich = wordDoc.sections(1).footers(1).Range
Set wordTabelle = wordDoc.tables.Add(fussbereich, 1, 4)

With wordTabelle
    
    'Vorspann
    .Cell(1, 1).Range.Text = "Das ist der erste Teil der Fusszeile        Seite"
    
    'Bereich fürs Feld Seitennummer
    Set rngSeite = .Cell(1, 2).Range
    rngSeite.Collapse
    wordDoc.Fields.Add rngSeite, 33 '33 = wdFieldPage
    
    .Cell(1, 3).Range.Text = "von"
    
    'Bereich für die Gesamtseitenzahl
    Set rngSeite = .Cell(1, 4).Range
    rngSeite.Collapse
    wordDoc.Fields.Add Range:=rngSeite, Type:=26 '33 = wdFieldNumPages
    .allowAutofit = True
    .autofitbehavior 1
End With

End Sub

__________________

Gruß
Gerhard
Gerhard H ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 25.05.2019, 19:42   #14
Lichtwelle
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hallo Gerhard,

es funktioniert wunderbar! Ich habe ein wenig getüftelt, damit die Optik mit den Spaltenbreiten stimmt und nun sieht es ganz gut aus.

Riesendank an dich für deine Hilfe.
Lichtwelle ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:43 Uhr.



Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.