Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Globales Adressbuch durchsuchen

Globales Adressbuch durchsuchen
25.02.2015 08:10:32
Daniel
Hallo zusammen,
ich würde gerne mit VBA in Excel das globale Adressbuch von Outlook nach Namen durchsuchen und mir die dazu passende e-Mail Adresse zurückgeben lassen. Dazu habe ich mir eine Funktion geschrieben, welche soweit auch funktioniert. Das Problem ist das das globale Adressbuch um die 400000 Einträge enthält! Es kommt also nicht in Frage mit einer Schleife jeden Eintrag zu durchsuchen.
Das Problem:
Bei so vielen Einträgen kommt es vor dass Personen gleiche Namen haben und in diesem Fall gibt die Funktion natürlich nur den zuerst gefundenen Kontakt zurück.
Meine Frage:
Wie kann ich meinen Code anpassen dass ich mehrere Treffer erhalte und sich dann z.B. eine Auswahl öffnet aus der man den passenden Kontakt wählen kann?
Über Hilfe würde ich mich sehr freuen :)
Ich bin kein Profi und nehme natürlich auch gerne Tipps zum bestehenden Code an.
Mein bisheriger Code:

Function GetMail(strName As String) As String
Dim outApp As Outlook.Application
Dim outNms As Outlook.Namespace
Dim outAddr As Outlook.AddressList
Dim outRcpt As Outlook.AddressEntry
On Error GoTo MailError
Set outApp = New Outlook.Application
Set outNms = outApp.GetNamespace("MAPI")
Set outAddr = outNms.AddressLists("Globale Adressliste")
Set outRcpt = outAddr.AddressEntries(strName)
GetMail = outRcpt.GetExchangeUser.PrimarySmtpAddress
Exit Function
MailError:
Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
Exit Function
End Function

Anzeige

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Globales Adressbuch durchsuchen
25.02.2015 09:12:25
Martin
Hallo Daniel,
ich habe mich bislang nur mit dem Auslesen von Emails beschäftigt und bin auf ähnliche Probleme gestoßen. Zumindest beim Suchen nach EMails gibt es Filtermöglichkeiten. Siehe hier:
http://www.jpsoftwaretech.com/use-filters-to-speed-up-outlook-macros/
Ich kann mir vorstellen, dass dies auch auf Kontakte im Adressbuch angewandt werden kann.
Viele Grüße
Martin

Anzeige
AW: Globales Adressbuch durchsuchen
25.02.2015 10:50:37
Daniel
Hallo Martin,
danke für den guten Ansatz. Die Restrict Methode ist leider nicht auf AddressEntries anwendbar, sondern nur auf Items. Ich habe jetzt schon länger herum probiert, komme aber nicht darauf wie ich es hinbekomme die AddressList als Ordner mit AddressEntries als Items zu verkaufen.
Die Einträge also die AddressEntry sind ja auch Items, für die Restrict Methode brauche ich ja eigentlich nur eine Item-Schar. Aber wie kann ich diese Item-Schar ansprechen?
Gibt es da eine Möglichkeit?
Gruß Daniel

