Die neue Zwischenablage

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Meister Lampe
Posts: 183
Joined: 06 Apr 2014, 13:28

Die neue Zwischenablage

Post by Meister Lampe » 29 Jul 2020, 16:22

Hallo zusammen!

Seit kurzem fragen mich alle Computer und Laptops (auch die älteren) jedesmal beim Schließen einer Datei, in die ich etwas kopiert habe:
Sie haben viel Text in der Zwischenablage abgelegt. Soll dieser Text nach dem Beenden von Word [o.a.]78 anderen Anwendungen zur Verfügung stehen?
Ich habe mal gegoogelt und gefunden, daß das an einer neuen Struktur der Zwischenablage im neuen Office liegen soll. Mich wundert allerdings, daß die Abfrage auch kommt, wenn ich mit der älteren Version 2007 eine docx-Datei bearbeite.
Wie kriege ich das weg? Erstens ist es lästig, im normalen Alltag diese Meldung immer wieder wegklicken zu müssen und zweitens hemmt das mir den Ablauf der AHK-Scripte. Denn jedesmal, wenn dort mit ^c und ^p oder mit clippaste gearbeitet wird, poppt während des Programmablaufs (!) diese Meldung auf und muß später manuell wieder entfernt werden.
Ich habe zwar auch gehört, daß man das angeblich über die Registry deaktivieren kann, aber dort komme ich nicht bei jedem Computer ran. Also zumindest für den reibungslosen Ablauf der AHK-Scripte brauche ich eine Lösung. Was muß ich da einbauen?

Viele Grüße von Meister Lampe

BoBo
Posts: 3766
Joined: 13 May 2014, 17:15

Re: Die neue Zwischenablage

Post by BoBo » 30 Jul 2020, 06:05

Allgemeine Aussage dazu: "das ClipBoard leeren". Also einfach im weiteren Verlauf (also unmittelbar nach dem pasting, und vor dem Verlassen von Word & Co) einfach clipboard := "". Das sollte helfen.

Rohwedder
Posts: 3531
Joined: 04 Jun 2014, 08:33
Location: Germany

Re: Die neue Zwischenablage

Post by Rohwedder » 31 Jul 2020, 03:30

Ich habe alle 400 ms einen Timer (aktuell 670 Zeilen) laufen der unter anderen diese Warnungen erkennt und die richtigen Buttons betätigt.
Die Abschnitt "SchikaneFenster" wird nur ausführt wenn ein anderes Fenster aktiv wurde.

User avatar
Meister Lampe
Posts: 183
Joined: 06 Apr 2014, 13:28

Re: Die neue Zwischenablage

Post by Meister Lampe » 03 Aug 2020, 15:48

Hallo Rohwedder & BoBo!

Also außerhalb des AHK-Scripts ist das halt schon total nervig, aber - wie schon angedeutet - innerhalb noch mehr.
Und ich habe dieses clippaste in einer Schleife drin! Ihr könnt Euch vorstellen, was für einen Spaß das macht, wenn im Script die Schleifendurchgänge deswegen viel länger brauchen und ich anschließend auch noch dutzendweise diese aufgepoppten Fenster wieder manuell schließen darf.
Konkret handelt es sich um das Tool, das ich hier in diesem Thread https://www.autohotkey.com/boards/viewtopic.php?f=9&t=67511&start=20 erstellt habe. Ich habe das jetzt etwas erweitert, damit man über die eine Eingabe auch mehrere solche "virtuellen Deckblätter" erstellen kann. Das hat dann auch ganz gut geklappt, genauso wie der ursprüngliche, es geht hier also nicht mehr um diesen Code an sich.
Nur, daß eben darin diese Zeilen stehen - und stehen müssen:

Code: Select all

Loop
{
...
Send, ^a
Send, ^c
...
Run, %I_view_exe% /clippaste /convert=%Deckblattproben%\%VD_NameNeu%.jpg
...
}
Ich habe in die nächste Zeile nach dem clippaste den Befehl

Code: Select all

Clipboard := ""
gesetzt, was aber nichts genützt hat. Das war bereits bevor ich hier angefragt habe.
Interessant ist noch eine Beobachtung, die ich gemacht habe:
Ich habe mehrere Word-Vorlagen erstellt, die ich im Sript verwende (aus denen wird dann herauskopiert!), weil ich unterschiedliche Schriftgrößen und Typen, Positionen der Textfelder etc. ausprobieren wollte. Die sind zwar alle im .docx-Format, aber die die meisten hatte ich noch mit der älteren Office-Version erstellt und sind dann im neuen Laptop konvertiert worden. Die letzte habe ich gleich darauf angefertigt, und (nur) mit dieser kommt diese Meldung. Ich würde die aber gerne weiter nehmen, weil sie sich besser in den IrfanView übertragen läßt.

Viele Grüße von Meister Lampe

BoBo
Posts: 3766
Joined: 13 May 2014, 17:15

Re: Die neue Zwischenablage

Post by BoBo » 03 Aug 2020, 17:05

Wie schon gesagt, bei Verlassen einer Anwendung wird von dieser/oder dem System (?) die Existenz von Daten im ClipBoard abgefragt. Sofern dort vorhanden, kommt die Rückfrage ob diese ggf noch anderweitig verwendbar sein sollen. Würde also das Clipboard unmittelbar vor Verlassen der Anwendung geleert, wäre eine solche Rückfrage obsolet, ergo mission accomplished.

User avatar
Meister Lampe
Posts: 183
Joined: 06 Apr 2014, 13:28

Re: Die neue Zwischenablage

Post by Meister Lampe » 04 Aug 2020, 01:11

Hallo BoBo!

Das ist ja gerade das Problem hier. Der Befehl hier macht ja beides: Er öffnet den IrfanView, um dorthinein das gerade zuvor aus dem Worddokument "Deckblattproben" kopierte Element einzufügen und es dann unter dem neuem Namen und Pfad "VD_NameNeu" abzuspeichern. In einem weiteren Schritt wird dann das Worddokument geschlossen und gelöscht. Dort hatte ich auch schon einmal versucht, den Befehl, das Clipboard zu löschen, einusetzen, aber ebenfalls ohne Erfolg.
Hier nochmals der vollständige Code der Schleife.

Code: Select all

Loop, %VD_LoopIndex%
   {
   oWord := ComObjCreate("Word.Application")
   oDoc := oWord.Documents.Open(DocumentPath)
   oWord.Visible := 1, oWord.Activate
   oDoc.Bookmarks(BookmarkName1).Select
   oDoc.Bookmarks(BookmarkName1).Range.Text := VD_AktSign
  
   oDoc.Bookmarks(BookmarkName2).Select
   oDoc.Bookmarks(BookmarkName2).Range.Text := VD_SignNeu
   
   Send, {PGUP}
   Send, ^a
   Send, ^c
   VD_SignName := Format("{:0" . StellenSign . "}", VD_SignNeu)
   VD_NameNeu := AktSign . "_" . VD_SignName 
   ;~ MsgBox, %VD_NameNeu%
   oWord.ActiveDocument.SaveAs(Deckblattproben . VD_NameNeu . ".docx")
   ;oWord.ActiveDocument.SaveAs(A_ScriptDir . "\Arbeitsdateien AHK-Tool StAF\VD_docDateien\" . VD_NameNeu . ".docx")
   ;oWord.ActiveDocument.SaveAs("id_ArbeitsFenster" . VD_NameNeu . ".docx")
   
   RegRead, I_view_exe, HKCR\Applications\i_view32.exe\shell\open\command
   IF !(I_view_exe)
   {
   RegRead, I_view_exe, HKCR\Applications\i_view64.exe\shell\open\command
   RegexMatch(I_view_exe, "(?P<>""[^""]*"")", I_view_exe) ;erste "..."-Gruppe
   }
   oWord := ComObjActive("Word.Application")
   oRange := oWord.ActiveDocument.Range.Copy

   Run, %I_view_exe% /clippaste /convert=%Deckblattproben%\%VD_NameNeu%.jpg
         
   oWord.ActiveDocument.Close(0)
   oWord.Quit()
   FileDelete, %Deckblattproben%\%VD_NameNeu%.docx
      
   ;~ MsgBox, SignNeu ist z.Z. %VD_SignNeu%   
   VD_SignNeu := ++VD_SignNeu
   }
   Run, Deckblattproben
  
   ;~ MsgBox, SignNeu ist jetzt %VD_SignNeu%
   return
Also wie und wo müßte ich das Clipboard lehren?

Viele Grüße von Meister Lampe

User avatar
LuckyJoe
Posts: 275
Joined: 02 Oct 2013, 09:52

Re: Die neue Zwischenablage

Post by LuckyJoe » 04 Aug 2020, 03:12

Hi,

bei mir wird beim Beenden von Word mit "großer" Zwischenablage nachgefragt, ob ich die letzte Zwischenablage behalten möchte. Diese Anfrage kommt also dann nicht, wenn ich zuletzt in Word etwas "kleines" kopiert habe. Das heißt, du müsstest in deinem Script vor dem Schließen von Word noch etwas anderes kopieren. Das muss aber innerhalb des Word-Objectes geschehen:

oRange := oWord.ActiveDocument.Range.Copy

Suche dir doch ein einzelnes Zeichen aus, dass du innerhalb von Word kopierst, bevor du Word schließt.
Herzliche Grüße aus dem Rheinland
Lucky Joe

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

Re: Die neue Zwischenablage

Post by just me » 04 Aug 2020, 04:14

Moin,

es tut mir leid, aber ich kann nicht widerstehen:
Also wie und wo müßte ich das Clipboard lehren?
Es muss heißen:
Also was müßte ich das Clipboard lehren?

Zurück zum Thema:

Hast Du es mal mit dem guten alten

Code: Select all

oWord.DisplayAlerts := 0
versucht? Und außerdem, warum erstellst Du zwischendurch ein neues Word-Objekt?

Code: Select all

oWord := ComObjActive("Word.Application")

BoBo
Posts: 3766
Joined: 13 May 2014, 17:15

Re: Die neue Zwischenablage

Post by BoBo » 04 Aug 2020, 04:58

Motto der Berufschullehrer der Entsorgungswirtschaft: "Leeren lehren!"
Vom Hochsitz gefallener Jäger: "Kaum das ich wieder steh, kann ich kaum widerstehn den Widder wieder widerstehn zu sehn!"
Mike Tyson nach dem Niederschlag durch Roy Jones Jr. zum Kampfrichter: "Sorry, ich kann nicht wieder stehn!"

Ach Gesprech von Deutscheland is schon geil :lol: ... (Ooops, @gregster kommt mit Schild umme Ecke :offtopic: ) :silent:

User avatar
Meister Lampe
Posts: 183
Joined: 06 Apr 2014, 13:28

Re: Die neue Zwischenablage

Post by Meister Lampe » 04 Aug 2020, 12:35

Hallo just me!

Vielen Dank für die Beleerung :P !

Ich habe das

Code: Select all

oWord := ComObjActive("Word.Application")
jetzt entfernt und die Sache funktioniert immernoch, das scheint also wirklich nicht notwendig gewesen zu sein. Aber der Fehler bzw. die Störung durch diese Office-Meldung besteht weiterhin.
Ich habe auch an den verschiedenen Stellen, wo ich es mit clipboard := "" versucht hatte, jetzt mal Deinen Vorschlag eingefügt, was aber auch keinen Unterschied gemacht hat. Wo genau der stehen müßte, weiß ich nicht.
Mir ist aber noch etwas Anderes aufgefallen. Nach dem clippaste wird die neu erstellte und abgespeicherte .jpg-Datei nicht wieder geschlossen, sondern jeweils die letzte bleibt offen. Meinst Du, es könnte daran liegen?
Das war in den älteren Versionen des Scripts nicht so, dort brauchte ich noch eine Zeile am Ende mit

Code: Select all

RunWait %Arbeitsdateien%\%VD_NameNeu%.jpg
damit ich die neue Datei gleich anschauen konnte. Letztlich ist das aber nur zu Testzwecken gedacht, ich habe es ja jetzt auch so eingerichtet, daß die erstellten Dateien in einem separaten Ordner gesammelt werden, der nach Ablauf der Schleife geöffnet wird.

Viele Grüße von Meister Lampe

User avatar
LuckyJoe
Posts: 275
Joined: 02 Oct 2013, 09:52

Re: Die neue Zwischenablage

Post by LuckyJoe » 04 Aug 2020, 12:52

Hallo Meister Lampe,

vielleicht hast du meinen Hinweis ja übersehen, aber probiere doch mal folgende Zeile:

oRange := oDoc.Bookmarks(BookmarkName2).Range.Copy
oder: oDoc.Bookmarks(BookmarkName2).Range.Text.Copy?

vor der Zeile:

oWord.ActiveDocument.Close(0)

einzufügen (ungetestet, bin mir nicht sicher, welches der "richtige" Copy-Befehl ist). Ich bin überzeugt, dass du den Hinweis mit der Zwischenablage nicht mehr bekommst, wenn sie nicht mehr so groß ist.
Herzliche Grüße aus dem Rheinland
Lucky Joe

User avatar
Meister Lampe
Posts: 183
Joined: 06 Apr 2014, 13:28

Re: Die neue Zwischenablage

Post by Meister Lampe » 04 Aug 2020, 16:42

Hallo Lucky!

Ich habe das jetzt mal versucht, mit beiden Variationen. Aber verändert hat sich nichts.
Ich habe in dem Script mittlerweile mehr auskommentierte Versuche und Umänderungen, als eigentlichen Code...

Viele Grüße aus Baden,
Meister Lampe

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

Re: Die neue Zwischenablage

Post by just me » 05 Aug 2020, 04:52

Meister Lampe wrote:Wo genau der stehen müßte, weiß ich nicht.
Du kannst das immer nach der Zeile einfügen, die ein neues Word.Application Objekt erzeugt:

Code: Select all

...
   oWord := ComObjCreate("Word.Application")
   oWord.DisplayAlerts := 0
...
Das muss aber Deine Meldung nicht zwangsläufig unterdrücken.

Code: Select all

Clipboard := ""
wird meiner Meinung nach eher nicht helfen, weil Office noch die Hand auf der Zwischenablage hat.

User avatar
Meister Lampe
Posts: 183
Joined: 06 Apr 2014, 13:28

Re: Die neue Zwischenablage

Post by Meister Lampe » 06 Aug 2020, 14:37

Hallo just me & Lucky!

Ich habe den Code jetzt zuerst von all den alten auskommentierten Versuchen (bis auf die letzten von Euch empfohlenen) und den überflüssigen Befehlen befreit. Ich hatte nämlich noch min. 2 Zeilen gefunden, die auch nicht nötig waren bzw. den Ablauf eher verlangsamten. Jetzt ist das zumindest übersichtlicher zu lesen und ich setze ihn hier nochmals herein.

Code: Select all

F11::
VirtuellesDeckblatt:
I_view_exe := "C:\Program Files (x86)\IrfanView\i_view32.exe"

IF !FileExist(I_view_exe)
   {
   Warnung_IViewText =
   (
   Zum Erstellen eines virtuellen Deckblattes
benötigen Sie das Bildprogramm IrfanView!
   )
   MsgBox, 16, IrfanView nicht installiert, %Warnung_IViewText%
   Return
   }
   
If !(ModulAuswahl = 4 or ModulAuswahl = 0)
   {
      MsgBox, 17, Keine Bestandsvorlage!, Sie müssen zuerst eine Bestandsvorlage auswählen!
      IfMsgBox Ok
      {
         Gosub Auswahlfenster
         ModulAuswahl := 4
         return
      }
      else
      return
   }
else
   ModulAuswahl := 4
   
   Clipboard := ""
   VD_IBoxText =
   (
   
   Ein virtuelles Deckblatt zum 
   Bestand %AktSign% wird erstellt.
   Geben Sie die Aktensignatur ein!
   )
   InputBox, VD_SignBox, Virtuelles Deckblatt, %VD_IBoxText%, ,240, 185,
   If ErrorLevel
      return
   else

If InStr(VD_SignBox, "-") 
   {
   VD_Array := StrSplit(VD_SignBox, "-")
   VD_SignNeu := VD_Array[1]
   VD_LoopEnd := VD_Array[2]
   }
else
   {
   VD_SignNeu := VD_SignBox
   VD_LoopEnd := VD_SignBox
   }
   VD_LoopIndex := VD_LoopEnd-VD_SignNeu+1
   ;~ Index := O
   IndexStellen := StellenIndex
   Index := Format("{:0" . IndexStellen . "}", 0)
   
   ;~ MsgBox, VD_LoopIndex ist %VD_LoopIndex%
   
   VD_AktSign := StrReplace(AktSign, "--", "/")
   ;MsgBox %VD_AktSign%
   DocumentPath := VD_Vorlage
   BookmarkName1 := "AktSign_Marke"   
   BookmarkName2 := "Signatur_Marke"

Loop, %VD_LoopIndex%
   {
   oWord := ComObjCreate("Word.Application")
   oWord.DisplayAlerts := 0
   oDoc := oWord.Documents.Open(DocumentPath)
   oWord.Visible := 1, oWord.Activate
   oDoc.Bookmarks(BookmarkName1).Select
   oDoc.Bookmarks(BookmarkName1).Range.Text := VD_AktSign

   oDoc.Bookmarks(BookmarkName2).Select
   oDoc.Bookmarks(BookmarkName2).Range.Text := VD_SignNeu
     
   Send, {PGUP}
   Send, ^a
   Send, ^c
   VD_SignName := Format("{:0" . StellenSign . "}", VD_SignNeu)
   VD_NameNeu := AktSign . "_" . VD_SignName . "-" . Index
   ;~ MsgBox, %VD_NameNeu%
   oWord.ActiveDocument.SaveAs(Deckblattproben . VD_NameNeu . ".docx")
   ;oWord.ActiveDocument.SaveAs(A_ScriptDir . "\Arbeitsdateien AHK-Tool StAF\VD_docDateien\" . VD_NameNeu . ".docx")
      
   RegRead, I_view_exe, HKCR\Applications\i_view32.exe\shell\open\command
   IF !(I_view_exe)
   {
   RegRead, I_view_exe, HKCR\Applications\i_view64.exe\shell\open\command
   RegexMatch(I_view_exe, "(?P<>""[^""]*"")", I_view_exe) ;erste "..."-Gruppe
   }
   ;~ oWord := ComObjActive("Word.Application")
   ;~ oRange := oWord.ActiveDocument.Range.Copy
   ;~ oWord.DisplayAlerts := 0  
   ;Run, %I_view_exe% /clippaste /convert=c:\test\test.jpg
   Run, %I_view_exe% /clippaste /convert=%Deckblattproben%\%VD_NameNeu%.jpg
   WinClose, I_view_exe
   WinClose, Word
   
   ;~ oWord.ActiveDocument.Close(0)
   ;~ oWord.Quit()
   
   FileDelete, %Deckblattproben%\%VD_NameNeu%.docx
      
   ;~ MsgBox, SignNeu ist z.Z. %VD_SignNeu%   
   VD_SignNeu := ++VD_SignNeu
   }
   ;~ WinClose, I_view_exe
   ;~ WinClose, Word
   Run, Deckblattproben
   
   ;~ MsgBox, SignNeu ist jetzt %VD_SignNeu%
   return
Mit diesem Code habe ich es durch herumprobieren zumindest soweit gebracht, daß die Meldung am Schluß nur noch einmal kommt und nicht mehr - wenn ich mehrere erstelle - für jede Datei einzeln weggeklickt werden muß. Dafür werden aber 1. die nachher nicht mehr benötigten Word-Dateien jetzt nicht mehr gelöscht wie früher, obwohl nach dem clippaste weiterhin die Zeile steht:

Code: Select all

FileDelete, %Deckblattproben%\%VD_NameNeu%.docx
Dafür kommt weiter die Meldung vom IrfanView
Error! Can't load: '%1'
Die erstellten Dateien werden aber schön abgespeichert, die Word-Dateien bleiben offen. Ausgerechnet, dann, wenn ich dieses WinClose, Word (innerhalb der Schleife) nicht auskommentiere! Tue ich das aber, dann werden die Word-Dateien zwar geschlossen aber ebenfalls abgespeichert, die IrfanView-Fehlermeldung erscheint ebenfalls, aber die Bild-Datei wird dann gar nicht erst erstellt.
Ich bin jetzt wirklich ein bißchen konfus.

Viele Grüße von Meister Lampe

PS.: Die Zeilen, die ich - wie oben erwähnt herausgenommen habe, enthielten Befehle zur Anlegung eines weiteren Worddokuments und einen weiteren Copy-Befehl, weshalb ich dachte, damit könnte ich diese lästige Meldung wegbekommen.

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

Re: Die neue Zwischenablage

Post by just me » 07 Aug 2020, 04:55

Moin,

Anmerkung 1 -> IrfanView:

Am Anfang der Routine prüfst Du, ob IrfanView_32 auf einem 64-Bit System installiert ist. Wenn das nicht so ist, ist nach einer Fehlermeldung Schluss:

Code: Select all

I_view_exe := "C:\Program Files (x86)\IrfanView\i_view32.exe" ; 32-Bit I_View auf 64-Bit System
IF !FileExist(I_view_exe)
{
   Warnung_IViewText =
   (LTrim
      Zum Erstellen eines virtuellen Deckblattes
      benötigen Sie das Bildprogramm IrfanView!
   )
   MsgBox, 16, IrfanView nicht installiert, %Warnung_IViewText%
   Return
}
Später versuchst Du, das installierte I_View über die Registrierung zu ermitteln.

Code: Select all

   RegRead, I_view_exe, HKCR\Applications\i_view32.exe\shell\open\command
   IF !(I_view_exe)
   {
      RegRead, I_view_exe, HKCR\Applications\i_view64.exe\shell\open\command
      RegexMatch(I_view_exe, "(?P<>""[^""]*"")", I_view_exe) ;erste "..."-Gruppe
   }
Der ursprüngliche Eintrag in der Variablen I_view_exe wird dabei überschrieben. Der aus der Registrierung ausgelesene Parameter "%1" wird aber (wenn das überhaupt so klappt) nur für I_View 64-Bit entfernt.

Ich würde mal vermuten, dass sich die IrfanView-Installation während der Ausführung Deines Skripts nicht ändern wird. Die einmalige Suche nach der I_VIEW_EXE zu Beginn des Skripts sollte deshalb ausreichen.


Anmerkung 2 -> Einrückungen:

Deine Einrückungen erschließen sich mir nicht. Man kann die Ablaufstruktur nicht erkennen, ohne den kompletten Code zu lesen.
Folgendes ist für mich deutlich übersichtlicher:

Code: Select all

#NoEnv
F11::
VirtuellesDeckblatt:
I_view_exe := "C:\Program Files (x86)\IrfanView\i_view32.exe"
IF !FileExist(I_view_exe)
{
   Warnung_IViewText =
   (LTrim
      Zum Erstellen eines virtuellen Deckblattes
      benötigen Sie das Bildprogramm IrfanView!
   )
   MsgBox, 16, IrfanView nicht installiert, %Warnung_IViewText%
   Return
}

If !(ModulAuswahl = 4 or ModulAuswahl = 0)
{
   MsgBox, 17, Keine Bestandsvorlage!, Sie müssen zuerst eine Bestandsvorlage auswählen!
   IfMsgBox Ok
   {
      Gosub Auswahlfenster
      ModulAuswahl := 4
      return
   }
   else
      return
}
else
   ModulAuswahl := 4

Clipboard := ""
VD_IBoxText =
(LTrim

   Ein virtuelles Deckblatt zum
   Bestand %AktSign% wird erstellt.
   Geben Sie die Aktensignatur ein!
)
InputBox, VD_SignBox, Virtuelles Deckblatt, %VD_IBoxText%, ,240, 185,
If ErrorLevel
   return
else
   If InStr(VD_SignBox, "-")
   {
      VD_Array := StrSplit(VD_SignBox, "-")
      VD_SignNeu := VD_Array[1]
      VD_LoopEnd := VD_Array[2]
   }
   else
   {
      VD_SignNeu := VD_SignBox
      VD_LoopEnd := VD_SignBox
   }

VD_LoopIndex := VD_LoopEnd-VD_SignNeu+1
;~ Index := O
IndexStellen := StellenIndex
Index := Format("{:0" . IndexStellen . "}", 0)

;~ MsgBox, VD_LoopIndex ist %VD_LoopIndex%

VD_AktSign := StrReplace(AktSign, "--", "/")
;MsgBox %VD_AktSign%
DocumentPath := VD_Vorlage
BookmarkName1 := "AktSign_Marke"
BookmarkName2 := "Signatur_Marke"

Loop, %VD_LoopIndex%
{
   oWord := ComObjCreate("Word.Application")
   oWord.DisplayAlerts := 0
   oDoc := oWord.Documents.Open(DocumentPath)
   oWord.Visible := 1, oWord.Activate
   oDoc.Bookmarks(BookmarkName1).Select
   oDoc.Bookmarks(BookmarkName1).Range.Text := VD_AktSign

   oDoc.Bookmarks(BookmarkName2).Select
   oDoc.Bookmarks(BookmarkName2).Range.Text := VD_SignNeu

   Send, {PGUP}
   Send, ^a
   Send, ^c
   VD_SignName := Format("{:0" . StellenSign . "}", VD_SignNeu)
   VD_NameNeu := AktSign . "_" . VD_SignName . "-" . Index
   ;~ MsgBox, %VD_NameNeu%
   oWord.ActiveDocument.SaveAs(Deckblattproben . VD_NameNeu . ".docx")
   ;oWord.ActiveDocument.SaveAs(A_ScriptDir . "\Arbeitsdateien AHK-Tool StAF\VD_docDateien\" . VD_NameNeu . ".docx")

   RegRead, I_view_exe, HKCR\Applications\i_view32.exe\shell\open\command
   IF !(I_view_exe)
   {
      RegRead, I_view_exe, HKCR\Applications\i_view64.exe\shell\open\command
      RegexMatch(I_view_exe, "(?P<>""[^""]*"")", I_view_exe) ;erste "..."-Gruppe
   }
   ;~ oWord := ComObjActive("Word.Application")
   ;~ oRange := oWord.ActiveDocument.Range.Copy
   ;~ oWord.DisplayAlerts := 0
   ;Run, %I_view_exe% /clippaste /convert=c:\test\test.jpg
   Run, %I_view_exe% /clippaste /convert=%Deckblattproben%\%VD_NameNeu%.jpg
   WinClose, I_view_exe
   WinClose, Word

   ;~ oWord.ActiveDocument.Close(0)
   ;~ oWord.Quit()

   FileDelete, %Deckblattproben%\%VD_NameNeu%.docx

   ;~ MsgBox, SignNeu ist z.Z. %VD_SignNeu%
   VD_SignNeu := ++VD_SignNeu
}
;~ WinClose, I_view_exe
;~ WinClose, Word
Run, Deckblattproben

;~ MsgBox, SignNeu ist jetzt %VD_SignNeu%
return

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

Re: Die neue Zwischenablage

Post by just me » 07 Aug 2020, 05:55

So, vielleicht klappt Folgendes besser. I_view_exe musst Du vorher schon bestimmen:

Code: Select all

; Deckblatt/blätter verarbeiten ----------------------------------------------------------------------------------------
oWord := ComObjCreate("Word.Application") ; keine Fehhlerbehandlung !!!
oWord.DisplayAlerts := 0
oWord.Visible := 1
oWord.Activate
Loop, %VD_LoopIndex%
{
   VD_SignName := Format("{:0" . StellenSign . "}", VD_SignNeu)
   VD_NameNeu := AktSign . "_" . VD_SignName . "-" . Index
   oDoc := oWord.Documents.Open(DocumentPath) ; keine Fehhlerbehandlung !!!
   oDoc.Bookmarks(BookmarkName1).Select
   oDoc.Bookmarks(BookmarkName1).Range.Text := VD_AktSign
   oDoc.Bookmarks(BookmarkName2).Select
   oDoc.Bookmarks(BookmarkName2).Range.Text := VD_SignNeu
   oDoc.SaveAs(Deckblattproben . VD_NameNeu . ".docx") ; ??? wozu auch immer ???
   ; IrfanView
   Clipboard := ""
   Send, {PGUP}
   Send, ^a
   Send, ^c
   ClipWait, 1 ; keine Fehhlerbehandlung !!!
   RunWait, %I_view_exe% /clippaste /convert=%Deckblattproben%\%VD_NameNeu%.jpg ; RunWait
   Clipboard := ""
   oDoc.Close(0)
   FileDelete, %Deckblattproben%\%VD_NameNeu%.docx
   VD_SignNeu++
}
oWord.Quit()
Run, Deckblattproben
return

User avatar
Meister Lampe
Posts: 183
Joined: 06 Apr 2014, 13:28

Re: Die neue Zwischenablage

Post by Meister Lampe » 14 Aug 2020, 12:56

Hallo just me!

Vielen Dank, ganz besonders für den letzten Code. Jetzt klappt es prima. :clap:
Du hast gesehen, daß man noch mehr Befehle aus der Schleife herausnehmen kann, die dann vorher nur einmal durchlaufen müssen. Jetzt läuft das ganze Script auch viel schneller. Ich habe jetzt lediglich noch auf Deinen Hinweis hin die Abspeicherung des Word-Dokuments herausgenommen und das dann ebenfalls nicht mehr benötigte FileDelete.
Ich konnte das Script mittlerweile sogar auf unterschiedlichen Computern testen, bei denen es dann jedesmal funktionierte.

Vielen Dank und viele Grüße von Meister Lampe

Post Reply

Return to “Ich brauche Hilfe”