Newsgroup: it.comp.appl.access
Titolo: Access 2010 - Importare contati da outlook 2010

Sistema operativo Windows 8. E' possibile importare in Access 2010 i contatti di Outlook 2010 senza
tralasciare alcun campo?
Esiste un sistema diretto (wizard o simili), oppure é possibile tramite vba o come?
Grazie a quanti risponderanno.
Ciao

Gianni wrote :

Access 2013/64, dovrebbe funzionare anche con Access 2010
==========================================================
Private Sub Command1_Click()
Dim Kontact As Outlook.Folder, i As ContactItem
Dim appOutlook As Outlook.Application
Dim RS As Recordset
 
Set RS = CurrentDb.OpenRecordset("OutlookContacts")
Set appOutlook = CreateObject("Outlook.Application")
Set Kontact = Session.GetDefaultFolder(olFolderContacts)
 
For Each i In Kontact.Items
    RS.AddNew
    RS![FullName] = i.FullName
    RS![JobTitle] = i.JobTitle
    RS![FileAs] = i.FileAs
    RS![HomeAddressStreet] = i.HomeAddressStreet
    RS![HomeAddressCity] = i.HomeAddressCity
    RS![Email1Address] = i.Email1Address
    RS![HomeTelephoneNumber] = i.HomeTelephoneNumber
    RS![BusinessTelephoneNumber] = i.BusinessTelephoneNumber
    RS![MobileTelephoneNumber] = i.MobileTelephoneNumber
    RS.Update
Next
 
End Sub
===============================================
 
Bruno


Grazie per la risposta. Conoscendoti, attraverso il NG, penso che non avrò problemi ad applicare il
tuo codice alla mia applicazione; in giornata effettuerò delle prove ed a presto te ne darò
riscontro.
Ancora grazie... Gianni

 Ancora grazie... Gianni
 
Non ho precisato (la gatta frettolosa...) che la tabella 
"OutlookContacts" deve esistere coi 9 campi indicati
nel For Each... Next della procedura, tutti Short Text (255).
E neppure che detta tabella venga svuotata ad ogni esecuzione.
 
Bruno


L'ho provata così com'é e funziona benissimo. E' anche superveloce. Grazie.
Quello che vorrei capire, però, é questo:
tu hai impostato dei campi che - se ho capito bene - DEVONO essere quelli e solo quelli? Se é così,
come faccio ad importare gli altri campi che mi interessano (alcuni di quelli nella routine non mi
servono, ma altri non presenti mi sono necessari)?
Dove posso attingere informazioni sull'utilizzo proprio di queste specifiche?
Chiedo troppo? Sono disposto a studiare...
Gianni
 

Gianni brought next idea :

Puoi liberamente modificare, aggiungere, eliminare elementi dal
loop For Each... Next. a condizione che corrispondentemente
vengano eseguite le stesse identiche variazioni sui record
di OutlookContacts.
 
Qui trovi i Contact Members:
http://msdn.microsoft.com/en-us/library/microsoft.windowsmobile.pocketoutlook.contact_members.aspx
 
 
Bruno

Bruno
 
Eccoli! E' quello che desideravo. Adesso potrň finalmente sbizzarrirmi e prelevare i dati che mi
servono da Outlook.
Il tuo aiuto é stato veramente prezioso e soprattutto risolutivo.
Grazie ancora una volta e... buon fine anno.
Gianni

>>>>  
http://www.bb2002.it
 :)  <<<<<
........... [ al lavoro ] ...........

Bruno
Allora Bruno, sono a terra. Applicando gli items da te suggeriti (sono 9 per l'esattezza), riesco ad
ottenere da Outlook i corrispondenti valori che possono essere pieni o vuoti a seconda di quello che
ho inserito nei rispettivi campi quando ho creato il contatto.
Il problema é che ho provato ad aggiungere le altre voci (TUTTE) dei contact.items e, tranne che per
i campi da te indicati, ottengo un errore. 
Non ho molta confidenza con l'inglese che non ho proprio studiato a scuola (ai miei tempi era di
moda il francese) e ho difficoltà ad interpretare quanto riportato nella pagina web che mi hai
indicato.
Cerco di esporre meglio il mio problema:
- Ho 10 contatti per i quali ho compilato solo i campi A, B e C, sebbene il form mi dia la
possibilità di compilare anche altri campi come D, E, F...ecc.
- Una volta riempiti i miei records in Outlook, in fase di visualizzazione ho impostato solo i campi
che mi interessano, cioé A, B e C.
- Quando voglio importare i dati in una tabella Access, utilizzando la tua routine, seleziono i
campi A, B e C e tutto va bene. Se però per assurdo ci metto tutti i campi previsti nella
contact.members, invece di passarmi solo i dati di A, B e C, ricevo un msg di errore.
Come potrei fare per importare TUTTI i campi del form di Outlook? Esiste una soluzione?
Grazie

Gianni was thinking very hard :

TUTTI, sviluppando le combo della scheda Outlook, significa
ben più di 100... il che mi sembra assurdo.
Fa' l'elenco dei campi che vorresti trasferire, immagino sarà in 
italiano.
Vedrò di reperire i corrispondenti termini in inglese che
servono nella programmazione.
 
Bruno

Bruno
 
Hai ragione, sono tanti, ma per il trasferimento dei dati sull'agenda di mia moglie, sarebbe proprio
così. Però mi rendo conto che la cosa possa essere "pesante" ed allora ecco l'elenco dei campi che
almeno mi occorrerebbero (contiene già le voci indicate in routine):
 
Cognome
Nome
Cellulare
Telefono (ab.)
Telefono (Uff.)
Altro telefono
Fax (uff.)
Posta elettronica
Altro fax
Altro indirizzo
Archivia come
Fax (ab.)
Home page personale
Indirizzo
Indirizzo (ab.)
Indirizzo (Uff.)
Note
Paese
Pagina Web
Posizione
Provincia
Società
Telefono (ab.) 2
Telefono (Uff.) 2
Telefono principale
 
Non so se sarà possibile e ti chiedo scusa per l'insistenza, ma con questi risolverei comunque la
questione.
Grazie

Gianni has brought this to us :

Il campo Note è una storia lunga... non so come importarlo.
Gli altri... spero d'averci preso!
 
Sostituisci nella procedura il For Each... Next con:
====================================================
For Each i In Kontact.Items
    RS.AddNew
    ' Nome
    RS![Title] = i.Title
    RS![FirstName] = i.FirstName
    RS![LastName] = i.LastName
    RS![JobTitle] = i.JobTitle
    ' Telefono
    RS![PrimaryTelephoneNumber] = i.PrimaryTelephoneNumber
    RS![MobileTelephoneNumber] = i.MobileTelephoneNumber
    RS![OtherTelephoneNumber] = i.OtherTelephoneNumber
    RS![HomeTelephoneNumber] = i.HomeTelephoneNumber
    RS![Home2TelephoneNumber] = i.Home2TelephoneNumber
    RS![BusinessTelephoneNumber] = i.BusinessTelephoneNumber
    RS![Business2TelephoneNumber] = i.Business2TelephoneNumber
    ' FAX
    RS![HomeFaxNumber] = i.HomeFaxNumber
    RS![BusinessFaxNumber] = i.BusinessFaxNumber
    RS![OtherFaxNumber] = i.OtherFaxNumber
    ' eMail
    RS![Email1Address] = i.Email1Address
    RS![Email2Address] = i.Email2Address
    RS![Email3Address] = i.Email2Address
    ' Indirizzo
    RS![HomeAddress] = i.HomeAddress
    RS![HomeAddressStreet] = i.HomeAddressStreet
    RS![HomeAddressCity] = i.HomeAddressCity
    RS![HomeAddressPostalCode] = i.HomeAddressPostalCode
    RS![HomeAddressState] = i.HomeAddressState
    RS![HomeAddressCountry] = i.HomeAddressCountry
    RS![BusinessAddress] = i.BusinessAddress
    RS![BusinessAddressStreet] = i.BusinessAddressStreet
    RS![BusinessAddressCity] = i.BusinessAddressCity
    RS![BusinessAddressState] = i.BusinessAddressState
    RS![BusinessAddressCountry] = i.BusinessAddressCountry
    RS![BusinessAddressPostalCode] = i.BusinessAddressPostalCode
    RS![OtherAddress] = i.OtherAddress
    RS![OtherAddressStreet] = i.OtherAddressStreet
    RS![OtherAddressCity] = i.OtherAddressCity
    RS![OtherAddressPostalCode] = i.OtherAddressPostalCode
    RS![OtherAddressState] = i.OtherAddressState
    RS![OtherAddressCountry] = i.OtherAddressCountry
    ' Varie
    RS![WebPage] = i.WebPage
    RS![CompanyName] = i.CompanyName
    RS![PersonalHomePage] = i.PersonalHomePage
    RS![FileAs] = i.FileAs
    '
    RS.Update
