bluepython
Goto Top

Word Formularfelder füllen mit Daten aus Excel

Hallo,
in einer Wordvorlage sollen bestimmte Felder wie Name, Vorname, Durchwahl, etc. automatisch gefüllt werden.
Die benötigten Daten stehen in einer Excel Tabelle. Beim öffnen der Vorlage soll der aktuell angemeldete User ausgelesen werden, dieser dann in der Exceltabelle gesucht werden und die dazugehörigen Daten in die Wordvorlage übernommen.
Das Auslesen des Benutzers habe ich schon erledigt, lasse mir diesen aktuell in einer MsgBox ausgeben.
Nun komme ich aber leider nicht mehr weiter.

Content-Key: 251769

Url: https://administrator.de/contentid/251769

Printed on: April 16, 2024 at 05:04 o'clock

Member: JoeTee
Solution JoeTee Oct 13, 2014, updated at Oct 22, 2014 at 10:46:37 (UTC)
Goto Top
Hallo,

die Frage könnte mit Hilfe von VBA gelöst werden. Die Stellen in dem Word-Dokument, die mit den Daten gefüllt werden sollen, werden als Bookmark/Textmarke mit eindeuztigen Namen angelegt und im Word-Dokument gespeichert.

Über die API Get UserName kann der angemeldete User gefunden werden; diesen mit der Find-Methode des Range-Objektes in Deiner Excel-Mappe suchen. Sofern er gefunden wurden, aus dem Excel heraus DAS Word-Dokument öffnen (z.b. Dim wrd as object, Set wrd=createobject("word.application"), wrd.activedocument.bookmarks.item("eindeutiger Name").range.text=WErt aus Excel-Zelle

Grüsse
JoeTee
Member: bluepython
bluepython Oct 13, 2014 at 11:58:43 (UTC)
Goto Top
Hallo JoeTee,

der Ansatz klingt ganz gut, nur möchte ich die Excel Datei im Grunde gar nicht öffnen, höchstens im Hintergrund.
Der Username wird in dem Word-Dokument ausgelesen mit Get UserName und dann soll vie Makro die Excel Datei durchsucht werden.
Member: JoeTee
JoeTee Oct 13, 2014 at 12:15:23 (UTC)
Goto Top
Moin,

der Lösungsweg hängt immer davon ab, wo die Quelle der Daten, der Dateien ist. Ich war in der Annahme, das Excel-DOkument ist das führende Medium ggf. mit Daten, die nicht alle User haben, und das Word-Dokument der prozessulae Output von dem IT-Prozess.

Wenn das Word-Dokument an User geht, wäre die Einbindung von Code in das Dokument zu überdenken. Der WEg ist ähnlich. Mit der API den Usernamen auslesen (ACHTUNG: WIn64 verlangt andere Deklarationen !) und aus Word heraus die Ecel-mappe öffnen und mit Range und Find den Usernamen suchen.

Grüsse
JoeTee
Member: colinardo
colinardo Oct 13, 2014 updated at 17:28:50 (UTC)
Goto Top
Moin zusammen,
das genannte mal zusammengefasst:
'Usernamen auslesen  
Set objShell = CreateObject("Wscript.Shell")  
strUsername = objShell.ExpandEnvironmentStrings("%username%")  

'Excel Objekt erzeugen  
Set objExcel = CreateObject("Excel.Application")  
'Excel unsichtbar machen  
objExcel.Visible = False
'Exceldatei öffnen  
Set wb = objExcel.Workbooks.Open("C:\Ordner\excelfile.xlsx")  
'Tabellenblat festlegen  
Set ws = wb.Worksheets(1)
'Range festlegen in dem nach dem Namen gesucht wird (im Beispiel Spalte A)  
Set rngSearch = ws.Range("A:A")  
'Usernamen in dem Bereich finden  
Set search_result = rngSearch.Find(strUsername,,-4163,1)
'Wenn eine Übereinstimmung gefunden wurde...  
If Not search_result Is Nothing Then
	' Als Beispiel Die Textmarke mit den Namen XXXXX durch den Text der Zelle nebenan einfügen....  
	ActiveDocument.Bookmarks("XXXX").Range.Text = search_result.Offset(0,1).Value  
End If
'Workbook schließen (ohne zu speichern)  
wb.Close False
'Excel beenden  
objExcel.Quit
Grüße Uwe
Member: bluepython
bluepython Oct 13, 2014 at 13:16:01 (UTC)
Goto Top
Hallo,

und danke erstmal für den Code, ich werde es morgen testen und ein Feedback geben.
Member: JoeTee
JoeTee Oct 13, 2014 at 13:57:41 (UTC)
Goto Top
zu Zeile 10

ggf. noch die Excel-Mappe nur im "Read-Only-Modus" öffnen

Set wb = objExcel.Workbooks.Open ("C:\Ordner\excelfile.xlsx",ReadOnly=True)
Member: bluepython
bluepython Oct 14, 2014 at 09:45:19 (UTC)
Goto Top
Hallo,

bin das ganze am Testen, das Macro bircht an der Stelle
ActiveDocument.Bookmarks("Vorname").Range.Text = search_result.Offset(0, 1).Value
ab, mit dem Fehler:
Laufzeitfehler 6028, Der Bereich kann nicht gelöscht werden
Member: colinardo
Solution colinardo Oct 14, 2014, updated at Oct 22, 2014 at 10:46:24 (UTC)
Goto Top
Zitat von @bluepython:
bin das ganze am Testen, das Macro bircht an der Stelle
ActiveDocument.Bookmarks("Vorname").Range.Text = search_result.Offset(0, 1).Value
ab, mit dem Fehler:
Laufzeitfehler 6028, Der Bereich kann nicht gelöscht werden
Worin befindet sich dein Bookmark ? Ich hoffe nicht das es ein geschütztes Formularfeld umschließt... By the way Formularfelder lassen sich mit Namen ansprechen ohne ein Bookmark zu verwenden.
Member: bluepython
bluepython Oct 14, 2014 at 09:59:52 (UTC)
Goto Top
Habe den Fehler gerade gefunden, die Textmarke war Falsch, ich hatte ein Textformularfeld, dieses kann wohl nicht überschrieben werden. Lässt man es weg und setzt an dieser stelle eine Textmarke (Einfügen, Textmarke) dann klappt das ganze.

Vielen Dank für die Hilfe
Member: colinardo
Solution colinardo Oct 14, 2014, updated at Oct 22, 2014 at 10:46:16 (UTC)
Goto Top
Zitat von @bluepython:

Habe den Fehler gerade gefunden, die Textmarke war Falsch, ich hatte ein Textformularfeld, dieses kann wohl nicht
überschrieben werden. Lässt man es weg und setzt an dieser stelle eine Textmarke (Einfügen, Textmarke) dann klappt
das ganze.
Formularfelder kannst du direkt so ansprechen und deren Inhalt setzen, ohne extra ein Bookmark zu erstellen:
ActiveDocument.FormFields("NameDesFeldes").Result = search_result.Offset(0, 1).Value
Das Dokument kann dabei geschützt bleiben.
Member: bluepython
bluepython Oct 22, 2014 at 10:53:26 (UTC)
Goto Top
Hallo,
ich muss mich noch mal zu Wort melden.
Das hier ist mein endgültiger Code, der auch sehr schön funktioniert.

Sub AutoOpen()

'Usernamen auslesen
Set objShell = CreateObject("Wscript.Shell")
strUsername = objShell.ExpandEnvironmentStrings("%username%")
'MsgBox (strUsername)

'Excel Objekt erzeugen
Set objExcel = CreateObject("Excel.Application")

'Excel unsichtbar machen
objExcel.Visible = False

'Exceldatei öffnen
Set wb = objExcel.Workbooks.Open("C:\Dokumente und Einstellungen\apyter\Desktop\Neuer Ordner\Personen_brief.xls", ReadOnly = True)

'Tabellenblat festlegen
Set ws = wb.Worksheets(1)

'Range festlegen in dem nach dem Namen gesucht wird (im Beispiel Spalte A)
Set rngSearch = ws.Range("A:A")

'Usernamen in dem Bereich finden
Set search_result = rngSearch.Find(strUsername, , -4163, 1)
'Wenn eine Übereinstimmung gefunden wurde...
If Not search_result Is Nothing Then
'Als Beispiel Die Textmarke mit den Namen XXXXX durch den Text der Zelle nebenan einfügen....
ActiveDocument.Bookmarks("Name").Range.Text = search_result.Offset(0, 1).Value
ActiveDocument.Bookmarks("Abteilung").Range.Text = search_result.Offset(0, 4).Value
ActiveDocument.Bookmarks("Telefon").Range.Text = search_result.Offset(0, 3).Value
ActiveDocument.Bookmarks("Fax").Range.Text = search_result.Offset(0, 5).Value
ActiveDocument.Bookmarks("Email").Range.Text = search_result.Offset(0, 2).Value
ActiveDocument.Bookmarks("Funktion").Range.Text = search_result.Offset(0, 6).Value
ActiveDocument.Bookmarks("Name_2").Range.Text = search_result.Offset(0, 1).Value
End If
'Workbook schließen (ohne zu speichern)
wb.Close False
'Excel beenden
objExcel.Quit

End Sub

Jetzt hätten wir noch ganz gerne in dem ganzen eine zusätzliche Option.
Es soll ein Fenster erscheinen, wo der aktuelle Benutzer angezeigt wird mit einer Abfrage, ob dieser benutzt werden soll, wenn nicht, dann soll man ein anderen eintragen können. Dieser soll dann in die Variable strUsername eingetragen werden und dann Rest wie jetzt auch.
Member: colinardo
colinardo Oct 22, 2014 updated at 11:17:21 (UTC)
Goto Top
Zitat von @bluepython:
Jetzt hätten wir noch ganz gerne in dem ganzen eine zusätzliche Option.
Es soll ein Fenster erscheinen, wo der aktuelle Benutzer angezeigt wird mit einer Abfrage, ob dieser benutzt werden soll, wenn nicht, dann soll man ein anderen eintragen können. Dieser soll dann in die Variable strUsername eingetragen werden und dann
Kein Problem, kannst du auf die Schnelle mit einer InputBox machen
strUsername = InputBox("Folgender Benutzername wird verwendet:", "Benutzername wählen", strUsername)  
oder mit zwischengeschalteter Abfrage via Msgbox:
If MsgBox("Es wird der Benutzername '" & strUsername & "' verwendet möchten sie Ihn übernehmen?", vbQuestion Or vbYesNo) = vbNo Then  
   strUsername = InputBox("Geben sie den gewünschten Benutzernamen ein:", "Benutzername wählen", strUsername)  
End If
Grüße Uwe
Member: JoeTee
Solution JoeTee Oct 22, 2014 updated at 11:17:16 (UTC)
Goto Top
soll der andere Benutzer ein beliebiger anderer sein oder aus der Liste der Excel-Mappe kommen ? In letzterem Falle würde das über einer UserForm aus der Excel-Mappe heraus angehen, welche mehr Freiheitsgrade als eine InputBox bietet.
Member: bluepython
bluepython Oct 22, 2014 at 11:18:42 (UTC)
Goto Top
Einer aus der Liste.
DANKE colinardo, funktioniert gut, genau das was ich haben wollte, im Grunde ganz einfach, aber manchmal sieht man den Wald vor lauter Bäumen nicht.
Member: colinardo
colinardo Oct 22, 2014 updated at 11:25:24 (UTC)
Goto Top
Zitat von @JoeTee:
In letzterem Falle würde das über einer UserForm aus der Excel-Mappe heraus angehen, welche mehr Freiheitsgrade als eine InputBox bietet.
Das lässt sich natürlich auch machen. Auf der Userform lässt sich dann eine Listbox automatisch mit den Usernamen aus einem Range füllen:
wenn die Usernamen z.B. in Spalte A liegen ginge dies so
ListBox1.List = Sheets(1).Range("A1", ws.Cells(ws.Rows.Count,1).End(-4162)).Value