Anzeige
AW: Globales Adressbuch durchsuchen
26.02.2015 09:06:30
Daniel
Hallo Zusammen,
ich habe das Problem gelöst :D
Falls jemand ein ähnliches Problem hat, hier die Lösung:
Habe das ganze in zwei Funktionen aufgeteilt,
die Erste sucht den Namen im GAL und gibt den passenden exakten Namen des Eintrags aus.
Beim mehreren Treffern wird eine Userform geöffnet,
welche über eine ComboBox abfragt welchen man gerne hätte.
Mehr als 10 Einträge lasse ich dabei aber nicht zu.
Die Rückgabe dieser Funktion ist also ein eindeutiger Name im GAL!
Die zweite Funktion ist eine simple Rückgabe der e-Mail Adresse
für die Eingabe des nun eindeutigen Namens.
Die Userform mit der ComboBox darf dabei aber nicht vollständig deaktiviert werden,
da die ComboBox in der Funktion ausgelesen werden muss.
Sie hat bei mir zwei Buttons "OK" (Me.hide) und "abbrechen" (Unload Me & End)
Hier der Code:
Function SearchGAL(strName As String) As String
Dim objSession, objGAL, objRcpts As Object
Dim intRcpt As Integer
On Error GoTo GALError
Set objSession = CreateObject("Redemption.RDOSession")
objSession.Logon
Set objGAL = objSession.AddressBook.GAL
Set objRcpts = objGAL.ResolveNameEx(strName)
SearchGAL = objRcpts(1).Name
If objRcpts.Count = 0 Then
MsgBox ("Kontakt '" & strName & "' konnte nicht gefunden werden")
End
End If
If objRcpts.Count > 10 Then 'Nicht mehr als 10 Treffer anbieten
MsgBox ("Angabe zu ungenau")
End
End If
If objRcpts.Count > 1 Then
With frmRcpts   'Userform mit Cbo (cboRcpts) und 2 Cmds
.Enabled = True
For intRcpt = 1 To objRcpts.Count
.cboRcpts.AddItem objRcpts(intRcpt) 'Treffer in Cbo einfügen
Next
.cboRcpts.Value = frmRcpts.cboRcpts.List(0)
.Show
SearchGAL = .cboRcpts.Value 'Namensauswahl aus cbo
.Enabled = False
End With
End If
Exit Function
GALError:
MsgBox "An error occures in modul: " & Application.VBE.ActiveCodePane.CodeModule.Name &  _
vbCrLf & _
"Error number: " & Err.Number & vbCrLf & "Describtion: " & Err.Description
On Error Resume Next
Set objSession = Nothing
Set objGAL = Nothing
Set objRcpts = Nothing
End
End Function

Function GetMail(strRcpt As String) As String
Dim outApp As Outlook.Application
Dim outNms As Outlook.Namespace
Dim outAddr As Outlook.AddressList
Dim outRcpt As Outlook.AddressEntry
On Error GoTo MailError
Set outApp = New Outlook.Application
Set outNms = outApp.GetNamespace("MAPI")
Set outAddr = outNms.AddressLists("Globale Adressliste")
Set outRcpt = outAddr.AddressEntries(strRcpt)
GetMail = outRcpt.GetExchangeUser.PrimarySmtpAddress
Exit Function
MailError:
MsgBox "An error occures in modul: " & Application.VBE.ActiveCodePane.CodeModule.Name &  _
vbCrLf & _
"Error number: " & Err.Number & vbCrLf & "Describtion: " & Err.Description
On Error Resume Next
Set outApp = Nothing
Set outNms = Nothing
Set outAddr = Nothing
Set outRcpt = Nothing
End
End Function

Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Globales Adressbuch in Excel durchsuchen


Schritt-für-Schritt-Anleitung

Um das globale Adressbuch in Outlook über Excel zu durchsuchen, kannst Du die folgenden Schritte befolgen:

  1. Öffne Excel und gehe in das VBA-Editor-Fenster (Alt + F11).

  2. Füge ein neues Modul hinzu: Rechtsklick auf "VBAProject (DeinWorkbookName)" > Einfügen > Modul.

  3. Kopiere den folgenden Code in das Modul:

    Function SearchGAL(strName As String) As String
       Dim objSession, objGAL, objRcpts As Object
       Dim intRcpt As Integer
       On Error GoTo GALError
       Set objSession = CreateObject("Redemption.RDOSession")
       objSession.Logon
       Set objGAL = objSession.AddressBook.GAL
       Set objRcpts = objGAL.ResolveNameEx(strName)
       SearchGAL = objRcpts(1).Name
       If objRcpts.Count = 0 Then
           MsgBox ("Kontakt '" & strName & "' konnte nicht gefunden werden")
           End
       End If
       If objRcpts.Count > 10 Then 'Nicht mehr als 10 Treffer anbieten
           MsgBox ("Angabe zu ungenau")
           End
       End If
       If objRcpts.Count > 1 Then
           With frmRcpts   'Userform mit Cbo (cboRcpts) und 2 Cmds
               .Enabled = True
               For intRcpt = 1 To objRcpts.Count
                   .cboRcpts.AddItem objRcpts(intRcpt) 'Treffer in Cbo einfügen
               Next
               .cboRcpts.Value = frmRcpts.cboRcpts.List(0)
               .Show
               SearchGAL = .cboRcpts.Value 'Namensauswahl aus cbo
               .Enabled = False
           End With
       End If
       Exit Function
    GALError:
       MsgBox "An error occurred in modul: " & Application.VBE.ActiveCodePane.CodeModule.Name & _
       vbCrLf & _
       "Error number: " & Err.Number & vbCrLf & "Description: " & Err.Description
       On Error Resume Next
       Set objSession = Nothing
       Set objGAL = Nothing
       Set objRcpts = Nothing
       End
    End Function
  4. Erstelle eine UserForm mit einer ComboBox und zwei Buttons (OK und Abbrechen), um die Treffer anzuzeigen.

  5. Rufe die Funktion auf, um nach einem Namen im globalen Adressbuch zu suchen.