Next
===================================================
 
... e ricostruisci la tabella OutlookContacts con 39 campi
i cui nomi sono quelli contenuti in RS![xxx], Text(255),
AllowZeroLength = YES
 
Buon divertimento.
 
Bruno

Bruno
Quando mi hai risposto per la prima volta, nel commento della seconda dicevi di aver fatto come la
gatta frettolosa... Ebbene, mi é capitata la stessa cosa.
Mi hai passato il link dei Contact Members, ho fatto una prova troppo preso dall'ansia ed è andata
male. Invece la risposta ERA LI': mi ero semplicemente dimenticato di aggiornare la mia tabella e
per quello non riuscivo a caricare gli altri campi. Ora, ovviamente, sono stato più accorto e potrei
importare TUTTI i campi di Outlook ammesso che mi servano proprio tutti.
Per quanto riguarda il campo NOTE se non ci sei riuscito tu non credo possa farlo io, ma proverò a
cercare.
Quindi grazie, grazie davvero per l'ottimo suggerimento.
Gianni

 l'ottimo suggerimento. Gianni
 
Il campo "Notes" non è come gli altri di cui parliamo un "Member"
di "ContactItem".
Le uniche procedure che ho trovato in rete sono in C# che io
non conosco e che comunque, nella circostanza, non m'interessa.
 
Ma io non sono un buon cane da tartufo: non trovo mai niente...
 
Bruno

 Ma io non sono un buon cane da tartufo: non trovo mai niente...
 
Io peggio di te, ma MOLTO peggio :-)

radica...@gmail.com
 presented the following explanation :

Final release:
abbiamo anche il campo Note e crea la tabella coi 40 campi.
============================================================
Private Sub Command1_Click()
Dim Kontact As Outlook.Folder, n As Integer, j As Integer
Dim i As ContactItem, appOutlook As Outlook.Application, NewField As 
Field
Dim RS As Recordset, TableName As String, NewTab As TableDef
 
