Avatar billede gladhund Nybegynder
20. januar 2011 - 10:14 Der er 20 kommentarer og
1 løsning

Opdatere kontakter i Outlook fra excel sheet

Kære eksperter,

Her er en der nok er lidt tung.

Jeg har et lille salgssystem i excel (shared workbook), og ønsker, at man kan klikke på en knap og så sendes alle kontaktdata til Outlook, så:
- Kontakter der ikke eksisterer i Outlook tilføjes fra Excel
- Kontakter, hvor navnet eksisterer i Outlook overskrives med data fra Excel
- Kontakter der eksisterer i Outlook, men ikke er på Excel listen forbliver uberørte

Jeg har fundet følgende på nettet som udgangspunkt:
- Denne tråd skulle gøre det meste, men er for langhåret til at kan bruge det uden lidt hjælp: http://www.ozgrid.com/forum/showthread.php?t=12616&page=1

- Denne tråd importerer alt, hvilket ikke er nok: http://www.codeforexcelandoutlook.com/blog/2009/01/create-outlook-contacts-in-bulk-using-vba-automation/

Det ville være dejligt, hvis nogen kunne hjælpe :).
Avatar billede gladhund Nybegynder
21. januar 2011 - 14:12 #1
Her er den kodebid der ikke virker - hvis nogen kan hjælpe lægger jeg gerne 200 point i stedet for 100...:

Do Until lCount = lNumRows

  ' assign variant values to intermediate string varbs
  strCurrentFirstName = varContactInfo(lCount, 1)
  strCurrentLastName = varContactInfo(lCount, 2)
  strCurrentEmailAddr = varContactInfo(lCount, 3)
  strCurrentCompany = varContactInfo(lCount, 4)
  strCurrentBusinessPhone = varContactInfo(lCount, 5)
  strCurrentBusinessFax = varContactInfo(lCount, 6)
  strCurrentHomePhone = varContactInfo(lCount, 7)

 
  ' check for existing contact
On Error Resume Next
Set olContact = olApp.GetNamespace("MAPI").GetDefaultFolder(olFolderContacts).Items.Item(strCurrentFirstName & " " & strCurrentLastName)

If Not olContact Is Nothing Then

  ' CreateItem will create a contact in the default folder
  Set olContact = olApp.CreateItem(2) ' olContactItem

  With olContact
    .FirstName = strCurrentFirstName
    .LastName = strCurrentLastName
    .Email1Address = strCurrentEmailAddr
    .CompanyName = strCurrentCompany
    .BusinessTelephoneNumber = strCurrentBusinessPhone
    .BusinessFaxNumber = strCurrentBusinessFax
    .HomeTelephoneNumber = strCurrentHomePhone
  End With

  'olContact.Close olSave
  olContact.Close 0

Else
End If

  lCount = lCount + 1
Loop
Avatar billede anlu Nybegynder
21. januar 2011 - 20:17 #2
Nu skriver du jo ikke hvad det er der ikke virker, og jeg er ikke specielt skarp på outlooks objektmodel.

Men umiddelbart ser det ikke helt skævt ud, dog indlæser du kun nye kontakter. For eksisterende kontakter gør du jo faktisk ikke noget. Jeg ville umiddelbart prøve at flytte "End If "op før "With olContact" (og så slette den Else der ikke gør noget :)
Avatar billede gladhund Nybegynder
21. januar 2011 - 21:18 #3
Tak for svaret, anlu :).

Jeg får ingen decideret fejl fra koden, men der sker bare ikke det ønskede.

Jeg har prøvet som du siger, og det resulterer i fejlfri gennemgang af koden, men ingen kontakter i Outlook. Det er som om koden aldrig når ned til With sætningen...
Avatar billede gladhund Nybegynder
21. januar 2011 - 21:59 #4
Nu har jeg prøvet at lægge nogle msgboxe ind og fjerne "Not", for der sker noget når jeg gør det... Det er klumset, men kan forholde bringe mig videre (koden er nederst)...

Nu kommer følgende beskeder (der er fire navne på excel listen):
Not nothing
Write
Navn 1
Write Navn 2
Navn 2
Write Navn 2
Navn 3
Write Navn 3

Og resultatet er, at Navn 4 er oprettet i Outlook. Jeg er sat af.

