Office:Word2010 Benutzerdaten aus ActiveDirectory verwenden

Aus Znilwiki
Wechseln zu: Navigation, Suche


*** Am 16.06.2011 überarbeitet - Ihr findet am Ende nun auch ein Beispiel das mit Suchen & Ersetzen arbeitet statt mit Formularfeldern ***

Important.png
Hinweis: Diese Anleitung ist für Word 2010. Das ganze funktioniert aber 1:1 ohne Änderungen auch unter Word 2013

Einleitung

Dies ist ein Beispiel für die Abfrage des Active Directory aus Word heraus mittels Visual Basic für Applikationen (VBA).

Weiter unten findet Ihr das Beispieldokument zum selber testen. Die Beispiele funktionieren natürlich nur, wenn diese von einem Domänenbenutzer durchgeführt werden - auf einem lokalen Rechner gibt es kein Active Directory.

Hier einmal die Demo-Datei: Media:ActiveDirectory-Test.docm.zip

Auf den Bilder könnt Ihr sehen was wir machen wollen - ein Word-Dokument mit 2 Schaltflächen.
Die erste Schaltfläche schreibt in alle Felder ein " - ", die zweite liest die AD-Daten des gerade angemeldeten Benutzers aus und trägt diese in die Felder ein.


Word Dokument Vorbereiten

DocVariable einfügen

Wir wollen mit VBA Werte im aktiven Dokument ändern. Da es am einfachsten ist habe ich mich für Formularfelder vom Typ DocTariable entschieden.

Wir fügen ein solches Feld ein über

Ribbon Einfügen -- Schnellbausteine -- Feld...

DocVariable.gif

Unter "Neuer Name" geben wir dem Feld den Namen über den wir es dann von VBA aus ansprechen, hier z.B. Vorname.


VBA Makro erstellen

Nachdem wir alle gewünschten Felder eingefügt und formatiert haben öffnen wir die Visual Basic Konsole ( [ALT]+[F11] )

Hier fügen wir ein neues Modul ein (Modul1) und erstellen die Routine / das Makro:

VBA Makro Langversion

Sub ADTest()
 
' dv steht für DOCVARIABLE - das sind die Felder im eigentlichen Word-Dokument
Dim dvVorname               As String
Dim dvInitialen             As String
Dim dvNachname              As String
Dim dvAnzeigename           As String
Dim dvBeschreibung          As String
Dim dvBuero                 As String
Dim dvRufnummer             As String
Dim dvEmail                 As String
Dim dvWebseite              As String
Dim dvStrasse               As String
Dim dvPostfach              As String
Dim dvOrt                   As String
Dim dvBundesland            As String
Dim dvPostleitzahl          As String
Dim dvLand                  As String
Dim dvBenutzeranmeldename   As String
Dim dvRufnummernPrivat      As String
Dim dvRufnummernPager       As String
Dim dvRufnummernMobil       As String
Dim dvRufnummernFax         As String
Dim dvRufnummernIPTelefon   As String
Dim dvAnmerkungen           As String
Dim dvPosition              As String
Dim dvAbteilung             As String
Dim dvFirma                 As String
Dim dvVorgesetzter          As String
Dim dvMitarbeiter           As String
 
'Variablen für AD-Abfrage
Dim varQuery As String
Dim objSystemInfo As Object
Dim objBenutzer As Object
 
' Active Directory Informationen des angemeldeten Benutzers lesen
Set objSystemInfo = CreateObject("ADSystemInfo")
varQuery = "LDAP://" & objSystemInfo.UserName
' mit Nachfolgender Zeile haben wir einen Zeiger auf das AD-Objekt des Benutzers
' damit können wir alle AD-Felder abfragen
Set objBenutzer = GetObject(varQuery)
 
' Nachdem wir Zeiger haben füllen wir unserer Variablen
dvVorname = objBenutzer.givenName
dvInitialen = objBenutzer.initials
dvNachname = objBenutzer.sn
dvAnzeigename = objBenutzer.DisplayName
dvBeschreibung = objBenutzer.Description
dvBuero = objBenutzer.PhysicalDeliveryOfficeName
dvRufnummer = objBenutzer.telephoneNumber
dvEmail = objBenutzer.mail
dvWebseite = objBenutzer.wWWHomepage
dvStrasse = objBenutzer.streetAddress
dvPostfach = objBenutzer.postOfficeBox
dvOrt = objBenutzer.l
dvBundesland = objBenutzer.st
dvPostleitzahl = objBenutzer.postalCode
dvLand = objBenutzer.CO
dvBenutzeranmeldename = objBenutzer.sAMAccountName
dvRufnummernPrivat = objBenutzer.homePhone
dvRufnummernPager = objBenutzer.pager
dvRufnummernMobil = objBenutzer.mobile
dvRufnummernFax = objBenutzer.facsimileTelephoneNumber
dvRufnummernIPTelefon = objBenutzer.ipPhone
dvAnmerkungen = objBenutzer.info
dvPosition = objBenutzer.Title
dvAbteilung = objBenutzer.department
dvFirma = objBenutzer.company
dvVorgesetzter = objBenutzer.manager
 