'---  Definizioni  
----------------------------------------------------------------
TableName = "OutlookContacts"
n = 40
ReDim CT(1 To 2, 1 To n)
CT(1, 1) = "Title":                         CT(1, 2) = "FirstName"
CT(1, 3) = "LastName":                      CT(1, 4) = "JobTitle"
CT(1, 5) = "PrimaryTelephoneNumber":        CT(1, 6) = 
"MobileTelephoneNumber"
CT(1, 7) = "OtherTelephoneNumber":          CT(1, 8) = 
"HomeTelephoneNumber"
CT(1, 9) = "Home2TelephoneNumber":          CT(1, 10) = 
"BusinessTelephoneNumber"
CT(1, 11) = "Business2TelephoneNumber":     CT(1, 12) = "HomeFaxNumber"
CT(1, 13) = "BusinessFaxNumber":            CT(1, 14) = 
"OtherFaxNumber"
CT(1, 15) = "Email1Address":                CT(1, 16) = "Email2Address"
CT(1, 17) = "Email3Address":                CT(1, 18) = "HomeAddress"
CT(1, 19) = "HomeAddressStreet":            CT(1, 20) = 
"HomeAddressPostalCode"
CT(1, 21) = "HomeAddressCity":              CT(1, 22) = 
"HomeAddressState"
CT(1, 23) = "HomeAddressCountry":           CT(1, 24) = 
"BusinessAddress"
CT(1, 25) = "BusinessAddressStreet":        CT(1, 26) = 
"BusinessAddressPostalCode"
CT(1, 27) = "BusinessAddressCity":          CT(1, 28) = 
"BusinessAddressState"
CT(1, 29) = "BusinessAddressCountry":       CT(1, 30) = "OtherAddress"
CT(1, 31) = "OtherAddressStreet":           CT(1, 32) = 
"OtherAddressPostalCode"
CT(1, 33) = "OtherAddressCity":             CT(1, 34) = 
"OtherAddressState"
CT(1, 35) = "OtherAddressCountry":          CT(1, 36) = "WebPage"
CT(1, 37) = "CompanyName":                  CT(1, 38) = 
"PersonalHomePage"
CT(1, 39) = "FileAs":                       CT(1, 40) = "Body"
'---------------------------------------------------------------------------------------
 
DoCmd.Hourglass True
 
On Error Resume Next
DoCmd.DeleteObject acTable, TableName
On Error GoTo 0
 
Set NewTab = CurrentDb.CreateTableDef(TableName)
For j = 1 To n - 1
    Set NewField = NewTab.CreateField(CT(1, j), dbText, 255)
    NewField.AllowZeroLength = True
    NewTab.Fields.Append NewField
Next
Set NewField = NewTab.CreateField(CT(1, j), dbMemo, 65536)
NewField.AllowZeroLength = True
NewTab.Fields.Append NewField
CurrentDb.TableDefs.Append NewTab
 
Set RS = CurrentDb.OpenRecordset(TableName)
Set appOutlook = CreateObject("Outlook.Application")
Set Kontact = Session.GetDefaultFolder(olFolderContacts)
 
For Each i In Kontact.Items
    RS.AddNew
    ' Nome
    RS![Title] = i.Title
    RS![FirstName] = i.FirstName

    RS![WebPage] = i.WebPage
    RS![CompanyName] = i.CompanyName
    RS![PersonalHomePage] = i.PersonalHomePage
    RS![FileAs] = i.FileAs
    RS![Body] = i.Body ' È il campo Notes
    '
    RS.Update
Next
DoCmd.Hourglass False
 
End Sub
============================================================
 
Bruno

Bruno
Accidenti! Per me é l'apoteosi. Sono riuscito, GRAZIE A TE, a recuperare tutto quello che mi
interessava. Ora dovrò mettermi a studiare la prima parte della routine, quella in cui hai
sbrogliato il problema del campo "note".
Non sarà facile e non so se, data l'età, mi capiterà ancora nella vita di imbattermi in un casino
del genere, ma fa sempre bene tenere in esercizio la mente.
Ora smettila di suggerirmi delle cose, sennò sarò costretto a ringraziarti ancora una volta, ed
ancora una volta, ed ancora una volta, ed ancora una volta........
Ciao

 ancora una volta........ Ciao
Troppo gentile, grazie.
 
Bruno

Bruno
Vorei farti una "faccina", ma non ne sono capace.
Adesso però non metterti a darmi anche queste informazioni.......
 
Grazissime e ciaoissimo.
Cura ut valeas, 
Gianni

Bruno
 