Häufige Fehler und Lösungen

  • Fehler bei der Verbindung zu Outlook: Stelle sicher, dass Outlook geöffnet ist und Du über die erforderlichen Berechtigungen verfügst.
  • Fehlermeldung: "Kontakt konnte nicht gefunden werden": Prüfe, ob der eingegebene Name korrekt ist.
  • Fehler bei der UserForm-Anzeige: Überprüfe, ob die UserForm korrekt erstellt und im Code referenziert wird.

Alternative Methoden

Eine alternative Methode zur Suche im globalen Adressbuch ist die Verwendung von Outlook selbst. Du kannst die Outlook-Funktion "Kontakte suchen" nutzen, um direkt nach einem Namen zu suchen, ohne Excel zu verwenden.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie Du die Funktion GetMail verwenden kannst, um die E-Mail-Adresse eines Kontakts aus dem globalen Adressbuch zu erhalten:

Function GetMail(strRcpt As String) As String
    Dim outApp As Outlook.Application
    Dim outNms As Outlook.Namespace
    Dim outAddr As Outlook.AddressList
    Dim outRcpt As Outlook.AddressEntry
    On Error GoTo MailError
    Set outApp = New Outlook.Application
    Set outNms = outApp.GetNamespace("MAPI")
    Set outAddr = outNms.AddressLists("Globale Adressliste")
    Set outRcpt = outAddr.AddressEntries(strRcpt)
    GetMail = outRcpt.GetExchangeUser.PrimarySmtpAddress
    Exit Function
MailError:
    MsgBox "An error occurred in modul: " & Application.VBE.ActiveCodePane.CodeModule.Name & _
    vbCrLf & _
    "Error number: " & Err.Number & vbCrLf & "Description: " & Err.Description
    On Error Resume Next
    Set outApp = Nothing
    Set outNms = Nothing
    Set outAddr = Nothing
    Set outRcpt = Nothing
    End
End Function

Tipps für Profis

  • Verwende Filter: Wenn Du die Anzahl der Einträge reduzieren möchtest, bevor Du die Suche startest, kannst Du Filter auf die AddressEntries anwenden.
  • VBA-Fehlerbehandlung: Nutze Err.Number und Err.Description, um spezifische Fehler zu identifizieren und zu debuggen.
  • Performance optimieren: Ziehe in Betracht, nur relevante Teile des Adressbuchs zu laden, um die Performance zu verbessern, besonders bei großen addressentries.

FAQ: Häufige Fragen

1. Wie kann ich das globale Adressbuch in Kontakte importieren?
Du kannst die globale Adressliste in Outlook über die Importfunktion importieren. Gehe zu "Datei" > "Importieren und Exportieren" > "In eine andere Anwendung importieren".

2. Was ist der Unterschied zwischen der globalen Adressliste und meinen persönlichen Kontakten?
Die globale Adressliste enthält alle Kontakte innerhalb Deiner Organisation, während persönliche Kontakte nur die Kontakte sind, die Du selbst gespeichert hast.

3. Kann ich mehrere Namen gleichzeitig suchen?
Aktuell unterstützt die Funktion nur die Suche nach einem Namen. Du könntest jedoch den Code anpassen, um eine Liste von Namen zu akzeptieren und entsprechende Ergebnisse zurückzugeben.

4. Wie kann ich die UserForm anpassen?
Du kannst das Design der UserForm im VBA-Editor ändern, indem Du Steuerelemente hinzufügst oder deren Eigenschaften anpasst.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige