Avatar billede per2edb Ekspert
13. marts 2023 - 11:52 Der er 16 kommentarer og
1 løsning

Søgning af kontaktpersoner i en specifik outlook folder

Jeg har en funktion der henter Kontaktpersoner fra Outlook

Den kan udbygges med at søge på en mappe
Hvis jeg vil søge kontaktpersoner i f.eks. Outlooks Indbakke,
hvordan sætter jeg så oFolder ?

Public Function OTLK_GetContact_(ByVal sFirstName As String, ByVal sLastName As String, Optional oFolder As Object)

Kan i hjælpe
Avatar billede Slettet bruger
13. marts 2023 - 13:34 #1
Ja, du kan bruge følgende kode til at søge efter kontaktpersoner i en specifik Outlook-mappe (f.eks. Indbakke):

vbnet:


Public Function OTLK_GetContact_(ByVal sFirstName As String, ByVal sLastName As String, Optional oFolder As Object)
    Dim olApp As Object
    Dim olNS As Object
    Dim olFolder As Object
    Dim olItems As Object
    Dim olContact As Object
    Dim sFilter As String
   
    Set olApp = CreateObject("Outlook.Application")
    Set olNS = olApp.GetNamespace("MAPI")
   
    'Sæt filter til søgning af kontaktpersoner med et bestemt for- og efternavn
    sFilter = "[FirstName]='" & sFirstName & "' AND [LastName]='" & sLastName & "'"
   
    'Søg efter kontaktpersoner i den angivne mappe
    If Not oFolder Is Nothing Then
        Set olFolder = olNS.GetFolderFromID(oFolder.EntryID)
    Else 'Hvis ingen mappe er angivet, brug standardkontaktpersonmappen
        Set olFolder = olNS.GetDefaultFolder(10) '10 = OlDefaultFolders.olFolderContacts
    End If
   
    Set olItems = olFolder.Items
    olItems.Sort "[FullName]"
   
    'Søg efter kontaktpersoner, der opfylder filteret
    Set olContact = olItems.Find(sFilter)
   
    Do While Not olContact Is Nothing
        Debug.Print olContact.FullName
       
        'Søg efter den næste kontaktperson, der opfylder filteret
        Set olContact = olItems.FindNext
    Loop
   
    Set olNS = Nothing
    Set olApp = Nothing
End Function

Du kan kalde funktionen med følgende kode:


python:

OTLK_GetContact_ "John", "Doe"

Dette vil søge efter kontaktpersoner med fornavnet "John" og efternavnet "Doe" i standardkontaktpersonmappen.

Hvis du vil søge efter kontaktpersoner i en bestemt mappe, kan du angive mappen som et objekt i funktionen:

vbnet:


Dim olFolder As Object
Set olFolder = Application.GetNamespace("MAPI").Folders("Din Outlook Mappe Navn").Folders("Din Kontakt Mappe Navn")
OTLK_GetContact_ "John", "Doe", olFolder

Dette vil søge efter kontaktpersoner med fornavnet "John" og efternavnet "Doe" i den angivne mappe.
Avatar billede per2edb Ekspert
13. marts 2023 - 14:10 #2
Hej og Tak

Jeg benytter eksakt samme funktion :-)
men jeg kan ikke få din tilføjelse:

  Dim olFolder As Object
      Set olFolder = Application.GetNamespace("MAPI").Folders("Indbakke").Folders("Kontaktpersoner")
      Call OTLK_GetContact("Kristian", "Jensen", olFolder)

til at virke

Hvor placerer du tilføjelsen
Avatar billede Slettet bruger
13. marts 2023 - 14:28 #3
Beklager forvirringen. Jeg bemærker, at jeg ved en fejl angav forkert funktion i min tidligere besked. Funktionen, jeg refererede til, hedder "OTLK_GetContact_", mens jeg tidligere skrev "OTLK_GetContact". Jeg beklager for forvirringen, dette kan have forårsaget.

Når det er sagt, er tilføjelsen korrekt placeret i koden, og jeg vil foreslå følgende ændringer i funktionen:

vbnet:

Public Function OTLK_GetContact_(ByVal sFirstName As String, ByVal sLastName As String, Optional oFolder As Object)
Dim olApp As Object
Dim olNS As Object
Dim olFolder As Object
Dim olItems As Object
Dim olContact As Object
Dim sFilter As String

vbnet:

Set olApp = CreateObject("Outlook.Application")
Set olNS = olApp.GetNamespace("MAPI")

'Sæt filter til søgning af kontaktpersoner med et bestemt for- og efternavn
sFilter = "[FirstName]='" & sFirstName & "' AND [LastName]='" & sLastName & "'"

'Søg efter kontaktpersoner i den angivne mappe
If Not oFolder Is Nothing Then
    Set olFolder = olNS.GetFolderFromID(oFolder.EntryID)
Else 'Hvis ingen mappe er angivet, brug standardkontaktpersonmappen
    Set olFolder = olNS.GetDefaultFolder(10) '10 = OlDefaultFolders.olFolderContacts
End If

Set olItems = olFolder.Items
olItems.Sort "[FullName]"

'Søg efter kontaktpersoner, der opfylder filteret
Set olContact = olItems.Find(sFilter)

Do While Not olContact Is Nothing
    Debug.Print olContact.FullName
 
    'Søg efter den næste kontaktperson, der opfylder filteret
    Set olContact = olItems.FindNext
Loop

Set olNS = Nothing
Set olApp = Nothing

End Function

For at søge i "Indbakke/Kontaktpersoner" skal du bruge følgende kode:

vbnet:

Dim olFolder As Object
Set olFolder = Application.GetNamespace("MAPI").Folders("Indbakke").Folders("Kontaktpersoner")
OTLK_GetContact_ "Kristian", "Jensen", olFolder

Du kan også justere koden til at bruge en variabel i stedet for en hardkodet mappe:

vbnet:

Dim olFolder As Object
Dim sFolderPath As String
sFolderPath = "Indbakke/Kontaktpersoner" 'Sti til mappen, hvor du vil søge kontaktpersoner
Set olFolder = GetFolderFromPath(sFolderPath)
OTLK_GetContact_ "Kristian", "Jensen", olFolder

Dette kræver, at du har følgende funktion i din kode, som kan konvertere stien til en Outlook-mappe:

vbnet:

Function GetFolderFromPath(ByVal FolderPath As String) As Object
Dim oFolder As Object
Dim FoldersArray As Variant
Dim i As Integer

vbnet:

On Error GoTo GetFolder_Error
If Left(FolderPath, 2) = "\\" Then
    FolderPath = Right(FolderPath, Len(FolderPath) - 2)
End If
Avatar billede per2edb Ekspert
13. marts 2023 - 14:54 #4
Jeg kan desværre ikke få det til at virke

Skal:

Dim olFolder As Object
Set olFolder = Application.GetNamespace("MAPI").Folders("Indbakke").Folders("Kontaktpersoner")
OTLK_GetContact_ "Kristian", "Jensen", olFolder

placeres inde i funktioner og i så fald hvor?

Står det udenfor er GetNamespace ikke defineret og OTLK_GetContact.... skal være Call OTLK_GetContact
Avatar billede Slettet bruger
13. marts 2023 - 15:03 #5
Det ser ud til, at der mangler en del af koden i dit spørgsmål. Kan du give mig mere information om, hvad du prøver at gøre, og hvad der er i din eksisterende funktion? Så vil jeg gøre mit bedste for at hjælpe dig.
Avatar billede per2edb Ekspert
13. marts 2023 - 15:28 #6
De nedenfor viste koder kan vise kontaktpersoner fra outlook mappen Kontaktpersoner  i en listeBox

Hvis oFolder oplyses (Men hvordan???) skulle man også kunne få kontaktpersoner fra andre Outlook mapper

Hermed koderne:

Public Function OTLK_GetContact_All(ByVal sFirstName As String, ByVal sLastName As String, Optional oFolder As Object)
    Dim oOutlook              As Object
    Dim oNS                  As Object
    Dim oContacts            As Object
    Dim oFilterContacts      As Object
'    Dim oFolder              As Object
    Dim sFilter              As String
    Dim bOutlookOpened        As Boolean
    Const olFolderContacts = 10

    'Get/Start Outlook
    On Error Resume Next
    Set oOutlook = GetObject(, "Outlook.Application")        'Bind to existing instance of Outlook
    If Err.Number <> 0 Then        'Could not get instance, so create a new one
        Err.Clear
        Set oOutlook = CreateObject("Outlook.Application")
    Else        'Was already running
        bOutlookOpened = True
    End If
    On Error GoTo Error_Handler

    Set oNS = oOutlook.GetNamespace("MAPI")
 
    If oFolder Is Nothing Then
        Set oContacts = oNS.GetDefaultFolder(olFolderContacts)
       
        'Let's search the default contact folder
        'Debug.Print "Processing Folder " & oContacts.Name
        'Apply a filter to retrieve the specific contact(s) we seek.
     
      ' sFilter = "[FirstName]='" & sFirstName & "' and [LastName]='" & sLastName & "'"
       
    If sFirstName <> "" And sLastName <> "" Then
                  sFilter = "[FirstName]='" & sFirstName & "' and [LastName]='" & sLastName & "'"
      ElseIf sFirstName <> "" And sLastName = "" Then
                    sFilter = "[FirstName]='" & sFirstName & "'"
      ElseIf sFirstName = "" And sLastName <> "" Then
                  sFilter = "[LastName]='" & sLastName & "'"
      Else
            sFilter = ""
      End If
       
        Set oFilterContacts = oContacts.Items.Restrict(sFilter)
        'Debug.Print , oFilterContacts.Count & " appointments found."
        For Each oFilterContacts In oFilterContacts    'Iterate through each contact
            'Do what you want with the retrieved contact(s)' information
          ' Debug.Print , oContacts.Name, oFilterContacts.FullName, oFilterContacts.CompanyName, oFilterContacts.Email1Address
         
            Me.ListBox.AddItem oContacts.Name & ";" & oFilterContacts.FullName & ";" & oFilterContacts.CompanyName & ";" & oFilterContacts.Email1Address
       
        Next
    Else
        Set oContacts = oFolder
    End If

    'Recursively search through any contact folders created by the user
    For Each oFolder In oContacts.Folders
      ' Debug.Print "Processing Folder " & oFolder.Name
       
        'Apply a filter to retrieve the specific contact(s) we seek.
        'sFilter = "[FirstName]='" & sFirstName & "' and [LastName]='" & sLastName & "'"
       
       
    If sFirstName <> "" And sLastName <> "" Then
                  sFilter = "[FirstName]='" & sFirstName & "' and [LastName]='" & sLastName & "'"
      ElseIf sFirstName <> "" And sLastName = "" Then
                    sFilter = "[FirstName]='" & sFirstName & "'"
      ElseIf sFirstName = "" And sLastName <> "" Then
                  sFilter = "[LastName]='" & sLastName & "'"
      Else
            sFilter = ""
      End If
       
       
       
       
        Set oFilterContacts = oFolder.Items.Restrict(sFilter)
        'Debug.Print , oFilterContacts.Count & " appointments found."
        For Each oFilterContacts In oFilterContacts    'Iterate through each contact
            'Do what you want with the retrieved contact(s)' information
          ' Debug.Print , oFolder.Name, oFilterContacts.FullName, oFilterContacts.CompanyName, oFilterContacts.Email1Address
           
              Me.ListBox.AddItem oFolder.Name & ";" & oFilterContacts.FullName & ";" & oFilterContacts.CompanyName & ";" & oFilterContacts.Email1Address
         
        Next

        Call OTLK_GetContact_All(sFirstName, sLastName, oFolder)
    Next oFolder

    If bOutlookOpened = False Then      'Since we started Outlook, we should close it now that we're done
        oOutlook.Quit    'There seems to be a delay in this action taking place, but does eventually take place
    End If

Error_Handler_Exit:
    On Error Resume Next
    If Not oFolder Is Nothing Then Set oFolder = Nothing
    If Not oFilterContacts Is Nothing Then Set oFilterContacts = Nothing
    If Not oContacts Is Nothing Then Set oContacts = Nothing
    If Not oNS Is Nothing Then Set oNS = Nothing
    If Not oOutlook Is Nothing Then Set oOutlook = Nothing
    Exit Function

Error_Handler:
    MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
          "Error Number: " & Err.Number & vbCrLf & _
          "Error Source: OTLK_GetContact" & vbCrLf & _
          "Error Description: " & Err.Description & _
          Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
          , vbOKOnly + vbCritical, "An Error has Occurred!"
    Resume Error_Handler_Exit
End Function
Avatar billede Slettet bruger
13. marts 2023 - 15:51 #7
For at oplyse en anden Outlook-mappe end standard-kontaktmappen i funktionen OTLK_GetContact_All kan du angive mappen som en parameter. Hvis en mappe ikke er angivet, vil funktionen søge efter kontakter i standardkontaktmappen.

For at angive en anden mappe skal du sørge for, at mappen er åben i Outlook, og derefter angive mappen som en parameter, når du kalder funktionen. Mappen skal være en objektvariabel af typen Outlook-mappen (Outlook.Folder).

For eksempel, hvis du vil søge efter kontakter i en mappe kaldet "MyContacts", kan du bruge følgende kode:

Dim oMyContacts As Outlook.Folder
Set oMyContacts = Session.GetDefaultFolder(olFolderContacts).Folders("MyContacts")
OTLK_GetContact_All "John", "Doe", oMyContacts

I dette eksempel oprettes en variabel "oMyContacts" og angives som mappen "MyContacts" i standardkontaktmappen. Derefter kaldes funktionen OTLK_GetContact_All med de angivne parametre, inklusive mappen "oMyContacts".
Avatar billede per2edb Ekspert
13. marts 2023 - 17:11 #8
Jeg har desværre det samme spørgsmål som sidst

Hvor skal disse koder placeres:

Dim oMyContacts As Outlook.Folder
Set oMyContacts = Session.GetDefaultFolder(olFolderContacts).Folders("Indbakke")
OTLK_GetContact_All "Kristian", "Jensen", oMyContacts

Hvis indenfor:
Public Function OTLK_GetContact_All(ByVal sFirstName As String, ByVal sLastName As String, Optional oFolder As Object)
så hvor

Hvis udenfor så melder GetDefaultFolder fejl. Der skal også være call til OTLK_.....
Avatar billede Slettet bruger
13. marts 2023 - 17:23 #9
Hvis funktionen OTLK_GetContact_All er en del af en VBA-modul i Microsoft Outlook, så skal koden placeres inden for modulet. Du kan oprette et nyt VBA-modul ved at gå til "Visual Basic Editor" og derefter klikke på "Indsæt" og vælge "Modul". Hvis modulet allerede er oprettet, kan du indsætte koden i det relevante modul.

Hvis du ønsker at kalde funktionen fra et andet modul eller fra en anden applikation, så skal du sørge for at have en reference til Outlook-objektbiblioteket og derefter kalde funktionen med de korrekte parametre. Du kan tilføje en reference til Outlook-objektbiblioteket ved at gå til "VBA Editor" og derefter klikke på "Værktøjer" og vælge "Reference". Find derefter "Microsoft Outlook XX.X Object Library" og markér det, og klik på "OK".

For at kalde funktionen fra en anden procedure eller funktion, skal du skrive:

vbnet:

Dim oMyContacts As Outlook.Folder
Set oMyContacts = Session.GetDefaultFolder(olFolderContacts).Folders("Indbakke")
Call OTLK_GetContact_All("Kristian", "Jensen", oMyContacts)

Hvis du vil kalde funktionen fra et andet program eller en anden applikation, skal du først oprette en Outlook-objektvariabel og derefter kalde funktionen på følgende måde:

vbnet:

Dim oApp As Outlook.Application
Dim oMyContacts As Outlook.Folder

Set oApp = New Outlook.Application
Set oMyContacts = oApp.Session.GetDefaultFolder(olFolderContacts).Folders("Indbakke")

Call OTLK_GetContact_All("Kristian", "Jensen", oMyContacts)

Bemærk, at du også skal sørge for at afslutte Outlook-programmet eller sætte objektvariablerne til ingenting, når du er færdig med at bruge dem.
Avatar billede per2edb Ekspert
13. marts 2023 - 17:47 #10
Dim oApp As Outlook.Application
Dim oMyContacts As Outlook.Folder

Set oApp = New Outlook.Application
Set oMyContacts = oApp.Session.GetDefaultFolder(olFolderContacts).Folders("Indbakke")  <= Melder fejl

Call OTLK_GetContact_All("Kristian", "Jensen", oMyContacts)
Avatar billede Slettet bruger
13. marts 2023 - 18:00 #11
Her vil du forsøge at oprette et nyt Outlook-programobjekt og derefter få adgang til standardmappen Kontakter i Session-objektet ved hjælp af GetDefaultFolder-metoden og tilføje mappen "Indbakke" i denne mappe. Men der er en fejl i koden, fordi du forsøger at tilføje mappen "Indbakke" i Kontakter-mappen, som ikke er en undermappe til Kontakter-mappen.

