Beiträge von tobius

    Muss leider nochmal nachhaken, da ich nicht auf die Lösung komme, wie ich die Strings der Variablen vergleichen kann.

    Angenommen ich kenne den Inhalt von $a - $e nicht, wie kann ich bitte prüfen, ob die Strings exakt übereinstimmen?

    Das Ergebnis des Codes unten ist 'gleich' ($e ist unterschiedlich). Ich verstehe nun zwar warum aber wie löse ich das bitte?

    Danke vorab.

    Code
    Global $a = 'a', $b = 'a', $c = 'a', $d = 'a', $e = 'bbb'
    
    If $a = $b = $c = $d = $e Then
        MsgBox(0,0,'gleich')
    Else
        MsgBox(0,0,'ungleich')
    EndIf

    Hi zusammen,

    ich stehe gerade auf dem Schlauch.

    Könnte mir bitte jemand sagen, warum der folgende Code "ungleich" ausgibt?

    Und wie muss ich das bitte umsetzen, wenn ich nur die Variablen untereinander (ohne 'Werte') vergleichen möchte?

    Besten Dank

    tobius



    Global $a = 'a'
    Global $b = 'a'
    Global $c = 'a'


    If $a == $b == $c Then
    MsgBox(0,0,'gleich')
    Else
    MsgBox(0,0,'ungleich')
    EndIf

    Hallo zusammen,


    ich würde gerne zwei mathematische Variablen folgendermaßen multiplizieren:


    Code
    Local $x = 2x
    Local $y = 3x
    
    
    $Ergebnis = $x*$y
    MsgBox(0, "", $Ergebnis)


    Als Ergebnis soll er mir für §Ergebnis den Wert 6x^2 (6x zum Quadrat) ausspucken.
    Geht das in Autoit bzw. kann mir jemand bitte einen Ansatz dazu nennen?


    Vielen Dank


    Grüße
    tobius

    Hallo Bugfix,


    vielen Dank für dein Beispiel und deine Erläuterungen, das hilft mir doch gleich enorm weiter.
    Super, dass man hier nach VBA-Codes schauen kann, ich hab bisher immer nach "Autoit" gesucht aber da findet man nicht so viel.
    Was meine Meinung nach auch noch hilft, wenn man mal nicht weiß welche Funktion man nehmen soll einfach die gewünschte Aktion mit dem Makro-Recorder in Excel aufzeichnen und anschließend die Funktion in der Objekt-Referenz nachschlagen.


    Danke für deine Hilfe ;)


    Beste Grüße
    tobius

    Hallo BugFix,


    vielen Dank für den Hinweis und deinen Code, funktioniert prima :)
    Sobald er von hinten beginnend in Spalte "A" einen Inhalt erkennt, löscht er alle darüberliegenden Leerzeilen.
    Nun kommt es in einigen meiner Excel-Dateien aber vor, dass in Spalte A erst später etwas steht obwohl in einer der anderen Spalten (B-J) schon früher Inhalt vorhanden ist (von hinten beginnend).
    Wie kann ich ihm sagen, dass er ab dem Zeitpunkt alle darüberliegenden Leerzeilen löschen soll, ab dem er von hinten beginnend das erste mal in einer der Spalten A-J Inhalt findet. Also sozusagen wie dein Code, nur dass die Spalte A mit den anderen Spalten "oder" verknüpft wird?
    Und da die Excel schon vorher offen ist suche ich schon die ganze Zeit, wie ich die Excel-Datei anspreche, anstatt zu öffnen mit

    $oExcel.Workbooks.Open($xls)


    Da fehlt mir noch der rote Faden, daher möcht ich mich nun auch näher mit den Excel Objekten beschäftigten.
    Bitte um Infos, Links etc. wie ich am besten die Syntax dazu lernen kann, wie bspw.:

    $oExcel.WorksheetFunction.CountA($oSheet.Range("A" & $zeile & ":G" & $zeile))

    Gibt es da ein empfehlenswertes Tutorial?
    In Autoit ist das ja recht einfach, da schaut man in die Funktionsreferenz bzw. UDF-Referenz und auf der rechten Seite ist schön beschrieben, was die Funktion macht. Schaut man sich die Funktion dann an, sind alle Parameter schön erklärt u. notfalls findet man unten noch ein oder mehrere Beispiele zum selber testen. Aber wie mach ich das bei diesen Excel Objekten?
    Bspw. möchte ich als nächstes alle Duplikate in meinen Excel-Dateien löschen, jetzt steh ich erstmal vor der folgenden Objekt-Referenzliste und hab keine Ahnung in welcher ich schauen muss:
    http://msdn.microsoft.com/en-us/library/ff846392.aspx


    Könnt ihr mir bitte Hinweise geben wie man da am Besten vorgeht? Oder gibt es eine Datenbank oder ähnliches in der man da schauen kann?


    Danke schon mal


    Grüße
    tobius

    Hallo liebe Coder,


    ich habe ein kleines Problem beim Löschen der (Zwischen-) Zeilen u. wär euch dankbar wenn Ihr mir hier behilflich sein könntet.


    Ich habe eine große Excel-Datei mit den Spalten A-J und ca. 100.000 Zeilen.
    Nun möchte ich über Autoit alle leeren Zeilen löschen, wobei eine Zeile nur dann leer ist, wenn sich in KEINER der Spalten ein Eintrag befindet, also A:x bis J:x leer sind.


    Mein Code funktioniert zwar, allerdings benötigt er für 800 Zeilen ca. 1 Minute, was bei 100.000 Zeilen über 2 Stunden wären.
    Die letzte Zeile erkenne ich momentan daran (siehe Code), dass nach dem letzten erkannten Inhalt 5 Leerzeilen folgen (da auch mal 3 Leerzeilen nacheinander vorkommen). Wie könnte man das eleganter lösen? Mein Code basiert auf der Excel UDF bin aber gerade eben darauf aufmerksam geworden, dass man es auch über die Excel Objekte (COM) lösen könnte, nur leider hab ich darin keine Erfahrungen. Weiß jemand wie man das realisieren könnte? Wenn möglich würd ich es gern ohne VBA lösen.


    Hier mein (umständlicher) Code. Beim Ausführen müsst ihr nur die $Excel_Pfad_Zieldatei anlegen :


    Danke vorab



    #include <Excel.au3>


    HotKeySet("{ESC}", "Terminate")
    Func Terminate()
    Exit 0
    EndFunc


    Global $Spalte_A = "A"
    Global $Spalte_B = "B"
    Global $Spalte_C = "C"
    Global $Spalte_D = "D"
    Global $Spalte_E = "E"
    Global $Spalte_F = "F"
    Global $Spalte_G = "G"
    Global $Spalte_H = "H"
    Global $Spalte_I = "I"
    Global $Spalte_J = "J"
    Global $Startzeile = 2


    Global $Excel_Pfad_Zieldatei = @ScriptDir & "\Extras\_Excel1.xlsx"
    Global $Sleep_nach_While = 100


    ; Excel-Zieldatei öffnen
    $oExcel = _Excel_Open()
    $oZieldatei = _Excel_BookOpen($oExcel, $Excel_Pfad_Zieldatei)


    ; Leerzeilen löschen
    While 1
    Sleep($Sleep_nach_While)
    ToolTip("Leere Zeilen werden gelöscht. Aktueller Fortschritt: Zeile "&$Startzeile)
    Local $Inhalt_A=_Excel_RangeRead($oZieldatei, Default, $Spalte_A&$Startzeile)
    If $Inhalt_A="" Then
    Local $Inhalt_B=_Excel_RangeRead($oZieldatei, Default, $Spalte_B&$Startzeile)
    If $Inhalt_B="" Then
    Local $Inhalt_C=_Excel_RangeRead($oZieldatei, Default, $Spalte_C&$Startzeile)
    If $Inhalt_C="" Then
    Local $Inhalt_D=_Excel_RangeRead($oZieldatei, Default, $Spalte_D&$Startzeile)
    If $Inhalt_D="" Then
    Local $Inhalt_E=_Excel_RangeRead($oZieldatei, Default, $Spalte_E&$Startzeile)
    If $Inhalt_E="" Then
    Local $Inhalt_F=_Excel_RangeRead($oZieldatei, Default, $Spalte_F&$Startzeile)
    If $Inhalt_F="" Then
    Local $Inhalt_G=_Excel_RangeRead($oZieldatei, Default, $Spalte_G&$Startzeile)
    If $Inhalt_G="" Then
    Local $Inhalt_H=_Excel_RangeRead($oZieldatei, Default, $Spalte_H&$Startzeile)
    If $Inhalt_H="" Then
    Local $Inhalt_I=_Excel_RangeRead($oZieldatei, Default, $Spalte_I&$Startzeile)
    If $Inhalt_I="" Then
    Local $Inhalt_J=_Excel_RangeRead($oZieldatei, Default, $Spalte_J&$Startzeile)
    If $Inhalt_J="" Then


    For $i = 1 To 5 Step 1


    If $i = 5 Then ExitLoop 2


    Local $Inhalt_A_darunter = _Excel_RangeRead($oZieldatei, Default, $Spalte_A&$Startzeile + $i)
    If $Inhalt_A_darunter<>"" Then ExitLoop
    Local $Inhalt_B_darunter = _Excel_RangeRead($oZieldatei, Default, $Spalte_B&$Startzeile + $i)
    If $Inhalt_B_darunter<>"" Then ExitLoop
    Local $Inhalt_C_darunter = _Excel_RangeRead($oZieldatei, Default, $Spalte_C&$Startzeile + $i)
    If $Inhalt_C_darunter<>"" Then ExitLoop
    Local $Inhalt_D_darunter = _Excel_RangeRead($oZieldatei, Default, $Spalte_D&$Startzeile + $i)
    If $Inhalt_D_darunter<>"" Then ExitLoop
    Local $Inhalt_E_darunter = _Excel_RangeRead($oZieldatei, Default, $Spalte_E&$Startzeile + $i)
    If $Inhalt_E_darunter<>"" Then ExitLoop
    Local $Inhalt_F_darunter = _Excel_RangeRead($oZieldatei, Default, $Spalte_F&$Startzeile + $i)
    If $Inhalt_F_darunter<>"" Then ExitLoop
    Local $Inhalt_G_darunter = _Excel_RangeRead($oZieldatei, Default, $Spalte_G&$Startzeile + $i)
    If $Inhalt_G_darunter<>"" Then ExitLoop
    Local $Inhalt_H_darunter = _Excel_RangeRead($oZieldatei, Default, $Spalte_H&$Startzeile + $i)
    If $Inhalt_H_darunter<>"" Then ExitLoop
    Local $Inhalt_I_darunter = _Excel_RangeRead($oZieldatei, Default, $Spalte_I&$Startzeile + $i)
    If $Inhalt_I_darunter<>"" Then ExitLoop
    Local $Inhalt_J_darunter = _Excel_RangeRead($oZieldatei, Default, $Spalte_J&$Startzeile + $i)
    If $Inhalt_J_darunter<>"" Then ExitLoop
    Next
    _Excel_RangeDelete($oZieldatei.Worksheets(1), $Startzeile&":"&$Startzeile)
    If @error Then MsgBox(0, "Fehler", "Fehler beim Löschen!")
    ContinueLoop


    EndIf
    EndIf
    EndIf
    EndIf
    EndIf
    EndIf
    EndIf
    EndIf
    EndIf
    EndIf


    $Startzeile = $Startzeile + 1


    WEnd



    Sorry für die Verspätung.
    Danke,
    PID und ProcessExists lassen sich auslesen, wäre super wenn ich das dafür
    einsetzen könnte.


    while processexists("x")
    Ändere "Farbe des Buttons" auf => z.B. grün ; was setz ich hier für "Farbe des Buttons" ein, gibts da eine Farbänderungsfunktion etc.?
    Sleep (5000)
    wend


    oder


    While 1
    If processexists("x") then
    Ändere "Farbe des Buttons" auf => z.B. grün (welche Funktion?)
    else
    Behalte Farbe => grau
    endif
    Sleep (5000)
    Wend

    Servus zusammen,


    ich arbeite derzeit an einer GUI mit mehreren Buttons, über die ich verschiedene Skripte starte.
    Die Skripte sollen mir am PC wiederholende Arbeitsaufgaben erleichtern, die ich immer wieder benötige (z.B. Einloggen in Email-Account, Auswertung meiner Rechnungen etc.).
    Manche dieser Skripte laufen versteckt im Hintergrund und das auch mal gerne bis zu 20 min lang, manche Skripte laufen auch parallel.


    Meine Frage:
    Gibt es die Möglichkeit sich optisch anzeigen zu lassen, welches Skript gerade aktiv ist? In der Taskleiste sieht man ja nur das/die Autoit-Symbol(e), weiß aber nicht, welches Skript gerade aktiv ist, zudem wird die Taskleiste bei mir immer wieder automatisch versteckt.
    Optimal wäre es, wenn sich die Farbe des jeweiligen Buttons in meiner GUI verändern würde, solange das Skript noch läuft.
    Wisst ihr wie man so etwas realisieren kann bzw. habt ihr eine andere Idee wie man sich das möglichst einfach anzeigen lassen kann (ohne eine Progress-Bar)?


    Vielen Dank
    tobius

    Hallo Opi, ich habe genau das gleiche Problem.
    Kannst du mir bitte sagen, wie du das über Winlist gelöst hast, also die Winlist vor dem Öffnen des Fensters ermittelst, die Winlist nach dem Öffnen des Fensters ermittelst und dann über die Differenz auf das Handle des geöffneten Fensters schließt ??


    Danke

    Ich habe noch einen weiteren Ansatz über Winlist, scheitere aber leider an der Umsetzung.
    Weiß jemand wie ich das Folgende in "Programmierschrift" bekomme?


    Ermittle zum Zeitpunkt x alle Fensterhandles über Winlist.
    Öffne Fenster 1
    Ermittle zum Zeitpunkt y alle Fensterhandles über Winlist.
    Vergleiche alle Fensterhandles zum Zeitpunkt y mit den Fensterhandles zum Zeitpunkt x, so dass Handle_Fenster1 = (Fensterhandles Zeitpunkt y - Fensterhandles Zeitpunkt x)


    Hier mal Code von Schnitzel (danke!) wie ich alle aktuellen Fensterhandles ausgebe (funktioniert soweit auch wunderbar):



    #include <Array.au3>
    Global $winlist, $sichtbareFenster[1]
    $winlist = WinList()


    For $i = 1 To $winlist[0][0]
    If IsVisible($winlist[$i][1]) Then
    _ArrayAdd($sichtbareFenster, $winlist[$i][1])
    $sichtbareFenster[0] = UBound($sichtbareFenster) - 1
    EndIf
    Next


    _ArrayDisplay($sichtbareFenster)



    Func IsVisible($handle)
    If BitAnd( WinGetState($handle), 2 ) Then
    Return 1
    Else
    Return 0
    EndIf
    EndFunc



    Danke vorab

    Ja stimmt, über Handles lassen sich die Fenster auch steuern.
    Entweder über Titel (gleich mit eigenem Namen) oder Handles.


    In beiden Fällen muss ich aber ja erstmal das Fenster erkennen, oder?
    Das Handle würde ich dann anhand "Size" auslesen, weil es sich bei jedem Programmstart ändert.


    Handle:

    $Handle_Fenster1 = Wingethandle("[W: 890; H: 470]")


    Titel:

    $Titel_Fenster1 = Winsettitle("[W: 890; H: 470]")


    .."leerer Titel" oder aktives Fenster könnte bestimmt auch gehen aber ist mir bißchen zu schwammig.


    Wenn ich jetzt aber das zweite Fenster öffne ist ein Ansteuern über "Size" sehr fehleranfällig, da beide Fenster die gleiche Größe haben.
    In den meisten Fällen nimmt er dann das zweite, aktive Fenster aber leider nicht immer.


    Somit kann ich wohl nur noch am Handle oder Titel unterscheiden, macht ja keinen Unterschied.


    Am Beispiel Handle:
    fürs erste Fenster = $Handle_Fenster1
    fürs zweite Fenster = "noch unbekannt"


    Zur Unterscheidung muss ich doch noch das Handle des zweiten Fenster über Wingethandle auslesen oder sehe ich das falsch?
    Welche Parameter nehme ich dann für die Funktion?


    Ich dachte eine sichere Lösung sei es, nun alle Fenster mit der Größe ("[W: 890; H: 470]") zu ermitteln, um dann das Handle des "noch unbekannten" (zweiten) Fensters zu ermitteln, indem ich das Handle des ersten Fensters $Handle_Fenster1 ausschließe.

    Danke für eure Rückmeldungen.
    @ PainTain: Dann bleibt nur noch der Fensterrahmen als Screenshot übrig ;)
    @ Make-Grafik:
    Die Fenster besitzen keine Controls und die Positionen beim Öffnen sind mehr oder weniger zufällig.
    Grafisch sind die Fenster exakt identisch, imagesearch/pixelsearch ist daher nicht möglich.
    Nur das Handle unterscheidet sich, alle anderen Infos sind identisch.


    Ich löse es jetzt folgendermaßen:
    Ich öffne das erste Fenster und identifiziere es über die Grüße (die ist immer gleich).
    Danach vergebe ich dem Fenster einen Titel und ändere die Größe.
    Wenn ich anschließend ein neues Fenster öffne kann ich es an der ursprünglichen Größe identifizieren (die Größe des ersten Fensters habe ich ja geändert).
    Dem zweiten Fenster vergebe ich dann wieder einen neuen Titel u. ändere auch hier die Größe.
    So mache ich das für alle Fenster. Am Ende ändere ich die veränderten Größen wieder in ihre Ursprungsgröße zurück (notwendig für den nächsten Programmstart, da anscheinend die Größe des letzten Fensters beibehalten wird) und steuere letztlich alle Fenster über ihren Titel.



    WinActivate("[W: 890; H: 470]")
    WinWaitActive("[W: 890; H: 470]", "", 1)
    WinSetTitle("[W: 890; H: 470]", "", "Fenster1")
    WinMove("Fenster1", "", "", "", 891, 471)
    ; Neues Fenster wird geöffnet
    WinActivate("[W: 890; H: 470]")
    WinWaitActive("[W: 890; H: 470]", "", 1)
    WinSetTitle("[W: 890; H: 470]", "", "Fenster2")
    WinMove("Fenster2", "", "", "", 891, 471)
    ; usw


    Vielen Dank für eure Unterstützung.

    Leider kann ich keinen Screenshot hier rein stellen (sonst hätt ich es direkt gemacht), da es sich um eine Software von der Arbeit handelt und die angezeigten Daten vertraulich sind und im Startfenster nicht ausgeblendet werden können.
    Es handelt sich um ein Tool zur Datenaufbereitung, mehr Infos wie oben beschrieben gibt das AU3-Info-Tool aber leider nicht her.
    Ich habe aber herausgefunden, dass ich einen Titel mittels WinSetTitle setzen kann, das bringt mich aber auch nicht wirklich weiter, oder?
    Falls noch jemand einen Ansatz hat wäre ich sehr dankbar.