Autovervollständigung in der Betreffzeile

Moderator: ModerationP

Re: Autovervollständigung in der Betreffzeile

Beitragvon OigenB » 21. Aug 2019, 13:56

Hallo Zusammen,

mmarkus hat geschrieben:Nein, die Logik passt nicht.
So würde der code doch nie greifen.

Da hast du Recht. Habe es ausgebessert und ausprobiert. Tatsächlich hat es einmal funktioniert. :D Also wird die Prozedur objMail_PropertyChange durchgeführt.
Leider war das einmalig und ich konnte es nicht mehr zum laufen bringen.

Da ich den Code nicht zu 100% selber geschrieben habe sondern auch Schnipsel aus verschiedenen Quellen eingesetzt habe, verstehe ich den Code noch nicht vollständig.
Zum Beispiel bin ich mir nicht sicher ob ich
Code: Alles auswählen
Set objMail = Outlook.ActiveInspector.CurrentItem
wirklich brauche.
Oder auch was der Unterschied zwischen dem ActiveInspector und dem "normalen" Inspector ist.
OigenB
 

Re: Autovervollständigung in der Betreffzeile

Beitragvon mmarkus » 21. Aug 2019, 14:17

Wenn der Code nur einmal ausgeführt wird, dann wohl deshalb weil objInspectors durch das Testen ihren Wert verloren hat.

Code: Alles auswählen
Private Sub objMail_PropertyChange(ByVal Name As String)
    Dim Text As String
    Dim n As Long
    Dim Kurz(1) As String
    Dim Lang(1) As String
   
    Kurz(0) = "P3"
    Kurz(1) = "P4"
   
    Lang(0) = "Projekt-G30_"
    Lang(1) = "Projekt-G40_"
   
    If Name = "Subject" Then
        Text = objMail.Subject
        For n = 0 To 1
           
            If InStr(1, Text, Kurz(n), vbTextCompare) Then
                objMail.Subject = Replace(Text, Kurz(n), Lang(n), , , vbTextCompare)
                Exit Sub
            End If
        Next n
    End If
End Sub


So sollte es mal logisch korrekt sein.
Die Prüfung auf Groß- und Kleinschreibung kann man durch den Zusatz vbTextCompare ermöglichen.
Varianten wären natürlich noch einige möglich.
Man könnte die Variablen Kurz und Lang auch auf Modulebene deklarieren und im Application_Startup Event einmalig initalisieren.
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1575
Registriert: 16. Apr 2012, 16:07
Wohnort: Oberösterreich

Re: Autovervollständigung in der Betreffzeile

Beitragvon OigenB » 22. Aug 2019, 09:42

Hallo mmarkus

mmarkus hat geschrieben:Wenn der Code nur einmal ausgeführt wird, dann wohl deshalb weil objInspectors durch das Testen ihren Wert verloren hat.

Wie kann man das umgehen.

Code: Alles auswählen
 If InStr(1, Text, Kurz(n), vbTextCompare) Then

https://docs.microsoft.com/de-de/office/vba/language/reference/user-interface-help/instr-function hat geschrieben:Gibt eine Variante (Lang) zurück, die die Position des ersten Auftretens einer Zeichenfolge innerhalb einer anderen angibt.

Funktioniert das dann mit der If Funktion?

mmarkus hat geschrieben:Die Prüfung auf Groß- und Kleinschreibung kann man durch den Zusatz vbTextCompare ermöglichen.

Das ist nützlich.
OigenB
 

Re: Autovervollständigung in der Betreffzeile

Beitragvon mmarkus » 23. Aug 2019, 10:03

OigenB hat geschrieben:
Code: Alles auswählen
 If InStr(1, Text, Kurz(n), vbTextCompare) Then

https://docs.microsoft.com/de-de/office/vba/language/reference/user-interface-help/instr-function hat geschrieben:Gibt eine Variante (Lang) zurück, die die Position des ersten Auftretens einer Zeichenfolge innerhalb einer anderen angibt.