Prøv at rette koden som følger:

vb:

Dim oApp As Outlook.Application
Dim oMyContacts As Outlook.Folder

Set oApp = New Outlook.Application
Set oMyContacts = oApp.Session.GetDefaultFolder(olFolderInbox).Folders("Kontakter")

Call OTLK_GetContact_All("Kristian", "Jensen", oMyContacts)

Dette vil oprette et nyt Outlook-programobjekt, få adgang til standardmappen Indbakke i Session-objektet ved hjælp af GetDefaultFolder-metoden og derefter tilføje undermappen "Kontakter" i denne mappe. Det vil derefter kalde funktionen OTLK_GetContact_All med de angivne parametre.
Avatar billede per2edb Ekspert
13. marts 2023 - 18:26 #12
Samme fejl:
Dim oApp As Outlook.Application
Dim oMyContacts As Outlook.Folder

Set oApp = New Outlook.Application
Set oMyContacts = oApp.Session.GetDefaultFolder(olFolderInbox).Folders("Kontakter")  <= Fejl
Call OTLK_GetContact_All("Kristian", "Jensen", oMyContacts)

Tror at Fejlen er at GetDefaultFolder ikke er defineret
Jeg forklarer lige:

Jeg har en form
På formen ligger en Listeboks , et inputfeld til for og efternavn
En buttom hvor der i klik eventen ligger kaldet vi slås med
I formen ligger:
Public Function OTLK_GetContact_All(ByVal sFirstName As String, ByVal sLastName As String, Optional oFolder As Object)
Avatar billede Slettet bruger
13. marts 2023 - 18:36 #13
Jeg forstår bedre nu. Problemet kan muligvis skyldes, at Outlook-funktionsbiblioteket ikke er indlæst i VBA-editoren. Prøv følgende:

1    Åbn VBA-editoren i Outlook ved at trykke på "Alt + F11".
2    I menulinjen, vælg "Værktøjer" -> "Referencer".
3    I vinduet "Reference" skal du finde og markere indstillingen for "Microsoft Outlook XX.X Object Library". Hvis det allerede er markeret, kan du prøve at fjerne markeringen, lukke vinduet og derefter markere den igen.
4    Klik på "OK" for at gemme dine ændringer og lukke vinduet.

Derefter kan du prøve at køre koden igen. Hvis det stadig ikke fungerer, kan du prøve at erstatte linjen "Set oMyContacts = oApp.Session.GetDefaultFolder(olFolderInbox).Folders("Kontakter")" med "Set oMyContacts = oApp.Session.GetDefaultFolder(olFolderContacts)" for at få adgang til standardkontaktmappen.
Avatar billede per2edb Ekspert
14. marts 2023 - 09:15 #14
Hej
Microsoft Outlook XX.X Object Library" er geninstalleret
men Desværre ....heller ikke det er fejlen

Denne nedenfor viste linie giver ikke fejl men der findes ikke nogen kontaktpersoner
Set oMyContacts = oApp.Session.GetDefaultFolder(olFolderContacts)

Hvis oMyContacts fjernes fra kaldet virker funktionen men der søges kun i standart kontaktpersoner
Avatar billede per2edb Ekspert
14. marts 2023 - 09:17 #15
Hej
Microsoft Outlook XX.X Object Library" er geninstalleret
men Desværre ....heller ikke det er fejlen

Denne nedenfor viste linie giver ikke fejl men der findes ikke nogen kontaktpersoner
Set oMyContacts = oApp.Session.GetDefaultFolder(olFolderContacts)

Hvis oMyContacts fjernes fra kaldet virker funktionen men der søges kun i standart kontaktpersoner
Avatar billede Slettet bruger
14. marts 2023 - 11:18 #16
Ah, desværre hvis man afinstalleret eller geninstallerer er disse ikke længere tilgængelige som standard.

🙃 Held og lykke med dette, jeg hopper af her  👍
Avatar billede per2edb Ekspert
14. marts 2023 - 20:53 #17
Ja jeg må vist erkende det ikke er nogen let opgave - nærmest umuligt så jeg vil sige mange tak for din tolmodighed.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester