PDA

Vollständige Version anzeigen : outlook ordner auslesen


bodo40
23.09.2003, 15:02
hallo foromolaner

wie ich sehe ist doch schon eine menge über oulook und access gepostet worden. aber ich habe bei den wenigen stichproben immer den tatbestand des Kalenderauslesens etz.pp verfollgen können.

hier meine Frage mit Umstandserklärung:

es gibt ein formular in outlook das auch viele viele benutzerdefinierte felder hat.
da es nicht möglich scheint, einfach den outlook ordner zu referenzieren (da fehlen alle benutzerdefinierten felder) würde ich gerne eine möglichkeit finden trotzdem an die daten zu kommen die ein formular wiederspiegelt.
Das formular ist ein manuel erweitertes Kontak-Formular.
Und ich hätte gerne jeden Kontakt als Datensatz.
es gibt einen öffentlichen Ordner der die Daten hällt und ein bereitstellungsformular für diesen ordner.

kann eine oder einer von euch damit was anfangen


danke
bodo40

grisuph
23.09.2003, 15:12
Hi,

Wahrscheinlich hast du schon erklärt, dass das nicht funktioniert, aber vielleicht auch nicht...

Schonmal versucht einfach die Kontakte als Tabelle in Access einzubinden? Dann einfach ein Formular dazu und ne Suche und du hast deine Datensätze schon in Access...deine eigenen Felder sollten doch auch in den Datensätzen gespeichert sein....

Vielleicht hilfts ja doch...

Viele Grüße
Peter

bodo40
23.09.2003, 16:07
hi

ich hab da was gefunden

Set myOlApp = CreateObject("Outlook.Application")
Set myNameSpace = myOlApp.GetNameSpace("MAPI ")
Set myFolder = _
myNameSpace.GetDefaultFolder(olFolderContacts)
Set myNewFolder = myFolder.Folders("Old Contacts")

das steht in der hilfe und bedarf des Verweises <extras><verweise><Microsofft Outlook10...>

olFolderContacts
hier kann ich doch bestimmt auch einen anderen ordner angeben

wie muss das heissen wenn mein folder hier liegt
C:/Outlooktestumgebung/testFolder

danke
bodo40

bodo40
23.09.2003, 16:13
hi grisuph ( das ist doch so ein kleiner grüner feuer Spuckender drache)

tut mir leit wenn ich nicht sagen kann was ich meine.

ich brauche alle datenfelder des Outlook-formulars und die Importvarriante bringt mich nicht ans ziel

danke trotzdem

bodo40

Thomas_Engel
23.09.2003, 18:45
Hi Bodo40

ich habe da mal sowas in Excel gemacht. Eigentlich müsstest Du den Code, zumindest über grosse Strecken, auch in Access verwenden können. Der Code bewirkt, dass Kontakte aus Outlook zuerst in einer ComboBox aufgelistet werden. Bei Klick auf einen Kontakt, wird dieser in definierte Zellen eingefügt. Probiers halt mal.

Grüsse
Thomas

bodo40
23.09.2003, 23:15
hi thomas
danke schön, ich werde mir das mal ansehen und beobachten was geschied.
sag mal, hast du in deine outlook kontakte reingegriffen (also ich meine die standart-kontakt-formulare) oder war der outlook Folder vom Typ Kontakt und du hast auf den outlook standart Folder zugegriffen. hattest du auch benutzerdefinierte Felder in deinem outlook formular? bist du an deren Inhalte rangekommen.

bis bald
bodo40

ach so, was ich bislang ermitteln konnte

mit der outlook10 objektlib kann man ja auf die outlook-Folders drauf zugreifen

mit
myNameSpace.Folders(i).Folders(j).Folders(k).Folders("testOutlookOrdner")
hätte man ja schon mal kontakt zu einem gewünschten ordner aufgenommen.

bevor ich wieder lange suche...

wer verrät mir wie ich an die benutzerdefinierten felder rankomme, oder alle felder des formulars auslesen kann mit dem der Ordner zur verfügung gestellt wird?

gute nacht
bodo40

Thomas_Engel
24.09.2003, 07:21
Morgen Bodo40,

sag mal, hast du in deine outlook kontakte reingegriffen (also ich meine die standart-kontakt-formulare) oder war der outlook Folder vom Typ Kontakt und du hast auf den outlook standart Folder zugegriffen. hattest du auch benutzerdefinierte Felder in deinem outlook formular? bist du an deren Inhalte rangekommen.

Nein, ich habe nur mit Standard-Objekten gearbeitet. Für benutzerdefinierte Objekte müsste der Code natürlich entsprechend umgeschrieben werden. In der Hilfe des VB-Editors von Outlook findest Du sehr weitreichende Ausführungen und auch Beispiele dazu.
Wie Du Deine eigenen Objekte benannt hast, weisst Du ja selbst am Besten.

Viel Spass beim Tüfteln

Grüsse
Thomas

bodo40
24.09.2003, 12:45
hi

ich kann jetzt auf irgendetwas zugreifen, hiermit

Sub testOutlook()
Set myOlApp = CreateObject("Outlook.Application")
Set myNameSpace = myOlApp.GetNamespace("MAPI")

Set myFolder = myNameSpace.Folders(2).Folders(2).Folders(3)
Set myNewFolder = myFolder.Folders("save ZP liefert an Kunden")
Debug.Print myNewFolder.Items.Count
For i = 1 To 2
Debug.Print myNewFolder.Items(i).UserProperties.Count
For k = 1 To 20
Debug.Print myNewFolder.Items(i).UserProperties(k).Name & ": " & _
myNewFolder.Items(i).UserProperties(k).Type & ": " & _
myNewFolder.Items(i).UserProperties(k).Value & ".........." & k
Next k
i = i + 1
Next i

