27.11.2022, 10:55
Moin moin,
ich habe ein Makro, welches das LDAP-Verzeichnis "anzapft" und eine Liste mit Namen und Vornamen abfragt und dann weitere Infos wie E-Mail-Adresse ergänzt. Das klappt auch soweit ganz gut. Allerdings kommt es nicht selten vor, dass es mehrere Personen mit identischem Vor- und Nachnamen gibt. Ich möchte die Prozedur dann an der Stelle unterbrechen und z.B. in einer Userform die entsprechenden Infos darstellen, sodass der User sich die gesuchte Person aussuchen kann. Danach soll die Prozedur fortgeführt werden.
Da ich das Makro nicht selbst gebaut habe und es entsprechend auch nicht vollends verstehe, was da passiert, weiß ich nicht, an welcher Stelle ich ansetzen könnte. Eine Userform basteln dürfte ich hinbekommen - das dauert bei mir allerdings ein wenig :).
Wäre super, wenn mir wer auf die Sprünge helfen könnte.
Das Makro sieht wie folgt aus:
Danke und Gruß
ich habe ein Makro, welches das LDAP-Verzeichnis "anzapft" und eine Liste mit Namen und Vornamen abfragt und dann weitere Infos wie E-Mail-Adresse ergänzt. Das klappt auch soweit ganz gut. Allerdings kommt es nicht selten vor, dass es mehrere Personen mit identischem Vor- und Nachnamen gibt. Ich möchte die Prozedur dann an der Stelle unterbrechen und z.B. in einer Userform die entsprechenden Infos darstellen, sodass der User sich die gesuchte Person aussuchen kann. Danach soll die Prozedur fortgeführt werden.
Da ich das Makro nicht selbst gebaut habe und es entsprechend auch nicht vollends verstehe, was da passiert, weiß ich nicht, an welcher Stelle ich ansetzen könnte. Eine Userform basteln dürfte ich hinbekommen - das dauert bei mir allerdings ein wenig :).
Wäre super, wenn mir wer auf die Sprünge helfen könnte.
Das Makro sieht wie folgt aus:
Code:
Sub GetAccountInfo()
On Error Resume Next
' ad properties to extract for users
arrProps = Array("givenName", "mail", "samAccountName", "department", "memberOf")
' column headers matching array positions of 'arrProps'
arrColumnHeaders = Array("givenName", "E-Mail", "samAccountName", "department")
' working on current sheet
With ThisWorkbook.Sheets("Mitarbeiter")
' for each used cell in column C2:I(n)
For Each cell In .Range("A6:A" & .Cells(Rows.Count, "A").End(xlUp).Row)
' if value is not empty
If cell.Value <> "" Then
' search user in ad
Set result = FindAccount(cell.Value, cell.Offset(0, 1).Value)
' if user found ...
If Not result Is Nothing Then
For i = 0 To UBound(arrProps)
cell.Offset(0, i + 1).Value = result.Get(arrProps(i))
Next
Else ' user not found
' write info to next cell
cell.Offset(0, 1).Value = "Mitarbeiter nicht gefunden"
End If
End If
Next
End With
End Sub
Function FindAccount(strUserName, strUserVorname)
On Error Resume Next
Dim adoCommand, adoConnection
Dim varBaseDN, varFilter
Dim objRootDSE, varDNSDomain, strQuery, adoRecordset
Set adoCommand = CreateObject("ADODB.Command")
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"
adoConnection.Open "Active Directory Provider"
Set adoCommand.ActiveConnection = adoConnection
' Search entire Active Directory domain.
Set objRootDSE = GetObject("LDAP://RootDSE")
varDNSDomain = objRootDSE.Get("defaultNamingContext")
varBaseDN = "<LDAP://" & varDNSDomain & ">"
' Filter for user objects.
varFilter = "(&(objectCategory=person)(objectClass=user)(sn=" & strUserName & ")(givenName=" & strUserVorname & "))"
' Construct the LDAP syntax query.
adoCommand.CommandText = varBaseDN & ";" & varFilter & ";ADSPath;Subtree"
adoCommand.Properties("Page Size") = 2
adoCommand.Properties("Timeout") = 20
adoCommand.Properties("Cache Results") = False
Set adoRecordset = adoCommand.Execute
adoRecordset.MoveFirst
If adoRecordset.RecordCount > 0 Then
Set FindAccount = GetObject(adoRecordset("ADSPath"))
Else
Set FindAccount = Nothing
End If
adoRecordset.Close
adoConnection.Close
End Function
Danke und Gruß