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-ID: 251769

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

Ausgedruckt am: 22.11.2024 um 19:11 Uhr

JoeTee
Lösung JoeTee 13.10.2014, aktualisiert am 22.10.2014 um 12:46:37 Uhr
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
bluepython
bluepython 13.10.2014 um 13:58:43 Uhr
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.
JoeTee
JoeTee 13.10.2014 um 14:15:23 Uhr
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
colinardo
colinardo 13.10.2014 aktualisiert um 19:28:50 Uhr
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
bluepython
bluepython 13.10.2014 um 15:16:01 Uhr
Goto Top
Hallo,

und danke erstmal für den Code, ich werde es morgen testen und ein Feedback geben.
JoeTee
JoeTee 13.10.2014 um 15:57:41 Uhr
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)
bluepython
bluepython 14.10.2014 um 11:45:19 Uhr
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
colinardo
Lösung colinardo 14.10.2014, aktualisiert am 22.10.2014 um 12:46:24 Uhr
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.
bluepython
bluepython 14.10.2014 um 11:59:52 Uhr
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
colinardo
Lösung colinardo 14.10.2014, aktualisiert am 22.10.2014 um 12:46:16 Uhr
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.
bluepython
bluepython 22.10.2014 um 12:53:26 Uhr
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.
colinardo
colinardo 22.10.2014 aktualisiert um 13:17:21 Uhr
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
JoeTee
Lösung JoeTee 22.10.2014 aktualisiert um 13:17:16 Uhr
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.
bluepython
bluepython 22.10.2014 um 13:18:42 Uhr
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.
colinardo
colinardo 22.10.2014 aktualisiert um 13:25:24 Uhr
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