' nun füllen wir die DOCVARIABLEN im Dokument mit diesen Werten
ActiveDocument.Variables("Vorname").Value = dvVorname
ActiveDocument.Variables("Initialen").Value = dvInitialen
ActiveDocument.Variables("Nachname").Value = dvNachname
ActiveDocument.Variables("Anzeigename").Value = dvAnzeigename
ActiveDocument.Variables("Beschreibung").Value = dvBeschreibung
ActiveDocument.Variables("Buero").Value = dvBuero
ActiveDocument.Variables("Rufnummer").Value = dvRufnummer
ActiveDocument.Variables("Email").Value = dvEmail
ActiveDocument.Variables("Webseite").Value = dvWebseite
ActiveDocument.Variables("Strasse").Value = dvStrasse
ActiveDocument.Variables("Postfach").Value = dvPostfach
ActiveDocument.Variables("Ort").Value = dvOrt
ActiveDocument.Variables("Bundesland").Value = dvBundesland
ActiveDocument.Variables("Postleitzahl").Value = dvPostleitzahl
ActiveDocument.Variables("Land").Value = dvLand
ActiveDocument.Variables("Benutzeranmeldename").Value = dvBenutzeranmeldename
ActiveDocument.Variables("RufnummernPrivat").Value = dvRufnummernPrivat
ActiveDocument.Variables("RufnummernPager").Value = dvRufnummernPager
ActiveDocument.Variables("RufnummernMobil").Value = dvRufnummernMobil
ActiveDocument.Variables("RufnummernFax").Value = dvRufnummernFax
ActiveDocument.Variables("RufnummernIPTelefon").Value = dvRufnummernIPTelefon
ActiveDocument.Variables("Anmerkungen").Value = dvAnmerkungen
ActiveDocument.Variables("Position").Value = dvPosition
ActiveDocument.Variables("Abteilung").Value = dvAbteilung
ActiveDocument.Variables("Firma").Value = dvFirma
ActiveDocument.Variables("Vorgesetzter").Value = dvVorgesetzter
 
' und zum Schluss die Werte aller Felder einmal aktualisieren (damit die neuen Werte auch sofort angezeigt werden)
ActiveDocument.Fields.Update
 
End Sub

Erläuterungen zum VBA Makro

Wir definieren zunächst sauber alle verwendeten Variablen:

' dv steht für DOCVARIABLE - das sind die Felder im eigentlichen Word-Dokument
Dim dvVorname               As String
Dim dvInitialen             As String
Dim dvNachname              As String
...

Und holen uns unser ActiveDirectory Benutzerobjekt:

' Active Directory Informationen des angemeldeten Benutzers lesen
Set objSystemInfo = CreateObject("ADSystemInfo")
varQuery = "LDAP://" & objSystemInfo.UserName
' mit Nachfolgender Zeile haben wir einen Zeiger auf das AD-Objekt des Benutzers
' damit können wir alle AD-Felder abfragen
Set objBenutzer = GetObject(varQuery)

Danach füllen wir unsere Variablen - ja ja ich weis, das müssten wir nicht extra tun, wir könnten die Daten auch direkt nutzen. Das Makro hier dienst jedoch noch als vorlage für andere Projekte - und so habe ich dann schon mal alles für die Weiterverarbeitung.

' Nachdem wir Zeiger haben füllen wir unserer Variablen
dvVorname = objBenutzer.givenName
dvInitialen = objBenutzer.initials
dvNachname = objBenutzer.sn
...

Im Anschluss schreiben wir die Werte in die DocVariablen

' nun füllen wir die DOCVARIABLEN im Dokument mit diesen Werten
ActiveDocument.Variables("Vorname").Value = dvVorname
ActiveDocument.Variables("Initialen").Value = dvInitialen
ActiveDocument.Variables("Nachname").Value = dvNachname

Ganz am Schluss müssen wir Word noch dazu bringen, den Inhalt der Felder zu aktualisieren:

' und zum Schluss die Werte aller Felder einmal aktualisieren (damit die neuen Werte auch sofort angezeigt werden)
ActiveDocument.Fields.Update

und das war schon alles

VBA Makro Kurzversion

Wenn Ihr euch den Zwischenschritt mit den Variablen sparen wollt, es geht auch direkt:

Sub ADTestKurz()
 
'Variablen für AD-Abfrage
 
Dim varQuery As String
Dim objSystemInfo As Object
Dim objBenutzer As Object
 
' Active Directory Informationen des angemeldeten Benutzers lesen
Set objSystemInfo = CreateObject("ADSystemInfo")
varQuery = "LDAP://" & objSystemInfo.UserName
' mit Nachfolgender Zeile haben wir einen Zeiger auf das AD-Objekt des Benutzers
' damit können wir alle AD-Felder abfragen
Set objBenutzer = GetObject(varQuery)
 