Funktioniert das dann mit der If Funktion?


Hast du es getestet?

Im Prinzip erfordert If einen Boolean Wert.
Der Long Wert wird also zuerst in Boolean umgewandelt.

Im Direktbereich der Entwicklungsumgebung kannst du das also ganz einfach testen.

?CBool(3) oder ?CBool(0) oder ?CBool(-2)
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1575
Registriert: 16. Apr 2012, 16:07
Wohnort: Oberösterreich

Re: Autovervollständigung in der Betreffzeile

Beitragvon OigenB » 26. Aug 2019, 13:54

Danke an alle die dabei geholfen haben! hier der funktionierende Code für alle:
Der folgende Code muss in "ThisOutlookSession" eingesetzt werden.
Code: Alles auswählen
Option Explicit

Dim myAppointmentTrapper As clsAppointmentItemTrapper
Dim myMailItemTrapper As clsMailItemTrapper

Private Sub Application_Startup()
Set myMailItemTrapper = New clsMailItemTrapper
Set myAppointmentTrapper = New clsAppointmentItemTrapper
End Sub
Private Sub Application_Quit()
Set myMailItemTrapper = Nothing
Set myAppointmentTrapper = Nothing
End Sub



Hier muss ein neues Klassenmodul mit dem Namen "clsMailItemTrapper" erstellt werden:
Code: Alles auswählen
Option Explicit

Dim WithEvents objInspectors As Outlook.Inspectors
Dim WithEvents objOpenInspector As Outlook.Inspector
Dim WithEvents objMailItem As Outlook.MailItem

Private Sub Class_Initialize()
Set objInspectors = Application.Inspectors

End Sub

Private Sub Class_Terminate()
Set objOpenInspector = Nothing
Set objInspectors = Nothing
Set objMailItem = Nothing
End Sub

Private Sub objInspectors_NewInspector(ByVal Inspector As Inspector)
If Inspector.CurrentItem.Class = olMail Then
Set objMailItem = Inspector.CurrentItem
Set objOpenInspector = Inspector
End If
End Sub

Private Sub objOpenInspector_Close()
'MsgBox "Inspector is closing..."
Set objMailItem = Nothing
End Sub

Private Sub objMailItem_PropertyChange(ByVal Name As String)

Dim Text As String
Dim n As Integer
Dim Kurz(1) As String
Dim Lang(1) As String

Set objMailItem = Outlook.ActiveInspector.CurrentItem

Kurz(0) = "P3"
Kurz(1) = "p3"

Lang(0) = "Projekt-3"
Lang(1) = "Projekt-3"
   
If Name = "Subject" Then
    If objMailItem.subject <> "" Then
        Text = objMailItem.subject
        For n = 0 To 1
            If InStr(1, Text, Kurz(n), vbTextCompare) Then
                Text = Replace(Text, Kurz(n), Lang(n))
            End If
            Next n
            If Text <> "" Then
                objMailItem.subject = Text
                Else
            End If
    End If
End If
End Sub


Hier muss ein neues Klassenmodul mit dem Namen "clsAppointmentItemTrapper" erstellt werden:
Code: Alles auswählen
Option Explicit

Dim WithEvents objInspectors As Outlook.Inspectors
Dim WithEvents objOpenInspector As Outlook.Inspector
Dim WithEvents objAppointmentItem As Outlook.AppointmentItem

Private Sub Class_Initialize()
Set objInspectors = Application.Inspectors

End Sub

Private Sub Class_Terminate()
Set objOpenInspector = Nothing
Set objInspectors = Nothing
Set objAppointmentItem = Nothing
End Sub

Private Sub objInspectors_NewInspector(ByVal Inspector As Inspector)
If Inspector.CurrentItem.Class = olAppointment Then
Set objAppointmentItem = Inspector.CurrentItem
Set objOpenInspector = Inspector
End If
End Sub

Private Sub objOpenInspector_Close()
'MsgBox "Inspector is closing..."
Set objAppointmentItem = Nothing
End Sub