Scusa se mi rivolgo ancora a te, ma voglio darti una dritta sul problema in oggetto che hai
risoltobrillantemente.
Ora, dovendo fare il percorso inverso (esportare singolarmente un contatto dalla mia agenda a quella
dei contatti di outlook), ho trovato la seguente funzione che lavora egregiamente:
===========================
Function AddOlContact()
On Error GoTo Error_Handler
    Const olContactItem = 2
    Dim olApp As Object
    Dim Ctct As Object
    Set olApp = CreateObject("Outlook.Application")
    Set olContact = olApp.CreateItem(olContactItem)
    With olContact
        .FirstName = FirstName
        .LastName = LastName
        .BusinessAddress = BusinessAddress
        .BusinessTelephoneNumber = BusinessTelephoneNumber
        .HomeTelephoneNumber = HomeTelephoneNumber
        .MobileTelephoneNumber = MobileTelephoneNumber
        .PrimaryTelephoneNumber = PrimaryTelephoneNumber
        .OtherTelephoneNumber = OtherTelephoneNumber
        .BusinessFaxNumber = BusinessFaxNumber
        .BusinessAddress = BusinessAddress
        .BusinessAddressCity = BusinessAddressCity
        .BusinessAddressState = BusinessAddressState
        .BusinessAddressPostalCode = Str(Val(BusinessAddressPostalCode))
        .BusinessAddressCountry = BusinessAddressCountry
        .Email1Address = Email1Address
'        .WebPage = Text(Trim(WebPage))
'        .Body = Text(Body)
        'usa .Display se vuoi che l'utente veda il modulo pop-up dei Contatti di Outlook
        .display
        .Save
    End With
Error_Handler_Exit:
    On Error Resume Next
    Set olContact = Nothing
    Set olApp = Nothing
    Exit Function
Error_Handler:
    MsgBox "MS Access ha generato il seguente errore" & vbCrLf & vbCrLf & "Numero di Errore: " & _
    Err.Number & vbCrLf & "Sorgente dell'Errore: AddOlContact" & vbCrLf & "Descrizione dell'Errore:
" & Err.Description, vbCritical, "C'é stato un Errore!"
    Resume Error_Handler_Exit
End Function
=========================
Ok, come avrai notato le due ultime richieste di salvataggio riguardano due campi particolari:
.WebPage e .Body.
Quando tento di passare quei dati come campi di testo, ricevo il seguente msg di errore (é lo stesso
sia per un campo che per l'altro):
"Errore di compilazione, Sub o Funzione non definita"
e il prompt evidenzia nella routine VBA la funzione Text.
Sapresti dirmi il perché? E come potrei superare l'ostacolo?
Grazie, Gianni

 Grazie, Gianni
 
Perché non esiste una funzione Text in Access.
Prova semplicemente ad elinminarla:
.WebPage = WebPage
.Body = Body
 
Bruno


Veramente nel testo originale l'istruzione era come tu l'hai ripulita; siccome mi dava lo stesso
errore, ho pensato di aggiungere io quelle funzioni (sciagurate ?!)
Gianni

Gianni pretended :

Prova a modificare così:
'.WebPage = WebPage
.Body = "Aasdfghjk"
 
Se non funziona modifica ancora:
'.WebPage = WebPage
'.Body = Body
MsgBox Body
 
E dimmi quel che succede.
 
Bruno
 
Bruno

Bruno
Alora, ci sono riuscito. Ho inserito Body = "nkkkkknkn" come mi hai detto ed é andata.
Però mi sono accorto di un'altra cosa: i dati bisogna passarli in un ordine prestabilito, come se
ogni item del olContact avesse una sua precisa posizione all'interno dell'oggetto. Perciò se al
numero 1 passo il numero 1 mio, ok; se gli passo il numero 2 (e non vi é corrispondenza fra tipo di
campo e valore immesso), il sistema produce un errore.
Non so seono riuscito a spiegarmi, ma ad intuito ho capito come funziona e cosa ho fatto? Ho
riordinato le voci da trasferire secondo l'ordine di "ricezione" e tutto é filato liscio.
Ho notato solo un po' di ritardo nell'acquisizione e relativa visualizzazione del nuovo contatto su
Outlook.
Non finirò mai di ringraziarti,
Gianni

 ringraziarti, Gianni
 
Non ho proprio voglia di fare ora della prove... ma credo
che l'ordine non c'entri proprio niente.
Credo invece, perché mi è capitato varie volte, che riscrivere
una procedura o una sua parte riporti la medesima alla
regolarità di esecuzione.
 
Bruno