PDA

Vollständige Version anzeigen : Outlook Verweis nur setzten, wenn Outlook installiert?


ploeve
09.05.2004, 16:57
Hallo!

Betrifft u.A. die Beispieldatei von steffenjr
E-mail senden mit Outlook oder Outlook Express (http://www.ms-office-forum.net/forum/showthread.php?s=&threadid=119222)

Frage
wenn auf dem PC kein "Outlook" installiert ist, fehlt natürlich der Verweis!

Kann ich das irgendwie abfragen,.. falls Outlook installiert, Verweis setzten, ansonsten nicht??


Dank

reinir
09.05.2004, 17:26
am einfachsten wäre, Du prüfst mit dem FileSystemObject ob die Datei
'outlook.exe' existiert - ist aber sicher ein wenig tricky, da ja bei versch. Office-Versionen der Zielpfad unterschiedlich ist
hier Office XP : c:\programme\microsoft office\outlook.exe (wobei Office ja auch woanders inst. sein kann)

Dim FSO As New FileSystemObject

'Wenn Datei vorhanden dann prüfe:
If FSO.FileExists("PfadzuOutlookEXE") Then
' Verweis setzen
End If

Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

SWR
09.05.2004, 17:30
Nicht schön, aber selten. Auf die Schnelle irgendwie so,
hat aber den Nachteil, daß das versionsabhängig geschieht
(hier Outlook 9.0 = Outlook 2000) und der Installationspfad
C:\..... ist. Vielleicht aber ein Ansatz zum Weiterdenken...

Dim ref As Reference
Dim OUTLflag As Boolean

For Each ref In References

If ref.Name = "Outlook" Then
OUTLflag = True
End If

Next ref

If OUTLflag = False Then 'Outlokk-Verweis nicht vorhanden

On Error Resume Next
References.AddFromFile ("C:\Programme\Microsoft Office\Office\msoutl9.olb")

End If

ploeve
09.05.2004, 18:06
jo, gar net schlecht die 2 Ansätze!
Danke

werd mal probieren und überlegen.

Gibts nicht einen Registry-Eintrag, wenn Outlook installiert ist?
und den Pfad auch gleich?

Hilft mir das was?

Kann man aus der Reg sowas auslesen?


Dank!

Sascha Trowitzsch
09.05.2004, 23:55
Man braucht nicht in der Registry nachzusehen, sondern nur zu testen, ob sich ein Outlook-Objekt erzeugen lässt:

Function IsOLInstalled As Boolean
Dim OL As Object
On Error Resume Next
Set OL = CreateObject("Outlook.Application")
IsOLInstalled = (Not OL Is Nothing)
Set OL = Nothing
End Function

Ciao, Sascha

ploeve
10.05.2004, 07:10
Ahh, danke
geht das auch, wenn kein Verweis gesetzt ist?

Oder bringt er dann sowieso eine Fehlermeldung?

Lg Matthias

Sascha Trowitzsch
10.05.2004, 09:15
Wozu sollte man für den Code einen Verweis brauchen? (Außer den auf VBA ;) )
Das ist ja gerade der Witz dran, dass man damit ermitteln kann, ob ein Verweis nötig ist.

Vielleicht mal grundsätzlich:

Unter Visual Basic funktioniert fast alles über OLE-Objekte. Selbst einfachste Funktionen wie z.B. Left() sind in Klassen untergebracht.
(Left: VBA.Strings.Left() ; Strings ist eine Klasse, deren OLE-Objektvariable automatisch erzeugt wurde, eine sogenannte GlobalMultiUse-Klasse, die deshalb immer zur Verfügung steht.)