' nun füllen wir die DOCVARIABLEN im Dokument mit diesen Werten
ActiveDocument.Variables("Vorname").Value = objBenutzer.givenName
ActiveDocument.Variables("Initialen").Value = objBenutzer.initials
ActiveDocument.Variables("Nachname").Value = objBenutzer.sn
ActiveDocument.Variables("Anzeigename").Value = objBenutzer.DisplayName
ActiveDocument.Variables("Beschreibung").Value = objBenutzer.Description
ActiveDocument.Variables("Buero").Value = objBenutzer.PhysicalDeliveryOfficeName
ActiveDocument.Variables("Rufnummer").Value = objBenutzer.telephoneNumber
ActiveDocument.Variables("Email").Value = objBenutzer.mail
ActiveDocument.Variables("Webseite").Value = objBenutzer.wWWHomepage
ActiveDocument.Variables("Strasse").Value = objBenutzer.streetAddress
ActiveDocument.Variables("Postfach").Value = objBenutzer.postOfficeBox
ActiveDocument.Variables("Ort").Value = objBenutzer.l
ActiveDocument.Variables("Bundesland").Value =objBenutzer.st
ActiveDocument.Variables("Postleitzahl").Value = objBenutzer.postalCode
ActiveDocument.Variables("Land").Value = objBenutzer.CO
ActiveDocument.Variables("Benutzeranmeldename").Value = objBenutzer.sAMAccountName
ActiveDocument.Variables("RufnummernPrivat").Value = objBenutzer.homePhone
ActiveDocument.Variables("RufnummernPager").Value = objBenutzer.pager
ActiveDocument.Variables("RufnummernMobil").Value = objBenutzer.mobile
ActiveDocument.Variables("RufnummernFax").Value = objBenutzer.facsimileTelephoneNumber
ActiveDocument.Variables("RufnummernIPTelefon").Value = objBenutzer.ipPhone
ActiveDocument.Variables("Anmerkungen").Value = objBenutzer.info
ActiveDocument.Variables("Position").Value = objBenutzer.Title
ActiveDocument.Variables("Abteilung").Value = objBenutzer.department
ActiveDocument.Variables("Firma").Value = objBenutzer.company
ActiveDocument.Variables("Vorgesetzter").Value = objBenutzer.manager
 
' und zum Schluss die Werte aller Felder einmal aktualisieren (damit die neuen Werte auch sofort angezeigt werden)
ActiveDocument.Fields.Update
 
End Sub

Nach Anfrage: Man müsste das auch auf die Abfrage der Stellverteter ausbauen können, die passenden Feldnamen finden sich hier:

http://www.msxfaq.de/konzepte/stellvertreter.htm

Suchen & Ersetzen

Statt mit den DocVariablen kann auch mit Schlüsselwörtern gearbeitet werden.
Man schreibt in den Text z.B. ein "xxxVORNAMExxx" und lässt es dann durch im AD ermittelten Vornamen ersetzen.
Das nachfolgende Beispiel arbeitet so - und als Leckerchen ersetzt es auch den Text in Kopf- und Fußzeilen etc.

Die verwendeten Schlüsselwörter findet ihr im Quelltext,

strReplacementText(1) = "xLNx"

legt z.B. fest das überall im Text xLNx durch den Nachnamen ersetzt wird (siehe jeweils Kommentar)


Download: AD_Data_and_Replace_Text.txt

' #Subfunction#
'===============================================================================
'
' Name...........: AD_Data_and_Replace_Text()
' Description ...: Ruft die Daten des aktuellen Benutzers aus dem Active Directory ab und
'                  setzt diese in das Dokument ein. Dies geschieht über Suchen & Ersetzen,
'                  xLNx im Text des Dokumentes wird z.B. durch dem in AD hinterlegten
'                  Nachnamen ersetzt - egal wie oft im Dokument das Schlüsselwort vorkommt.
'                  Formatierungen bleiben dabei erhalten, das Schlüsselwort wird auch in
'                  der Kopf- und Fußzeile gefunden und ersetzt.
' Syntax.........: AD_Data_and_Replace_Text()
' Parameters ....: keine
' Return values .: keine
' Author ........: Bernhard Linz / Bernhard.Linz@datagroup.de / admin@znil.net
' Modified.......:
' Remarks .......:
' Related .......:
' Link ..........: http://znil.net (Bereich Office / Word)
'
Sub AD_Data_and_Replace_Text()
   '===============================================================================
   'In den nachfolgenden Variablen werden die Informationen aus dem Active Directory über den aktuellen Benutzer gespeichert.
   'In der strReplacementText wird der dazu passende Suchtext gespeichert. Das wir dafür 2 Arrays nehmen hat den Grund
   'das wir so für das Suchen & Ersetzen mit Schleifen arbeiten können - sonst wäre der Quelltext sehr lang geworden wobei
   'immer wieder das selbe wiederholt worden wäre.
   'Um das ganze zu Erweitern müssen also unten in den Variablenzuweisungen einfach die weiteren Felder fortlaufend hinzugefügt
   'werden - und hier oben die Gesamtanzahl angepasst werden. Da wir bei 0 anfangen zu zählen sind also 0 bis 25 = 26 insgesammt.
   'Also immer einen mehr als der letzte Eintrag
   Const AnzahlElemente                        As Integer = 26
   Dim strObject(AnzahlElemente)               As String
   Dim strReplacementText(AnzahlElemente)      As String
 
   '===============================================================================
   ' Allgemeine Variablen
   Dim Zaehler                                 As Integer
   Dim oStory                                  As Range
 
   '===============================================================================
   'Variablen für Active Directory-Abfrage
   Dim varQuery                                As String
   Dim objSystemInfo                           As Object
   Dim objBenutzer                             As Object
 
   '===============================================================================
   ' Active Directory Informationen des angemeldeten Benutzers lesen
   Set objSystemInfo = CreateObject("ADSystemInfo")
   varQuery = "LDAP://" & objSystemInfo.UserName
   ' mit Nachfolgender Zeile haben wir einen Zeiger auf das AD-Objekt des Benutzer's damit können wir alle AD-Felder abfragen
   Set objBenutzer = GetObject(varQuery)
 
   '===============================================================================
   'Setzen der Suchtexte
   '===============================================================================
   '0. First Name
       strObject(0) = objBenutzer.givenName
       strReplacementText(0) = "xFNx"
   '1. Last Name
       strObject(1) = objBenutzer.sn
       strReplacementText(1) = "xLNx"
   '2. Initialien
       strObject(2) = objBenutzer.initials
       strReplacementText(2) = "xINx"
   '3. User Logon Name
       strObject(3) = objBenutzer.sAMAccountName
       strReplacementText(3) = "xLogonNamex"
   '4. Display Name
       strObject(4) = objBenutzer.DisplayName
       strReplacementText(4) = "xDisplayNamex"
   '5. Description
       strObject(5) = objBenutzer.Description
       strReplacementText(5) = "xDescriptionx"
   '6. Job Title
       strObject(6) = objBenutzer.Title
       strReplacementText(6) = "xJobTitlex"
   '7. Department
       strObject(7) = objBenutzer.department
       strReplacementText(7) = "xDepartmentx"
   '8. Company
       strObject(8) = objBenutzer.company
       strReplacementText(8) = "xCompanyx"
   '9. Office
       strObject(9) = objBenutzer.PhysicalDeliveryOfficeName
       strReplacementText(9) = "xOfficex"
  '10. Telephone Number
       strObject(10) = objBenutzer.telephoneNumber
       strReplacementText(10) = "xTelOfficex"
  '11. Home Number
       strObject(11) = objBenutzer.homePhone
       strReplacementText(11) = "xTelHomex"
  '12. Mobile Number
       strObject(12) = objBenutzer.mobile
       strReplacementText(12) = "xTelMobilex"
  '13. Fax Number
       strObject(13) = objBenutzer.facsimileTelephoneNumber
       strReplacementText(13) = "xTelFAXx"
  '14. Pager Number
       strObject(14) = objBenutzer.pager
       strReplacementText(14) = "xTelPagerx"
  '15. Email
       strObject(15) = objBenutzer.mail
       strReplacementText(15) = "xEMAILx"
  '16. Web-Page
       strObject(16) = objBenutzer.wWWHomepage
       strReplacementText(16) = "xWWWx"
  '17. Street
       strObject(17) = objBenutzer.streetAddress
       strReplacementText(17) = "xSTREETx"
  '18. P.O. Box
       strObject(18) = objBenutzer.postOfficeBox
       strReplacementText(18) = "xPOx"
  '19. Zip
       strObject(19) = objBenutzer.postalCode
       strReplacementText(19) = "xZIPx"
  '20. City
       strObject(20) = objBenutzer.l
       strReplacementText(20) = "xCITYx"
  '21. State
       strObject(21) = objBenutzer.st
       strReplacementText(21) = "xSTATEx"
  '22. Country
       strObject(22) = objBenutzer.CO
       strReplacementText(22) = "xCOUNTRYx"
  '23. IP-Telephone
       strObject(23) = objBenutzer.ipPhone
       strReplacementText(23) = "xTelIPx"
  '24. Notes
       strObject(24) = objBenutzer.info
       strReplacementText(24) = "xNOTESx"
  '25. EmployeeID
       strObject(25) = objBenutzer.employeeID
       strReplacementText(25) = "xEmployeeIDx"
 
   '===============================================================================
   'Suchen und Ersetzen!
   '===============================================================================
   Application.ScreenUpdating = False
   For Zaehler = 0 To (AnzahlElemente - 1) Step 1
   'Einmal für jedes Schlüsselwort ....
       For Each oStory In ActiveDocument.StoryRanges
       'und noch einmal für jeden Dokumentenbereich
       'Sonst geht es nicht mit Kopf- und Fußzeile
           oStory.Find.ClearFormatting
           oStory.Find.Replacement.ClearFormatting
           With oStory.Find
               .Text = strReplacementText(Zaehler)
               .Replacement.Text = strObject(Zaehler)
               .Forward = True
               .Wrap = wdFindContinue
               .Format = False
               .MatchCase = True
               .MatchWholeWord = True
               .MatchWildcards = False
               .MatchSoundsLike = False
               .MatchAllWordForms = False
           End With
           oStory.Find.Execute Replace:=wdReplaceAll
           'Hauptbereich ist abgefrühstückt - nun die restlichen Bereiche
           While Not (oStory.NextStoryRange Is Nothing)
               Set oStory = oStory.NextStoryRange
               oStory.Find.ClearFormatting
               oStory.Find.Replacement.ClearFormatting
               With oStory.Find
                   .Text = strReplacementText(Zaehler)
                   .Replacement.Text = strObject(Zaehler)
                   .Forward = True
                   .Wrap = wdFindContinue
                   .Format = False
                   .MatchCase = True
                   .MatchWholeWord = True
                   .MatchWildcards = False
                   .MatchSoundsLike = False
                   .MatchAllWordForms = False
               End With
               oStory.Find.Execute Replace:=wdReplaceAll
           Wend
       Next
   Next Zaehler
   Application.ScreenUpdating = True
