Excel/Outlook: Schlüsselwort aus einer Excel-Tabelle im Zwischenspeicher abfragen

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Jakobus
Posts: 56
Joined: 01 Jul 2019, 13:26

Excel/Outlook: Schlüsselwort aus einer Excel-Tabelle im Zwischenspeicher abfragen

29 Apr 2022, 11:10

An die Freunde von Autohotkey,

Excel/Outlook:
Autohotkey fügt aus dem Zwischenspeicher (STG + V) eine Tabelle aus Excel
mit einem gespeicherten Textbaustein aus Outlook
als Antwort in eine offene E-mail zusammen.

Im Anschluss steht die Excel-Tabelle (5-100 Zeilen und 12 Spalten) mitten im HTML formatierten Text.
Das klappt recht gut.

Der Textbaustein wird durch das langsame Tippen der ersten 4 Zeichen plus {NumpadEnter} eingefügt.
Die 4 Zeichen können wahlweise sein
++ 0 {NumpadEnter}
++ 1 {NumpadEnter}
++ 2 {NumpadEnter}
++ 3 {NumpadEnter}

Der Anfang des Tagesdatums für Ferienbeginn bestimmt die Zahl und wird im Textbaustein manuell angepasst.

Daraus wurde...

Code: Select all

~^Numpad0::

#IfWinActive, ahk_class rctrl_renwnd32 ; AHK-Code nur in Outlook ausführen/ahk_class zu finden über Window Spy 
SendInput {NumpadAdd}
Sleep 600
SendInput {NumpadAdd}
Sleep 600
SendInput {Space}
Sleep 600

; Hier die Zahl 0/1/2/3 entsprechend anpassen

; SendInput 0
; SendInput 1
SendInput 2
; SendInput 3

Sleep 600
SendInput {NumpadEnter}

; ------------------------------------------------------------------------------------------------
; [A] Bewege nun den Cursor an die richtige Stelle für die Excel-Tabelle / Excel mit (Auto)
; ------------------------------------------------------------------------------------------------
SendInput {Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Down}



; ------------------------------------------------------------------------------------------------
; [B] Einbau für die Idee mit Abfrage nach (Auto) im Zwischenspeicher 
; Hier passe ich SendInput mit dem Löschen der Zeilen noch an - wenn (Auto)-Auswertung klappt
; ------------------------------------------------------------------------------------------------
; Bewege nun den Cursor an die richtige Stelle für die Excel-Tabelle / Excel ohne (Auto) und lösche die 4 Zeilen
SendInput {Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Delete}{Delete}{Delete}{Delete}{Down}



; ------------------------------------------------------------------------------------------------
; [C] Kopiere die Tabelle formatiert ins Outlook-Fenster und lösche (mit !hy5) das Datum #01.01.2021#
; ------------------------------------------------------------------------------------------------
SendInput ^v {up} {up} !hy4!hy5
SendInput {Up}
; ------------------------------------------------------------------------------------------------
; Jetzt das VBA Script ausführen: "FindeNamen" im Anschreiben mittels ALT+H+Y6
; ------------------------------------------------------------------------------------------------
SendInput {Alt down}
Sleep 200
SendInput HY9{Alt up}
; ------------------------------------------------------------------------------------------------

return
#IfWinActive
Soweit so gut. Ohne den Block [ B ] hat sich der Code bisher sehr gut bewährt.

Problem:

Im Textbaustein steht ein Absatz über der Tabelle geschrieben,
der nur dort stehen darf, wenn mindestens irgendwo in einer Zelle von der Exceltabelle der Inhalt (Auto) zu finden ist.
Beispiele für Zellen-Einträge: "Hans-Franz (Auto)" und/oder "Frau Müller (Auto)"

D.h. ohne (Auto) braucht es diesen Absatz nicht.

Mein Wunsch wäre es als erstes den Inhalt der Tabelle auswerten.
Wenn (Auto) vorhanden, dann nimm folgenden Code [ A ] - mit dem unveränderten Textbaustein für (Auto) - und springe nach [ C ]
Wenn (Auto) nicht vorhanden, dann nimm anderen Code [ B ] - lösche den entsprechende Absatz (4 Zeilen) - und springe nach [ C ]

Frage:

Weiß jemand, wie man aus dem Zwischenspeicher (Auto) mit Klammern auswertet und
das Ergebnis entsprechend umsetzt nach dem Muster If(Excel=*(Auto);[ A ];[ B ])?

Besten Dank für Eure Unterstützung
Last edited by Jakobus on 25 Aug 2022, 11:07, edited 1 time in total.
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Excel/Outlook: If(True;[A];[B]) mit Auswertung einer Excel-Tabelle im Zwischenspeicher

29 Apr 2022, 14:09

Ohne ins Detail zu gehen, scheint mir dein Aussage: "If(Excel=*(Auto);[ A ];[ B ])?" in AHK etwa so auszusehen:
InStr(Excel," (Auto)") ? funcA() : funcB(). Stichwort 'ternary operator'. HTH
User avatar
flyingDman
Posts: 2848
Joined: 29 Sep 2013, 19:01

Re: Excel/Outlook: If(True;[A];[B]) mit Auswertung einer Excel-Tabelle im Zwischenspeicher

29 Apr 2022, 14:23

Ihr Skript enthält zahlreiche simulierte Tastenanschläge, die das Skript weniger zuverlässig machen. Sowohl Excel als auch Outlook können von AHK (mit Hilfe von COM) verwaltet werden und daher können Sie simulierte Tastenanschläge vermeiden und das Skript zuverlässiger machen. Ich habe gerade ein Skript veröffentlicht, das das Einfügen von Excel-Daten in eine neue Outlook-E-Mail ermöglicht. Siehe hier: viewtopic.php?f=6&t=103410. Es sollte relativ einfach sein, die Begrüßung (grtng) oder die Einleitung (intro) je nach Inhalt der Tabelle zu ändern.
14.3 & 1.3.7
Jakobus
Posts: 56
Joined: 01 Jul 2019, 13:26

Re: Excel/Outlook: If(True;[A];[B]) mit Auswertung einer Excel-Tabelle im Zwischenspeicher

25 Aug 2022, 10:48

Hallo @Bobo,

Danke für Deinen Hinweis.

Im Moment, wo die Tabelle gespeichert wird,
wird der Variable VAR folgender Wert übergeben.

Code: Select all

Var := InStr(clipboard," (Auto)") ? 1 : 0   ;0 Auto wurde nicht gefunden und 1 Auto wurde gefunden
Am Ende des Scripts frage ich den Wert noch einmal ab und
stoße über einen Shortcut Alt+H+Y9 ein VBA Macro in Outlook an,
welches die gewünschte Textpassage löscht.

Code: Select all

Sleep 2000 ; warte 2 Sekunde bis der obere Code vollständig abgelaufen ist.
; Überprüfe, ob Var den Wert 0 hat. 0 = der Text (Auto) wurde nicht in der Tabelle gefunden.
If Var in 0
{
; Alt+H+Y9 startet das VBA-Macro aus der Menu-Leiste in Outlook > Modules > PreWarningTextlöschen
SendInput !hy9 
}
; MsgBox, 0 Auto wurde nicht gefunden und 1 Auto wurde gefunden.`n`nDie Variable ist %Var%
Var := "" ; lösche wieder den Wert der Variable Var
@flyingDman

Dein Ansatz ist eindeutig der bessere!
Hatte mich 2 Nachmittage damit beschäftigt.
Für den Umbau bräuchte ich mehr Zeit, die mir zur Zeit fehlt.
Möglicherweise ergibt sich dazu später eine Gelegenheit und ich komme auf Dich bei Fragen wieder zurück.

Verspäteten Dank für Deine geniale Lösung und Bobos Anstoß.
Jakobus
Posts: 56
Joined: 01 Jul 2019, 13:26

Re: Excel/Outlook: If(True;[A];[B]) mit Auswertung einer Excel-Tabelle im Zwischenspeicher

25 Aug 2022, 10:55

Nachtrag: Hier der vollständige Code

Code: Select all

; Outlook: STRG + 0
; Drücke STRG + 0 (auf Ziffernblocktaste) und setze in Outlooks den Text "++ 1" ab und führe VBA-Macro "FindeNamen" aus.
; Am Ende lösche bei Bedarf den Text für AUTO über das VBA-Macro in Outlook > Modules > PreWarningTextlöschen.
; Die Idee: Die Variable Var setzen mittels AUTO aus der Tabelle und erst zum ganz Schluss den Wert von VAR abfragen
; und dann den AUTO Text löschen.
; ------------------------------------------------------------------------------------------------
; Texbaustein für "++ 1" bzw. "++ 2" mit Tastenanschlagszeiten mittels Sleep
; ------------------------------------------------------------------------------------------------

~^Numpad0::

#IfWinActive, ahk_class rctrl_renwnd32	; ahk_class zu finden über Window Spy
SendInput {NumpadAdd}
Sleep 600
SendInput {NumpadAdd}
Sleep 600
SendInput {Space}
Sleep 600

; Hier die Zahl 0/1/2/3 entsprechend anpassen

; SendInput 0
SendInput 1
; SendInput 2
; SendInput 3

Sleep 600
SendInput {NumpadEnter}
; ------------------------------------------------------------------------------------------------
; Bewege den Cursor an die richtige Stelle für die Excel-Tabelle
; ------------------------------------------------------------------------------------------------
SendInput {Up 18}
; ------------------------------------------------------------------------------------------------
; Füge die Tabelle aus Japan.xls in OUtlook hinein
; ------------------------------------------------------------------------------------------------
SendInput ^v
; ------------------------------------------------------------------------------------------------
; Suche in der Tabelle aus Excel nach dem Schlüsselwort (Auto) und
; schreibe nein/ja in die Variable mit 1/0. Am unteren Ende des Codes wird der
; Variablenwert abgerufen und bei 0 das VBA Macro "AUTO" über ALT+HY9 ausgeführt
; ------------------------------------------------------------------------------------------------
Var := InStr(clipboard," (Auto)") ? 1 : 0   ;0 AUTO wurde nicht gefunden und 1 AUTO wurde gefunden
; ------------------------------------------------------------------------------------------------
; Lösche (mit !hy3) das Datum #01.01.2022#
; und formatiert mit passender Spaltenbreite die Tabelle ins Outlook-Fenster !hy4
; ------------------------------------------------------------------------------------------------
SendInput {up} {up} !hy3!hy4    ; Achtung: Durch die Add-in/Add-Ons ändert sich die Buchstabenfolge
SendInput {Up}
SendInput {Alt down}
Sleep 200
; --------------------------------------------------------------------------------
; Jetzt das VBA Script ausführen: "FindeNamen" mittels ALT+H+Y8
; (Der Zwischenspeicher wird nun das zweite Mal mit den Namen ausgelesen)
; --------------------------------------------------------------------------------
SendInput HY8{Alt up}           ; Achtung: Durch die Add-in/Add-Ons ändert sich die Buchstabenfolge
; ------------------------------------------------------------------------------------------------
; Warte 2 Sekunden bis oben das Script abgelaufen ist und
; frage dann nach dem Variablenwert
; ------------------------------------------------------------------------------------------------
Sleep 2000
; Überprüft, ob Var die Zahl 0 ist. = der Text (Auto) wurde nicht in der Tabelle gefunden.
; Wenn (Auto) nicht gefunden, dann lösche den Text für (Auto) in der Email über das VBA-Macro.
If Var in 0
{
; Alt+HY9 startet das Macro in Outlook > Modules > PreWarningTextlöschen
SendInput !hy9					; Achtung: Durch die Add-in/Add-Ons ändert sich die Buchstabenfolge
}
; MsgBox, 0 Auto wurde nicht gefunden und 1 Auto wurde gefunden.`n`nDie Variable ist %Var%
Var := "" 						; löschen der Variable Var

Return
just me
Posts: 9574
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Excel/Outlook: Schlüsselwort aus einer Excel-Tabelle im Zwischenspeicher abfragen

26 Aug 2022, 03:34

Moin @Jakobus,

Code: Select all

#IfWinActive, ahk_class rctrl_renwnd32	; ahk_class zu finden über Window Spy
#IfWinActive gilt für alle Hotkeys, die zwischen dieser Zeile und der nächsten #IfWinActive Zeile definiert werden. In Deinem Beispiel gibt es keinen zugeordneten Hotkey.
Jakobus
Posts: 56
Joined: 01 Jul 2019, 13:26

Re: Excel/Outlook: Schlüsselwort aus einer Excel-Tabelle im Zwischenspeicher abfragen

26 Aug 2022, 10:47

Hallo just me,

Danke für Deinen Tipp.
Das hatte ich übersehen!

Statt

Code: Select all

~^Numpad0::
#IfWinActive, ahk_class rctrl_renwnd32	; ahk_class zu finden über Window Spy
Besser

Code: Select all

#IfWinActive, ahk_class rctrl_renwnd32	; ahk_class zu finden über Window Spy
~^Numpad0::
Deinen Hinweis habe ich sogleich umgesetzt und nachgeschaut,
ob es den gleichen Fehler auch in anderen Scripten gibt.

-----------------------------------------------------------------------------------------------------

Nebenbei.
Microsoft 365 läuft nun auf dem Rechner.
Das AHK-Script musste angepasst.
Gleich der Anfang machte das Problem.

Code: Select all

SendInput {NumpadAdd}
Sleep 600
SendInput {NumpadAdd}
Sleep 600
SendInput {Space}
Sleep 600
SendInput 1
Sleep 600
SendInput {NumpadEnter}
Das AHK Script tippte ++ 1 automatisch ins Outlook-Fenster wie gehabt.
Allerdings erschien nach den 4 Textzeichen nicht mehr automatisch der gewünschte Textbaustein (siehe rechte Seite unten im Bild)
Ich hatte verschiedenes probiert. Alles ohne Erfolg.
Ich kann es nicht erklären, warum nun nach den 4 Textzeichen der Textbaustein nicht mehr erscheint.

Zum Glück bietet Outlook noch eine weitere Variante an,
um den passenden Textbaustein (Building Block) aufzurufen (siehe Ergänzung weiter unten)

Code: Select all

SendInput !6{Down 2}{Enter}
Damit hatte ich dann Erfolg.
Attachments
Outlook.jpg
Outlook.jpg (38.77 KiB) Viewed 604 times
Last edited by Jakobus on 26 Aug 2022, 10:54, edited 3 times in total.
Jakobus
Posts: 56
Joined: 01 Jul 2019, 13:26

Re: Excel/Outlook: Schlüsselwort aus einer Excel-Tabelle im Zwischenspeicher abfragen

26 Aug 2022, 10:49

Ergänzung: Schnellbaustein/Textbaustein/Building Block
Attachments
Textbaustein.jpg
Textbaustein.jpg (33.67 KiB) Viewed 602 times

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 42 guests