End Sub

die rote zeile spuckt mir zahlen aus. wie bekomme ich raus welche zahl welchem Type entspricht?

danke
bodo40

Thomas_Engel
24.09.2003, 14:01
So stehts in der Hilfe von Outlook2000:

Die folgenden OlUserPropertyType-Konstanten sind möglich: olCombination(19), olCurrency(14), olDateTime(5), olDuration(7), olFormula(18), olKeywords(11), olNumber(3), olPercent(12), olText(1) oder olYesNo(6).

bodo40
24.09.2003, 14:36
hi

ich habe die if schleife noch etwas verändert und manchmal bleibt sie stehen. die meldung ist dann: Laufzeitfehler13 TYP unverträglich
was kann ich denn mal dagegen tun?

For i = 1000 To 1001
Debug.Print myNewFolder.Items(i).UserProperties.Count
For K = 1 To 306 Step 2
Debug.Print myNewFolder.Items(i).UserProperties(K).Value & "; " & K & " ~ " & _
myNewFolder.Items(i).UserProperties(K + 1).Value & "; " & K + 1
Next K
i = i + 1
Next i

bodo40

Thomas_Engel
24.09.2003, 14:55
ich sehe jetzt nicht gerade, wo der Fehler passiert. Anyway, der Fehler 13 ist ja klassisch. Userproperties.value ist vom Typ Variant. Wenn Du das z.B. versuchst, einer Integer-Variablen zuzuweisen, dann gibts eben Probleme.

Ausserdem scheint mir das hier ein wenig suspekt zu sein:

For i = 1000 To 1001
...
...
...
i = i + 1
Next i

Wozu soll denn das "i=i+1" gut sein? "Next i" erhöht den Zähler ja bereits. Wenn also der Zähler i=1000 ist und Du machst "i=i+1" dann ist i=1001. "Next i" bewirkt dann i=1002

weiss halt nicht?

Grüsse
Thomas

Thomas_Engel
24.09.2003, 16:17
und da fiels mir doch gleich wieder ein:
Ich hatte damals, als das Teil mit Excel baute auch ständig den Fehler 13. Das lag daran, dass sich im Kontakteordner auch Verteilerlisten befanden. Diese sind nun mal ein anderer Typ. Das habe ich damals aufgefangen mit "On Error Resume Next". Dies führt in meinem Beispiel zu leeren Einträgen im Array. Bei der Übergabe an die ComboBox werden diese jedoch ignoriert.
Problem gelöst!

bodo40
24.09.2003, 16:21
ups

zur "i" schleife bin ich noch gar nicht gekommen. das ist na klar quatsch mit dem
i = i +1

so fehler 13 ist also klassisch .

und wie geht man damit klassischer weise um?

ich habe mal eine varriable as variant deklariert und dann nur die Userproperties.value zugewiesen bei denne probleme auftraten.

Dim Var as Variant
For i = 50 To 51
Debug.Print myNewFolder.Items(i).UserProperties.Count
For K = 178 To 180
Var = myNewFolder.Items(i).UserProperties(K).Value
Debug.Print Var
Next K
Next i

das rote geht auch nicht

was steht da blos drinn? wie krigt man es raus?

thomas sag doch was ;)

ich konnte den type 11 und 0 feststellen.

bodo40

Thomas_Engel
24.09.2003, 16:23
guckst Du oben, ich war 4 Minuten schneller :-)

bodo40
25.09.2003, 10:57
hi
ich weis nicht ob ich den thread hier weiter führen soll, weil ich nun ja die betreffsfrage bereits erklärt bekommen habe. nun geht es weiter mit optimierung!

mit diesem code greife ich auf die daten zu, die die leute in outlook gepflegt haben.

Option Compare Database
Dim myOlApp As Object
Dim myNameSpace As Object
Dim myFolder As Object
Dim Var As Variant
Dim Timer1 As Date
Dim Timer2 As Date
Dim Dauer As Date
Dim iCount As Long
Dim kCount As Long
Dim lCount As Long



Sub testOutlookAndererRechner()
Timer1 = Now
Set myOlApp = CreateObject("Outlook.Application")
Set myNameSpace = myOlApp.GetNamespace("MAPI")
Set myFolder = myNameSpace.Folders("Öffentliche Ordner").Folders(2).Folders(3).Folders(1)
Set myNewFolder = myFolder.Folders("FolderName")

iCount = myNewFolder.Items.Count - 2069
kCount = myNewFolder.Items(1).UserProperties.Count
lCount = 3
ReDim myArray(iCount, kCount, lCount)
For i = 1 To iCount
Debug.Print Now - Timer1 & "..." & i
For k = 1 To kCount
On Error Resume Next

For l = 1 To 1
myArray(i, k, l) = myNewFolder.Items(i).UserProperties(k).Name
myArray(i, k, l + 1) = myNewFolder.Items(i).UserProperties(k).Value
myArray(i, k, l + 2) = i & " ./. " & k

Next l
Next k
Next i
Timer2 = Now
Dauer = Timer2 - Timer1
Debug.Print Dauer


Call OutlookAnExelMeinRechner(myArray, iCount, kCount, lCount)
End Sub

das dumme ist nur, dass das auslesen schneckt. das ist nicht gut. kennt einer oder eine eine bessere rangehensweise, als jeden value einzeln in einer schleife abzufragen, in ein array zu schreiben und das ganze noch über das netzwerk. (über das netzwerk ist nicht zu ändern)

danke
bodo40