Jedes OLE-Objekt lässt sich aber mit CreateObject erzeugen, wenn man die ProgID kennt. (Im Beispiel oben: ProgID = "Outlook.Application".)
Man braucht im Grunde also bis auf VBA und Access keinen einzigen Verweis. Man kann die entsprechenden Funktionen alle auch verwenden, wenn man sie statt über Verweise, die lediglich ein Hilfsmittel darstellen, über ein mit CreateObject selbst erstelltes Objekt aufruft. Das Verfahren ist unter dem Stichwort late binding bekannt.

Speziell für die Automation von OLE-Servern wie Outlook, Word, Excel ist das auch ein gängiges Verfahren, wenn man sich nicht sicher sein kann, dass diese OLE-Server auf dem Zielsystem auch vorhanden sind.
Lange Rede, kurzer Sinn: Du kannst mit meiner Funktion abfragen, ob Outlook installiert ist und es anschließend komplett über die Objektvariable OL steuern. (Wobei diese Variable dann global zu deklarieren wäre.) Dann sparst du dir die Probleme mit den Verweisen.
Code mit late binding ist etwas langsamer als einer mit Verweisen (early binding), solange man aber nicht aufwändigen Automatisierungscode in Schleifen ausführt, wird man davon nichts bemerken.

Ciao, Sascha

schibalsky
06.12.2004, 12:49
Dim olns As Object ' Outlook Namespace

On Error Resume Next
Set OL = CreateObject("Outlook.Application")
Set olns = OL.GetNamespace("MAPI")


ohne gesetzten Verweis wird allerdings nicht der Namespace ausgelesen. Was mache ich falsch? Hatte das so verstanden, dass mit dieser Variante keine Verweise notwendig sind?

schibalsky
09.12.2004, 14:12
und nochmal nach oben in der Hoffnung auf Hilfe

SNowack
09.12.2004, 14:36
Hallo,

benutze Sascha's Function:

Function IsOLInstalled As Boolean
Dim OL As Object
On Error Resume Next
Set OL = CreateObject("Outlook.Application")
IsOLInstalled = (Not OL Is Nothing)
Set OL = Nothing
End Function


und dann geht's so weiter (LateBinding => Verweis nicht nötig):


Public Function EMailUeberOutlook(MailEmpfaenger As String, _
MailBetreff As String, _
MailAlsHtml As Boolean, _
MailText As Variant, _
MailBearbeiten As Boolean) As Boolean
On Error GoTo EMailUeberSendObject

Dim objOutlook As Object 'Outlook
Dim objOutlookElement As Object 'Outlookelement

DoCmd.SetWarnings False

If IsOLInstalled = True Then
Set objOutlook = CreateObject("Outlook.Application")

' 0=Mail
' 1=Termin
' 2=Kontakt
' 3=Aufgabe
' 4=Journaleintrag
' 5=Notiz
' 6=Diskussion
' 7=Verteilerliste
Set objOutlookElement = objOutlook.CreateItem(0)

objOutlookElement.To = MailEmpfaenger
objOutlookElement.Subject = MailBetreff

If MailAlsHtml = False Then
objOutlookElement.Body = MailText 'Text
ElseIf MailAlsHtml = True Then
objOutlookElement.HtmlBody = MailText 'HTML
End If

If MailBearbeiten = True Then
objOutlookElement.Display
ElseIf MailBearbeiten = False Then
objOutlookElement.Send
End If

Set objOutlookElement = Nothing
Set objOutlook = Nothing
EMailUeberOutlook = True
Else
DoCmd.SendObject acSendNoObject, , , MailEmpfaenger, , , MailBetreff, MailText, MailBearbeiten
EMailUeberOutlook = False
End If

EMailUeberOutlook_Exit:
DoCmd.SetWarnings True

Exit Function

EMailUeberSendObject:
DoCmd.SendObject acSendNoObject, , , MailEmpfaenger, , , MailBetreff, MailText, MailBearbeiten
Set objOutlookElement = Nothing
Set objOutlook = Nothing
EMailUeberOutlook = False
Resume EMailUeberOutlook_Exit

End Function


Gruss Stefan