Hallo @water,
Das ist nicht in der Hilfe enthalten, sondern Teil der ExcelCOM-UDF , die @chrissi benutzt.
https://www.autoitscript.com/forum/topic/34…r-excelcom-udf/
Beiträge von autoiter
-
-
Bei mir ist _ArrayAdd immer schneller, als ReDim.
-
Schau mal. Ich habe aus $aArray aus deinem vorigen Post verwendet. Deine Variable heißt aber scheinbar nur $Array (?)
PS: $i muss nicht deklariert werden. Es ist in einer For ($i= ..)-Schleife automatisch eine lokale Variable, die nur innerhalb der Schleife existiert.
-
Ja, dann passt das. Schau dir mal nach einem _ArrayDelete das Array an (das Array ist kleiner und alle Elemente nach dem gelöschten wurden um eins nach oben geschoben - es gibt ja keine Leerzeile). Du kommst also irgendwann zu einem Punkt, wo du auf Elemnte zugreifen willst, die es nicht gibt, weil das Array vorher ja verkleinert wurde. Außerdem hast du Elemente/Zeilen übersprungen.
Also rückwärts For $i = $aArray[0] To 1 Step -1 -
Hallo @daMeier,
Stringleft ist Okay. Du musst die Schleife aber rückwärts durchgehen, wenn du Zeilen löschst. Ich weiß ja nicht was genau dein Problem war. Ich erwarte es aber dort.
-
Ja, stimmt. Für die paar Skripte, wo mir das lieber ist, genügt mir die Anweisung.
Danke dir @UEZ -
Ich wollte dir erst widersprechen, weil im zip File der Beta auch SciTE enthalten ist. Bei der Installation ist das aber nicht der Fall. Weiß der Geier, was ich da gemacht habe und weiß der Geier, was Open (Beta) ist.
In der Neuinstallation muss ich jedenfalls auch Alt+F5 drücken, wenn ich die Beta nutzen möchte - auch wenn ich das Skript vorher über Open (Beta) geöffnet habe.Danke dir BugFix. Hab mal ein SciTE entfernt (manchmal zweifle ich sogar selbst an meinem Verstand ).
-
Du schmeißt da was durcheinander.
Es gibt keine SciTE-Beta.Ja, da habe ich mich falsch ausgedrückt. Ich meinte nicht wirklich eine Beta-Version von SciTE, sondern die SciTE-Version im Verzeichnis der Beta-Version von AutoIt.
Wenn man die öffnet, braucht man nicht Alt+F5 drücken und landet beim Aufruf der Hilfe auch nicht in v3.3.14.2 sondern in v3.3.15.0 (Beta).Das funktioniert natürlich nur, wenn du auch die Beta ordentlich installiert hast. Vermutlich ist da bei dir was schief gelaufen. Einfach nochmal deinstallieren und neu installieren.
Ich benutze einen alternativen Pfad. Ich erwarte das Problem da zwar nicht, aber ich werde es mal neu im Standardverzeichnis installieren.
Aber nur zur Sicherheit. Arbeitet der Kontextmenü-Eintrag "Open(Beta)" anders als bei mir? Wird also bei dir die SciTE-Version aus dem Beta Ordner geöffnet?
Maps führen in der Final noch zum Absturz. Daher wollte ich überhaupt direkt die Beta-Version von AutoIt nutzen.Das Beispiel VarGetType stürzt in der Final aus dem Gunde auch ab, wenn nicht explizit mit Run Beta ausgeführt.
-
Hallo Leute,
Ich habe ein kleines "Problem" mit SciTE oder meiner AutoIt-Installation. Wenn ich ein Skript mit der Beta-Version von SciTE öffnen will, klappt das nicht mit einem Rechtsklick auf das Skript und der Kontextmenü-Auswahl "Open(Beta)". Ich muss SciTE direkt im Beta-Ordner öffnen und dann das Skript öffnen. Ansonsten wird immer die Final-Version geladen.
Ein Skript mit der Beta ausführen ("Run Script (Beta)") klappt jedoch auch aus dem Kontextmenü (und in SciTE (final) mit Alt+F5).
Woran kann das liegen? Verstehe ich die Option falsch? -
Hallo @AspirinJunkie,
Ich wollte auch mal so etwas ähnliches machen und wollte dazu auch die Clipboard UDF verwenden. Jedoch habe ich nicht geschnallt, wie man etwa mit Bildern umgeht und unterscheidet, dass es sich nicht etwa um eine kopierte Pfadangabe sondern tatsächlich um eine Bilddatei handelt. Weißt du das?
-
Hallo @horphi,
Ohne von der DynArray UDF abraten zu wollen, will ich nur folgendes zu ReDim schreiben:
Genau wie @alpines es breits geschrieben hat, vermute auch ich hier das Problem.Beispielhaft für eine deiner Schleifen:
Statt $aRet[1][1] zu deklarieren, würde ich es direkt mit maximalen Größe erstellen (UBound($aTmp).
So muss das Array nicht mehrfach vergrößert werden (Langwieriger Prozess, mit kopieren des vorhandenen Arrays).
Wenn unter Umständen das Zielarray am Ende nicht so groß sein soll, wie die Anzahl der Schleifendurchläufe, dann empfiehlt sich eine Zähler-Variable.
Hier ein Beispiel:AutoIt
Alles anzeigen#include <Array.au3> test() Func test() Local $aArray[4] = [1, 2, 3, 1] ; Die Quelldaten Local $iMax = UBound($aArray) ; der Maximalwert Local $aResult[$iMax][2] ; Das ZielArray mit Maxiimalgröße _ArrayDisplay($aResult) Local $iCount = 0 ; Die Zählervariable - erster Wert ist Null für das erste Element im Array For $i = 0 To $iMax - 1 If $aArray[$i] = 1 Then ; Wenn der Wert Eins ist, dann .. $aResult[$iCount][0] = $aArray[$i] ; Zuweisung zum Zielarray $iCount += 1 ; der Wert wird um Eins erhöht, damit das nächste mal das nächst höhere Element gefüllt wird. EndIf Next ReDim $aResult[$iCount][2] ; Einmaliger ReDim auf die wirklich benötigte Größe _ArrayDisplay($aResult) EndFunc ;==>test
(Auch habe ich schon Arrays in Größe deklariert, die sicher nicht erreicht wurde. Etwa $aArray[10000][200] und ohne Ubound mit einer Zählervariable (oder zwei, falls zweidimensional und notwendig ) das Array nach der Schleife mit ReDim angepasst.)
-
Opt('MustDeclareVars', 1) würde ich aber wirklich empfehlen.
Dazu bedarf es nur etwas Planung, also :
- welche Variablen möchte ich global verwenden -> am Anfang des Skriptes Global deklarierenAls ich anfing, habe ich auch so gearbeitet, weil ich mir irgendwelche Videos angeschaut habe, in denen das so proklamiert wurde. Heute halte ich das für einen Fehler. Opt('MustDeclareVars', 1) halte ich persönlich für unnötig. Wer es aber zur Selbstdisziplinierung braucht, soll es ruhig nutzen.
Für mich hat sich herausgestellt, dass man einfach immer versuchen sollte, alles so lokal wie möglich zu halten - sich also immer Gedanken machen sollte, was man wo mit einer Variable machen möchte. Dann sollte man die Variable genau da (oder direkt darüber) deklarieren, wo man sie initialisiert/braucht.
Wenn man bei späteren Änderungen eine Variable löscht, hat man die Deklaration auch direkt im Blick. Der andere Weg führt für mich eher dazu, dass ungenutzte Variablen deklariert werden. (Am Ende sind das aber natürlich alles persönliche Vorlieben).
MustDeclareVars verwende deahalb nicht mehr weil es mich schon öfters zum verzweifeln brachte, dafür achte ich sehr gut auf mögliche Fehler,da wäre mal eine UDF angebracht die einfach alle gefunden Variablen selbstständig im Scriptkopf Global oder in der Funktion als Lokale Variablen erstellen würde, aber das ist für mich noch zu viel des guten eine UDF zu erstellen, die sollte frei von Fehlern sein.
Das wird sicher nicht kommen. Kann auch nicht klappen. Wenn du lokal einen Variablennamen verwenden möchtest, den du schon global benutzt, wie soll irgendein Skript wissen, dass du hier aber nicht der globalen Variable einen neuen Wert zuweisen möchtest, sondern eine neue lokale Variable einführen willst oder umgekehrt? Das ginge nur, wenn du das Deklarieren und das Initialisieren - also die Wertzuweisung - strikt trennen würdest. Wenn eine Variable oder mehrere Variablen ohne Zuweisung in einer Zeile stünden, könnte es natürliche einen Gültigkeitsbereich ausmachen und die Zeile ergänzen.
Wer aber diese Disziplin an den Tag legt, braucht sicher nicht so einen fehleranfälligen KramDie Notation stellst du dir scheinbar ziemlich schwierig vor. Fang einfach mal langsam damit an. Sich wenigstens halbwegs an Konventionen zu halten hat Vorteile. Das hilft dir mit gewissem Abstand selbst, dich wieder in deinem Skript zurecht zu finden, wenn du nach Monaten etwas ändern willst. Es hilft aber auch anderen Programmierern, die sich deinen Code ansehen sollen, wenn du mal Probleme hast. Gerade bei fremden Code hilft es, schnell zu verstehen, was der Programmierer hier wollte bzw. womit er arbeiten wollte.
Das ist jetzt aber keine Aufforderung, das in diesem Skript nachträglich zu implementieren. Ich wollte es (wie alle anderen bisher auch) nur anmerken .Folgendes habe ich aus dem Post von BugFix. Ich habe es nicht getestet und labere vielleicht Quatsch. Warte mal auf Widerspruch von anderen:
Ich bin mir nicht sicher evtl. ist das Problemgenau das Send("^c") , ich weiß nur, daß die Funktion "Kopieren" Probleme hat wenn ich die nachfolgende Sleep(100) entferne. Ob das mit dem Send-Befehl zusammenhängt weiß ich nicht. Aber wenn die Sleep(100) fehlt, kopiert mir das Script keine Bilder mehr sondern nur der Link landet dann im Clipboard.
Die Wartepause ist notwendig. Die Erfahrung habe ich auch schon gemacht, als ich mir mal einen Clipboard-Manager schreiben wollte. Ich weiß, deine Zwischenablage ist nicht leer sondern der Link erscheint, statt dem Bild. Mir hat aber dennoch geholfen eine Schleife statt einem festen Sleep zu nehmen (weil sich die notwendige Zeit unterscheiden kann.
Spoiler anzeigen
AutoIt
Alles anzeigen; Statt dem hier: If ClipGet() <> "" Then ;Da ich hier ändern musste kann jetzt der gleiche Einrtag mehrmals kopiert werden $Clip[$Cstep] = ClipGet() SplashTextOn("Titel", "Clip " & $Cstep & " wurde gespeichert", 270, 50, MouseGetPos(0), MouseGetPos(1), 17, "Arial", 14, 400) $TimerKurz = TimerInit() $Cstep += 1 EndIf ; Habe ich etwa so etwas verwendet: Local $hTimer = TimerInit(), $fDiff Do Sleep(50) $Clip[$Cstep] = ClipGet() $fDiff = TimerDiff($hTimer) Until $Clip[$Cstep] <> "" Or $fDiff > 3000 If $Clip[$Cstep] == "" Then ; Wir haben ein Problem. Was tun? Else SplashTextOn("Titel", "Clip " & $Cstep & " wurde gespeichert", 270, 50, MouseGetPos(0), MouseGetPos(1), 17, "Arial", 14, 400) $TimerKurz = TimerInit() $Cstep += 1 EndIf
Aber das Drücken der Control-Taste während des Link Kopierens sollte die Funktion BildCopy aufrufen,
aber ohne Sleep(100) wird stattdessen in die Funktion Kopieren gesprungen(ich verstehe einfach nicht warum).Ich glaube hier liegt eine falsche Klammersetzung vor. Du hast die komplette Abfrage umklammert. Ich denke du musst die <> Abfrage von der der Not-Abfrage abkapseln, da das zum Fehler führt.
Also If (ClipGet() <> "") And Not _IsPressed("11", $hUser32) Then F_LinkCopy().
Allerdings wäre es wohl klarer, wenn du die Bedingungen etwas trennen würdest (BugFix hatte das auch ähnlich angemerkt). Zusammen mit der Folgezeile könnte das so aussehen:Spoiler anzeigen
PS: Wie geschrieben. Das habe ich einfach mal nach Codeansicht geschrieben. Ich bin hier aber definitiv nicht die hellste Leuchte. Daher fordere ich Wachsamkeit von allen Lesern
-
Ich weiß nämlich nicht wie viel der rausstrippt, bei Konstanten schreibe ich den Wert direkt in die Funktion und lasse sie nicht als einzelne Zeile stehen. (Auch bei Hilfsfunktionen etc).
Du kannst dir das Ergebnis ansehen. Das Programm erstellt nämlich eine weitere au3 mit dem Zusatz _stripped.
Das Teil ist genial. Ich benutze auch gerne aussagekräftige Variablennamen, die dann leider oft lang werden. Die lasse ich mir beim Kompilieren dann auch umbenennen - genauso Funktionen u.a.Spoiler anzeigen
AutoIt
Alles anzeigenSupported commandline or compiler directive options: The following parameters can be passed on the command line or within the script via the #Au3Stripper_Parameters= directive: /TraceLog /TL Create Au3Stripper.Log with a trace of all actions. /debug /add Debug information to Au3Stripper.Log. /PreExpand /PE Replace any reference to a Global Const variable with its actual value. /StripOnly /SO Set the options to:/SF=1 /SV=1 which is now also the default when no parameters are specified. /StripUnusedFunc=0/1 /SF=0/1 Strip unused Funcs (Default = 1) /StripUnusedVars=0/1 /SV=0/1 Strip unused Global and Local variable declarations (Default = 1) /MergeOnly /MO Will produce a scriptfile as AUT2EXE includes in the Compiled EXE. This allows you to find the proper linenumber when errors are reported. Note: Make sure you remove the #pragma lines or else the linenumbers will be off by the that number of records /MaxIterations /MI Sets the maximum Iterations Au3Stripper will perform. Default is 5. /RenameMinimum /RM Generates a much smaller file by substituting function and variable names with unique 2+-character names /ShowConsoleInfo=0/1/9 /SCI=0/1/9 0 = (Default) Minimal output to the console - only warnings and errors. 1 = Show more progress information 9 = Show all debug lines as found in the Au3Stripper.log. /rsln Replace @ScriptLineNumber with the actual line number for source debug purposes with compiled scripts. /Beta Use the ...\AutoIt\Beta\Include files if installed
Mit folgender Zeile kann man die erstellte stripped au3 auch gleich wieder löschen lassen.
#AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3" -
Er hat sie absichtlich rauskopiert damit er das gesamte Include nicht reinnehmen muss, mache ich auch so. (_ArrayDelete z.B.)
Dazu gibt es doch Stripper. (Also das Programm).
-
Ich glaube da ging es um Word @alpines. (Gleiche Sachlage..)
Ja, @water schreibt diese und andere Office UDF (Schau dir mal seine Signatur an @mumpel. Er pflegt nämlich auch ein sehr hilfreiches Wiki). Allerdings pflegt er nur im englischen Forum einen Bugfix-Thread.. Dort habe ich die aktualisierten Funktionen her.
Hier: https://www.autoitscript.com/forum/topic/18…word_docsaveas/
-
Ersetze mal deine Excel.au3 in deinem Include Ordner im AutoIt Installationsverzeichnis durch die angehängte Version.
PS: Ein ärgerliches Problem. Es gibt in der Excel.au3 mittlerweile einige korrigierte Funktionen. Da aber ein AutoIt Update ausbleibt enthalten die installierten Versionen noch diese Fehler..
In meiner Version ist die angemerkte IsObj-Prüfung genau an der Stelle enthalten.. -
Hallo @mumpel,
statt das Skript zu kompilieren, solltest du es in SciTE starten, damit du dort unten in der Konsole sehen kannst, wo der Fehler genau auftritt.
Du kannst prüfen, ob eine Variable ein Objekt ist. (If IsObj($oVariable) Then ...).
-
@Floops
Das @SW_HIDE sollte er aber wohl weglassen, oder? -
Ähm @AutoItler.
Hast du meinen langen Beitrag gelesen? Dann wäre dir sicher aufgefallen..EDIT: Und doch wieder ein Beitrag, um Krieg mit dir zu führen. Bei Nachdem ich den Firefox geöffnet habe, sehe ich auch zwei Download-Fenster, obwohl ich das gar nicht geöffnet habe.
(And the Misery goes on..)
-
Coole Idee @BugFix