End Sub




Kommentare

Kommentare


80.83.100.130

1603 Tage zuvor
Punkte 0+-
Super! Vielen Dank für den Code. Gibt es auch eine Möglichkeit eine Auswahl der AD-Benutzer anzuzeigen aus der ich dann wählen kann, welcher User ausgelesen werden soll?

BLinz

1598 Tage zuvor
Punkte 0+-

Klar wäre das möglich ... dann musst du allerdings alles Benutzer auslesen, ggf. musst du dazu den passenden Einstig im AD wählen (ab welcher OU) etc .. und dann eine "Form" dazu. Schlüsselzeile dazu ist:

varQuery = "LDAP://" & objSystemInfo.UserName

Mampfred

202 Tage zuvor
Punkte 0+-

Zum 2. Kommentar von BLinz hätte ich auch noch eine Frage: Das Script läuft bei mir hervorragend, da jedoch z.B. Sekretärinnen meistens im Namen eins anderen AD-Users schreiben, würde ich hiefür gerne eine Listbox zur Auswahl des auszuwertenden Benutzers erstelle. Gibts hierfür auch ein Beispiel, wie das zu realisiren wäre?

Ferner: welche Rechte müssten im AD gesetzt werden, damit die entsprechenden Werte des anderen Users auch ausgelesen werden dürfen?

Gruß und Danke

217.91.185.109

1596 Tage zuvor
Punkte 0+-

hallo blinz, das ist ja mal eine ausführliche anleitung, klasse!

ich bin leider überhaupt nicht firm in vba und möchte so etwas wie du in weitaus kleinerer form realisieren, falls möglich evtl. mit der kurzversion die du ebenfalls hier gepostet hast. das ganze in Word 2013 und in einem .docx, also kein vorlagenformat..

und zwar brauche ich nur die informationen über den vollen namen (displayName oder distinguishedName?), telefonnummer und email. das heißt ich könnte alle anderen zeilen wie "ActiveDocument.Variables("Webseite").Value = dvWebseite" rausnehmen, oder? jetzt habe ich allerdings bereits document property felder erstellt und mit eigenen namen und beschreibungen versehen (Autor, Tel. und Email), kann ich die in das skript integrieren sodass sie als zielort für die AD-infos erkannt werden? und wenn ja, wie sieht das im skript dann aus?

würde mich freuen wenn du mir da weiterhelfen kannst!

grüße,

albion

62.225.110.179

1596 Tage zuvor
Punkte 0+-

Hallo,

eine Frage zu der Beispieldatei:

Ist es auch möglich, so etwas ohne die beiden Knöpfe "Felder leeren" und "ActiveDirectory Daten einlesen" hinzubekommen?

Ich habe eine Faxvorlage anhand der Beispieldatei erstellt. Wenn ich die Knöpfe nachträglich entferne, funktioniert das Auslesen aber leider nicht mehr.

217.91.185.109

1596 Tage zuvor
Punkte 0+-

hi, albion nochmal. habe jetzt mal etwas herumprobiert, das ergebnis funktioniert aber nicht. vielleicht kannst du mir sagen, wo der fehler liegt :)

Sub ADfill()

'Variablen für AD-Abfrage

Dim varQuery As String Dim objSystemInfo As Object Dim objUser As Object