Do Until lCount = lNumRows

  ' assign variant values to intermediate string varbs
  strCurrentFirstName = varContactInfo(lCount, 1)
  strCurrentLastName = varContactInfo(lCount, 2)
  strCurrentEmailAddr = varContactInfo(lCount, 3)
  strCurrentCompany = varContactInfo(lCount, 4)
  strCurrentBusinessPhone = varContactInfo(lCount, 5)
  strCurrentBusinessFax = varContactInfo(lCount, 6)
  strCurrentHomePhone = varContactInfo(lCount, 7)

 
  ' check for existing contact
On Error Resume Next
Set olContact = olApp.GetNamespace("MAPI").GetDefaultFolder(olFolderContacts).Items.Item(strCurrentFirstName & " " & strCurrentLastName)

'BESKED 1: ER DER INDLÆST EN KONTAKT?
MsgBox (olContact)

If olContact Is Nothing Then

'BESKED 2: ER KONTAKTEN TOM?
MsgBox ("Not nothing")

  ' CreateItem will create a contact in the default folder
  Set olContact = olApp.CreateItem(2) ' olContactItem

End If

'DER SKRIVES TIL OUTLOOK
MsgBox ("write" & olContact)

  With olContact
    .FirstName = strCurrentFirstName
    .LastName = strCurrentLastName
    .Email1Address = strCurrentEmailAddr
    .CompanyName = strCurrentCompany
    .BusinessTelephoneNumber = strCurrentBusinessPhone
    .BusinessFaxNumber = strCurrentBusinessFax
    .HomeTelephoneNumber = strCurrentHomePhone
  End With

  'olContact.Close olSave
  olContact.Close 0


  lCount = lCount + 1
 
Loop
Avatar billede anlu Nybegynder
22. januar 2011 - 10:25 #5
Ja - klart skulle det der "Not" væk.

Men gør den ikke det rigtige? Som jeg læser det, så findes Navn 1-3 allerede som kontaktperson og den har oprettet den fjerde. Det jeg ikke kan se er om der burde være ændret noget for navn 1-3.
Avatar billede gladhund Nybegynder
22. januar 2011 - 11:31 #6
Nope, ingen af kontakterne eksisterer i Outlook :/. Og jeg forstår heller ikke hvorfor den smider de to første beskeder. Den burde vel starte med et navn...
Avatar billede anlu Nybegynder
22. januar 2011 - 13:06 #7
Det at den skriver navn 1-3 må betyde at de findes i outlook et eller andet sted - den skriver jo kun navnet hvis den får sat olContact til noget i dette statement:

olApp.GetNamespace("MAPI").GetDefaultFolder(olFolderContacts).Items.Item(strCurrentFirstName & " " & strCurrentLastName)

??

Umiddelbart ville jeg gætte på at de to første sætninger kom fra indsættelsen af navn 4, som jo ikke var der i forvejen. Hvad gør den med navn 4, hvis du kører det igen, hvor navn 4 jo så eksisterer?
Avatar billede gladhund Nybegynder
22. januar 2011 - 13:20 #8
Ja, det lyder jo rigtigt hvad du siger :).

Hvis jeg kører den igen sker der følgende:
Not nothing
Write
Navn 1
Write Navn 1
Navn 2
Write Navn 2
Navn 4 (!)
Write Navn 4

Og så tilføjes Navn 3!

Så ved første kørsel tilføjes Navn 4. Ved anden kørsel tilføjes Navn 3. Og inden første kørsel er ingen af navnene i Outlook. Øhhh :)
Avatar billede gladhund Nybegynder
22. januar 2011 - 14:27 #9
Det virker som om, at det er den her sætning, der giver ballade:

olApp.GetNamespace("MAPI").GetDefaultFolder(olFolderContacts).Items.Item(strCurrentFirstName & " " & strCurrentLastName)

Hvis man kunne lave testen på en anden måde måske, men jeg er ikke skrap i hvordan man kommunikerer med Outlook :(
Avatar billede anlu Nybegynder
22. januar 2011 - 16:24 #10
Næh, problemet er vist at ingen af os er skrappe til det med outlook :o)

Prøv at indsætte noget tracking af hvilke foldere du faktisk arbejder i fx:

    Dim f As Folder
    Set f = olApp.GetNamespace("MAPI").GetDefaultFolder(olFolderContacts)
    MsgBox f.FolderPath