Private Sub objAppointmentItem_PropertyChange(ByVal Name As String)

Dim Text As String
Dim n As Integer
Dim Kurz(1) As String
Dim Lang(1) As String

'Set objAppointmentItem = Outlook.ActiveInspector.CurrentItem

Kurz(0) = "P3"
Kurz(1) = "p3"

Lang(0) = "Projekt-G30_G31-LCI_"
Lang(1) = "Projekt-G30_G31-LCI_"
   
If Name = "Subject" Then
    If objAppointmentItem.subject <> "" Then
        Text = objAppointmentItem.subject
        For n = 0 To 1
            If InStr(1, Text, Kurz(n), vbTextCompare) Then
                Text = Replace(Text, Kurz(n), Lang(n))
            End If
            Next n
            If Text <> "" Then
                objAppointmentItem.subject = Text
                Else               
            End If
    End If
End If
End Sub

:D
OigenB
 

Re: Autovervollständigung in der Betreffzeile

Beitragvon mmarkus » 26. Aug 2019, 15:27

@OigenB,
ist dir aufgefallen, dass die Codes praktisch gleich sind.

Sprich 95% des Codes ist überflüssig.
Warum nicht zusammenlegen?
Denk mal nach, wie die Umsetzung mit einer Klasse möglich wäre.

Außerdem - dass mit der Groß- und Kleinschreibung scheint noch nicht angekommen zu sein.
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1575
Registriert: 16. Apr 2012, 16:07
Wohnort: Oberösterreich

Re: Autovervollständigung in der Betreffzeile

Beitragvon DerHoepp » 27. Aug 2019, 08:14

Moin,

zusätzlich halte ich es für gefährlich, innerhalb eines Eventhandlers zu einer Objektvariablen (objMailItem) die Objektvariable auf ein (möglicherweise) anderes Objekt zeigen zu lassen. Also raus mit:
Code: Alles auswählen
Set objMailItem = Outlook.ActiveInspector.CurrentItem

Du willst ja mit dem Mail-Item-Objekt arbeiten, dass das Event ausgelöst hat. Meiner Ansicht nach ist das Prüfen der Variable Text auf einen Leerstring zudem unnötig. Für Schleifen über Arrays würde ich mit LBound und UBound arbeiten, statt mit festen Grenzen.

Syntaktisch könntest du an deinen Einrückungen arbeiten. Ich würde darüberhinaus als Kürzel immer ein Sonderzeichen mit einbauen, damit nicht auch "normale" Texte geändert werden. Gerade, wenn es später viele Kürzel geben soll wird dir irgendwann auffallen, dass du in Ersetzungen neu ersetzt. Für eine ordentliche Erweiterbarkeit würde ich die Ersetzungsarrays auch aus einer externen Datenquelle einlesen und nicht hardcodieren.

Viele Grüße jedenfalls!
derHöpp

PS: Wenn du viele Kürzel einsetzt, wäre es meiner Meinung nach sinnvoller nicht über alle Array-Elemente zu schleifen, sondern über alle Kürzel im Text und dafür (mit einem Dictionary oder gefilterten Array, oder sonstwie) die konkrete Ersetzung rauszusuchen. Das wird vielleicht besonders interessant, wenn du Platzhalter im Body verwenden willst.
DerHoepp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8218
Registriert: 14. Mai 2013, 11:08

Re: Autovervollständigung in der Betreffzeile

Beitragvon mmarkus » 27. Aug 2019, 09:29

DerHoepp hat geschrieben:Moin,

zusätzlich halte ich es für gefährlich, innerhalb eines Eventhandlers zu einer Objektvariablen (objMailItem) die Objektvariable auf ein (möglicherweise) anderes Objekt zeigen zu lassen. Also raus mit:
Code: Alles auswählen
Set objMailItem = Outlook.ActiveInspector.CurrentItem



Wie soll es möglicherweise ein anderes Objekt sein?
Der Objekttyp wird ja zuvor geprüft.
Das ganze Konzept basiert doch darauf, dass für das Mailitem ein Eventhandler initialisiert wird.
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1575
Registriert: 16. Apr 2012, 16:07
Wohnort: Oberösterreich

Re: Autovervollständigung in der Betreffzeile

Beitragvon DerHoepp » 27. Aug 2019, 09:37

Moin,

mmarkus hat geschrieben:Das ganze Konzept basiert doch darauf, dass für das Mailitem ein Eventhandler initialisiert wird

Ja, aber doch nicht im Eventhandler des "Me/Self" (MailItem)Objekts selbst, sondern im Eventhandler des New-Events der Inspectors-Auflistung.

Wie soll es möglicherweise ein anderes Objekt sein?

Mein rein angelesenes Verständnis des Objektmodells von Outlook ist da sicher nicht belastbar, aber ist es nicht möglich, den Inspektor zu wechseln? Und ist sichergestellt, dass das CurrentItem tatsächlich das gleiche ist, das auch das Event ausgelöst hat? Falls ja, ist die Zeile zwar unnötig aber ungefährlich. Falls nein wird ein anderes Objekt verändert, als beabsichtigt. Ist das nicht vom Typ MailItem, knallt es spätestens da.

Viele Grüße
derHöpp
DerHoepp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8218
Registriert: 14. Mai 2013, 11:08

Re: Autovervollständigung in der Betreffzeile

Beitragvon mmarkus » 27. Aug 2019, 09:53

DerHoepp hat geschrieben:Ja, aber doch nicht im Eventhandler des "Me/Self" (MailItem)Objekts selbst, sondern im Eventhandler des New-Events der Inspectors-Auflistung.

Und ist sichergestellt, dass das CurrentItem tatsächlich das gleiche ist, das auch das Event ausgelöst hat?


Ups, das habe ich übersehen, dass es im PropertyChange Event noch drinnen ist.
Ja so ist es eben. Es wird alles was man so findet kopiert. Mitdenken mangels Kenntnissen nicht möglich. Aber du passt ja wenigsten auf. :D

Aber Fehler könnte es keinen Verursachen, da das Event ja nur im Aktive Mail ausgelöst werden kann, somit die Referenz nur auf dasselbe Objekt gesetzt wird.
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1575
Registriert: 16. Apr 2012, 16:07
Wohnort: Oberösterreich

Re: Autovervollständigung in der Betreffzeile

Beitragvon OigenB » 02. Sep 2019, 14:25

Servus,
mmarkus hat geschrieben:@OigenB,
ist dir aufgefallen, dass die Codes praktisch gleich sind.

Sprich 95% des Codes ist überflüssig.
Warum nicht zusammenlegen?
Denk mal nach, wie die Umsetzung mit einer Klasse möglich wäre.

Leider fehlt mir da das Wissen/die Übung um sicherzugehen, dass das dann funktioniert. Ein Schubser in die richtige Richtung wäre hilfreich damit ich mich weiter einlesen kann.

mmarkus hat geschrieben:Außerdem - dass mit der Groß- und Kleinschreibung scheint noch nicht angekommen zu sein.

hab ich ausprobiert und funktioniert leider so nicht.

Code: Alles auswählen
Set objMailItem = Outlook.ActiveInspector.CurrentItem

Hab ich in einer früheren Version gebraucht, aber ihr habt Recht. Inzwischen ist es überflüssig.

mmarkus hat geschrieben:Man könnte die Variablen Kurz und Lang auch auf Modulebene deklarieren und im Application_Startup Event einmalig initalisieren.
Ich würde gerne darauf zurückkommen. Eine Erweiterung vom Code der für mich Sinn ergeben würde, ist dass man die Variablen wie schon erwähnt auf Modulebene deklariert. Die Variablen würde ich dann mittels UserForm (das per Knopfdruck in der Menüleiste ausgelöst wird) ausfüllen lassen. Gut/Schlecht?
OigenB
 

Vorherige

Zurück zu Outlook Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

cron