' Active Directory Informationen des angemeldeten Benutzers lesen Set objSystemInfo = CreateObject("ADSystemInfo") varQuery = "LDAP://" & objSystemInfo.UserName

' mit Nachfolgender Zeile haben wir einen Zeiger auf das AD-Objekt des Benutzers ' damit können wir alle AD-Felder abfragen Set objUser = GetObject(varQuery)

' nun füllen wir die DOCVARIABLEN im Dokument mit diesen Werten ActiveDocument.CustomDocumentProperties("Autor").Value = objUser.distinguishedName ActiveDocument.CustomDocumentProperties("Telefonnummer").Value = objUser.telephoneNumber ActiveDocument.CustomDocumentProperties("Email").Value = objUser.mail

' und zum Schluss die Werte aller Felder einmal aktualisieren (damit die neuen Werte auch sofort angezeigt werden) ActiveDocument.Fields.Update

End Sub

was evtl. noch interessant ist:

- der code ist in project (projektname) --> word objects --> this document reingeschrieben. sollte der richtige ort sein.. - wenn ich im VB-fenster speichere und schließe und im dokument alles markiere und f9 drücke, passiert rein garnichts. wenn ich aber über developer --> macros das makro auswähle und auf "run" klicke, bekomme ich einen fehler ("invalid procedure call or argument"). was kann das bedeuten?

grüße,

albion

217.91.185.109

1596 Tage zuvor
Punkte 0+-

sorry, hier mit ordentlicher formatierung:

Sub ADfill()

'Variablen für AD-Abfrage

Dim varQuery As String Dim objSystemInfo As Object Dim objUser As Object

' Active Directory Informationen des angemeldeten Benutzers lesen Set objSystemInfo = CreateObject("ADSystemInfo") varQuery = "LDAP://" & objSystemInfo.UserName

' mit Nachfolgender Zeile haben wir einen Zeiger auf das AD-Objekt des Benutzers ' damit können wir alle AD-Felder abfragen Set objUser = GetObject(varQuery)

' nun füllen wir die DOCVARIABLEN im Dokument mit diesen Werten ActiveDocument.CustomDocumentProperties("Autor").Value = objUser.distinguishedName ActiveDocument.CustomDocumentProperties("Telefonnummer").Value = objUser.telephoneNumber ActiveDocument.CustomDocumentProperties("Email").Value = objUser.mail

' und zum Schluss die Werte aller Felder einmal aktualisieren (damit die neuen Werte auch sofort angezeigt werden) ActiveDocument.Fields.Update

End Sub

217.91.185.109

1596 Tage zuvor
Punkte 0+-
(
albion

BLinz

1583 Tage zuvor
Punkte 0+-

Moin,

Wenn Ihr das automatisch ausgefüllt haben wollt und ohne Buttons:

1. nehmt die Suchen und Ersetzen Version und kopiert die in eure Vorlage 2. erstellt ein "DokumentNew" Makro wie z.B. folgt: Private Sub Document_New() AD_Data_and_Replace_Text End Sub und speichert es als Vorlage mit Makros Nachteil: dann ist dieses Makro immer im Dokument - wenn Ihr es aber statt als .docm als .docx speichert sind die raus.

Der Profi hat es so gemacht: - Makro wie zuvor beschrieben in die Vorlage eingebunden - dazu das http://znil.…l%C3%B6schen Makro mit rein und fertig!

Ich kann das für andere machen - aber ich mache das beruflich und werde dann dafür bezahlt :-)

Gruß,

Bernhard

BLinz

1583 Tage zuvor
Punkte 0+-

Moin,
Wenn Ihr das automatisch ausgefüllt haben wollt und ohne Buttons:
1. nehmt die Suchen und Ersetzen Version und kopiert die in eure Vorlage 2. erstellt ein "DokumentNew" Makro wie z.B. folgt:
Private Sub Document_New()
AD_Data_and_Replace_Text
End Sub
und speichert es als Vorlage mit Makros

Nachteil: dann ist dieses Makro immer im Dokument - wenn Ihr es aber statt als .docm als .docx speichert sind die raus. Der Profi hat es so gemacht:

- Makro wie zuvor beschrieben in die Vorlage eingebunden
- dazu das http://znil.…l%C3%B6schen Makro mit rein und fertig!
Ich kann das für andere machen - aber ich mache das beruflich und werde dann dafür bezahlt :-)

Gruß, Bernhard

91.17.103.142

1561 Tage zuvor
Punkte 0+-

Gelöscht wegen SPAM (Werbung eines Softwareherstellers)

2 x den selben automatisierten Text fiel dann doch auf ...

83.78.63.13

1524 Tage zuvor
Punkte 0+-
Super Anleitung. Besten Dank

212.14.79.21

1505 Tage zuvor
Punkte 0+-

Hallo!

Klasse Anleitung! Funktioniert allerdings nur bei mir. Bei anderen Nutzern stehen meine Werte in den Feldern.

212.14.79.21

1505 Tage zuvor
Punkte 0+-

Folgendes Szenario: User Admin, Admin an PC 1 erstelle das Dokument mit entsprechendem VBA-Script unter Word 2010: Es funktioniert, alle Datenwerden aus dem AD ausgelesen User Test, normaler Benutzer an PC 2, öffnet die dotm unter Word 2007: Der Benutzer bekommt die Daten von User Admin präsentiert. Ich muss dazu sagen, dass ich das Script etwas verkürzt habe:

Objekte - ThisDocument:

===========

Private Sub Document_Open() ADtest

End Sub


Module - Modul1:

====

Sub ADtest()

' dv steht für DOCVARIABLE - das sind die Felder im eigentlichen Word-Dokument Dim dvVorname As String Dim dvNachname As String Dim dvAnzeigename As String Dim dvKuerzel As String Dim dvDurchwahl As String Dim dvFaxnummer As String Dim dvEmail As String Dim dvStrasse As String Dim dvPostleitzahl As String Dim dvOrt As String Dim dvProkura As String Dim dvPosition As String Dim dvAbteilung As String Dim dvFirma As String

'Variablen für AD-Abfrage Dim varQuery As String Dim objSystemInfo As Object Dim objBenutzer As Object

' Active Directory Informationen des angemeldeten Benutzers lesen Set objSystemInfo = CreateObject("ADSystemInfo") varQuery = "LDAP://" & objSystemInfo.UserName ' mit Nachfolgender Zeile haben wir einen Zeiger auf das AD-Objekt des Benutzers ' damit können wir alle AD-Felder abfragen Set objBenutzer = GetObject(varQuery)

' Nachdem wir Zeiger haben füllen wir unserer Variablen dvVorname = objBenutzer.givenName dvNachname = objBenutzer.sn dvAnzeigename = objBenutzer.DisplayName dvKuerzel = objBenutzer.initials dvDurchwahl = objBenutzer.telephoneNumber dvFaxnummer = objBenutzer.facsimileTelephoneNumber dvEmail = objBenutzer.mail dvStrasse = objBenutzer.streetAddress dvProkura = objBenutzer.postOfficeBox dvPostleitzahl = objBenutzer.postalCode dvOrt = objBenutzer.l dvPosition = objBenutzer.Title dvAbteilung = objBenutzer.department dvFirma = objBenutzer.company

' nun füllen wir die DOCVARIABLEN im Dokument mit diesen Werten ActiveDocument.Variables("Vorname").Value = dvVorname ActiveDocument.Variables("Nachname").Value = dvNachname ActiveDocument.Variables("Anzeigename").Value = dvAnzeigename ActiveDocument.Variables("Kuerzel").Value = dvKuerzel ActiveDocument.Variables("Durchwahl").Value = dvDurchwahl ActiveDocument.Variables("Faxnummer").Value = dvFaxnummer ActiveDocument.Variables("Email").Value = dvEmail ActiveDocument.Variables("Strasse").Value = dvStrasse ActiveDocument.Variables("Postleitzahl").Value = dvPostleitzahl ActiveDocument.Variables("Ort").Value = dvOrt ActiveDocument.Variables("Prokura").Value = dvProkura ActiveDocument.Variables("Position").Value = dvPosition ActiveDocument.Variables("Abteilung").Value = dvAbteilung ActiveDocument.Variables("Firma").Value = dvFirma

' und zum Schluss die Werte aller Felder einmal aktualisieren (damit die neuen Werte auch sofort angezeigt werden) ActiveDocument.Fields.Update

End Sub


Hat jemand eine Idee, woran es liegen könnte?

Beste Grüße

Ano Nym

BLinz

1505 Tage zuvor
Punkte 0+-

Ganz oben gibt es den Downloadlink zur Demo-Datei - also ein fertiges Word-Dokument mit Makros zum Testen.

Funktioniert denn diese Beispieldatei richtig?

Bernhard

212.14.79.21

1505 Tage zuvor
Punkte 0+-

Hallo Herr Linz,

die funktioniert komischerweise.

BLinz

1504 Tage zuvor
Punkte 0+-

Dann zurück auf Start - und noch mal von vorne Anfangen. Irgendwo stimmt etwas an den Rahmenbedingungen nicht:

  • Ist das Makro auch im Dokument?
  • Sind bei den Mitarbeitern in den Sicherheitseinstellungen denn Makros aktiviert? Immer? nur auf Nachfrage?
  • Die Datei hat auch *.docm als Endung?

Im Text oben finde ich den Fehler so nicht. Zudem würde ich statt der Felder die "Suchen und Ersetzen" Variante nehmen - ist viel einfacher im Dokument selbst.

Gruß,

Bernhard

77.180.0.191

1504 Tage zuvor
Punkte 0+-

Hallo Bernhard, das Makro ist im Dokument, Makros dürfen sie Mitarbeiter ausführen. Die Endung ist .dotm, also Vorlage mit Makros.

Das Problem mit der Suchen und Ersetzen-Methode ist, dass ich da nicht so einfach eine If-Abfrage einbauen kann, z.B. Wenn AD-Feld Position leer, dann schreibe AD-Feld Abteilung, sonst AD-Feld Position. Ich hab jedenfalls keine Ahnung, wie ich das mit Suchen und Ersetzen bewerkstelligen kann.

Gruß

Sebastian

212.14.79.21

1504 Tage zuvor
Punkte 0+-

Fehler gefunden! Ich habe jetzt einfach mal den VBA-Code von Deinen herunterladbaren Dokumenten und dem hier von Dir geposteten Code verglichen.

Unter Objekte - ThisDocument fehlte mir (und in dem von Dir geposteten Code):

Private Sub Document_New() ADtest

End Sub

Beste Grüße

Sebastian

80.153.17.151

1434 Tage zuvor
Punkte 0+-

ich habe genau das selbe Problem, jedoch kann ichs nicht lösen.

Weil ich deine Lösung nicht richtig kapiere. =/

BLinz

1422 Tage zuvor
Punkte 0+-

An letzteren - nimm die letzte Lösung mit Suchen und Ersetzen - da sind nur 2 Blöcke mit dem Ersetzen drin - und vorher siehst du die Schlüsselwörter die ersetzt werden. So hab ich solche Sachen schon oft gelöst da es in Tabellen usw. gut funktioniert statt mit unflexiblen Formularfeldern.

Die eigentliche Abfrage sind ja nur die 3 kurzen Zeilen am Anfang.

Ansonsten - ich mach das beruflich und man kann mich buchen :-) Dies ist eine Zusammenfassung von dem was ich bei einem Kunden gemacht habe - der Testkandidat zur Überprüfung der Machbarkeit vor der eigentlichen Lösung.

Gruß,

Bernhard

84.149.213.121

1370 Tage zuvor
Punkte 0+-

Gelöscht wegen SPAM (Werbung eines Softwareherstellers)

2 x der gleiche Textbaustein fiel dann doch auf ....

Mandy

874 Tage zuvor
Punkte 0+-

Hallo,

vielen Dank für den Code, ich nutze ich ihn in etwas abgewandelter Form für das Befüllen der Nutzerdaten in einem Briefkopf. Läuft bei Windows Rechnern auch ohne Probleme. Wir haben allerdings auch Mac-User. Da läuft das Makro nicht. Ich hatte ein wenig nachgelesen dazu und wahrscheinlich müssen die AD-Daten dort anders eingelesen werden. Kann mir da jemand helfen?

Danke :-)

Fabian.stettes@kja.de

687 Tage zuvor
Punkte 0+-

Hallo,

der Code ist gut und funktioniert auchg gut (Word2010). ABER: Das Makro Suchen und Ersetzten funktioniert sowohl auf Textfelder als auch auf die Kopfuzeile, aber leider nicht auf die Kombination von beidenm (Textfeld in Kopfzeile). Wie muss ich das Script abändern, damit dies funktioniert.

mfg

Fabian Stettes

BLinz

687 Tage zuvor
Punkte 0+-
Ohne es geprüft zu haben müsstest du beim Arbeiten der Kopfzeilen eine Unterschleife bauen die alle Textfelder in dieser durchsucht

DeBabba

94 Tage zuvor
Punkte 0+-
--- gelöscht wegen Werbung / Spamverdacht ---

joseph@jbanholzer.de

2 Tage zuvor
Punkte 0+-

Hallo und guten Tag

Super Anleitung. Ich habe einen Code von meinem Vorgänger,der auf diese Art funktioniert. Nur habe ich das Problem, dass die Variablen in Kopf- und Fusszeilen nicht abgefüllz werden.

Gruße

Sepp

BLinz

2 Tage zuvor
Punkte 0+-

Sepp

einen Tag 19 Stunden 53 Minuten zuvor
Punkte 0+-

BLinz, danke für die Rückmeldung. Leider werden die Felder nicht immer mit einem Makro gefüllt. Dann habe ich das Problem, dass diese Variablen in Kopf- und Fusszeilen stehen bleiben :-(

Warum muss bei MS immer alles so kompüliziert sein :-(
Kommentar hinzufügen:
Gebe hier einen Kommentar ein. Du kannst einen beliebigen Namen oder eine Email-Adresse als Namen angeben.

Wenn du dich einloggst wird automatisch dein Benutzername genommen.
Du kannst KEINE Links hier posten - das wurde wegen anhaltender Werbung deaktiviert. Sobald ein '''http://''' im Text vorkommt wird der Kommentar verworfen Alle anderen Steuerzeichen oder Funktionen wie < br > werden ausgefiltert - zum Posten von Quelltexten ist diese Funktion hier nicht geeignet.

Falls du dringendere Fragen hast kannst du auch das Support-System von znil.net nutzen unter support.znil.net