og
    MsgBox olContact.Parent.FolderPath
inden with-statementet. Giver de så det du ville forvente?
Avatar billede gladhund Nybegynder
22. januar 2011 - 16:41 #11
Ok, så... :). Det undrer mig også lidt, at der ikke er nogen der lige smutter forbi her med løsningen? Jeg havde ikke regnet med at det ville være et problem for de hajer der er her inde.

Zimbra - mit navn - Contacts. Det skulle være korrekt :)
Avatar billede anlu Nybegynder
22. januar 2011 - 16:54 #12
Jeg tænker om der sker noget vi ikke kan gennemskue fordi du har sat on error resume next - så fanger du aldrig, når der sker en fejl. Så prøve evt at lave noget anden fejlhåndtering.

Jeg er vist desværre ikke til den store hjælp i dag, så måske du skal lukke her, og så oprette et nyt spørgsmål under Outlook - det kan være der kommer nogle bedre kvalificerede forbi der :o)
Avatar billede gladhund Nybegynder
22. januar 2011 - 17:03 #13
OK, det gør jeg. Tak fordi du prøvede - altid en fornøjelse, når du kigger forbi mine spørgsmål :).
Avatar billede anlu Nybegynder
23. januar 2011 - 01:13 #14
Jeg tror jeg har luret det. Problemet er som du skriver den sætning hvor du slår navnet op. olContact bliver ikke nulstillet fordi opslaget fejler når det er en ukendt kontakt, og derfor peger den stadig på den kontakt der lige er blevet indsat. Denne overskrives så med de nye informationer. Derfor er det kun den sidste der ender med at være sat ind.

Så prøv at nulstille olContact før opslaget:

Set olContact = Nothing
Set olContact = olApp.GetNamespace("MAPI").GetDefaultFolder(olFolderContacts).Items.Item(strCurrentFirstName & " " & strCurrentLastName)
Avatar billede gladhund Nybegynder
23. januar 2011 - 15:34 #15
Der håbede jeg sgu lige at du havde den... Nu sker der simpelthen ingenting. Ikke engang en enkelt msgbox. Jeg synes ellers, det løs logisk det du skrev.
Avatar billede anlu Nybegynder
23. januar 2011 - 17:53 #16
Hmmm... meget mystisk - for første den gang den kører igennem bør der jo ikke være nogen forskel ved eksplicit at sætte olContact til Nothing - så den burde jo komme til der hvor den skriver "Not nothing"???
Har du prøvet at steppe igennem stille og roligt med F8, og se hvad olContact bliver sat til?
Avatar billede gladhund Nybegynder
23. januar 2011 - 20:00 #17
Ved ikke om jeg gør det rigtigt, men det ser ud til, at den går fra denne sætning:

Set olContact = olApp.GetNamespace("MAPI").GetDefaultFolder(olFolderContacts).Items.Item(strCurrentFirstName & " " & strCurrentLastName)

Lige ned til denne:

ErrorHandler:
CreateContactsFromList = False

Og springer stort set hele løkken over...

Hvis jeg fjerner ' ved On Error Resume Next (den har ' foran i kørslen ovenfor), så sker der følgende:

Not Nothing
write
contact folder stien vises i msgbox

Det gør den fire gange og skriver alle kontakterne ind i Outlook!

Hvis jeg kører koden igen, så overskriver den kontakterne som den skal.

Jeg ved ikke hvad der sker mht. fejl og fejlhåndtering, men det ser ud til at du har løst det :).
Avatar billede anlu Nybegynder
23. januar 2011 - 20:12 #18
super - ja, da jeg skrev det andet antog jeg at du stadig kørte med on error resume next.
Avatar billede gladhund Nybegynder
23. januar 2011 - 22:33 #19
Det kan jeg godt forstå - jeg har heller ikke fortalt, at jeg havde taget den sætning ud. Jeg gjorde det for netop at registrere hvis der opstod fejl - om jeg så fik en besked om hvad fejlen var.

Skal jeg oprette en ny tråd med 100 ekstra point og lægge den ind her?
Avatar billede anlu Nybegynder
23. januar 2011 - 22:43 #20
Nej skidt med det - jeg lægger et svar her, så er det fint :o)
Avatar billede gladhund Nybegynder
23. januar 2011 - 22:48 #21
Så siger jeg 100 tak :).
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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