Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1408to1412
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
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

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

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

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige