Schleife Für Excel

  • Hallo Alle zusammen
    Ich habe folgendes Problem.

    Das ganze sollte mal ein Programm werden was mir in QWS System Duplikate sucht.
    Prinzip: Grundaten werden in eine Excel Datei eingetragen in A1 bis A Irgendwas.
    Er soll die Daten A1 nehmen in das QWS wechseln das Skript durchführen
    Werdend dessen werden neue Daten in die Zwischenablage kopiert
    Die er dann in B1 schreiben soll.


    Das Grundskript habe ich stehen ( hoffe ich)
    Ich habe nur leider keine Ahnung wie ich die schleife schreiben soll da
    Die Länge der A Spalte ja variabel ist und er nicht 100 leere spalten durchsuchen
    Soll.

    Also es sollte gehen: Daten in A1 lesen, dann Skript , dann Ergebnis in B1 eintragen
    Dann das ganze von vorne mit A2 ….. Eintragen in B2 und so weiter bis er in spalte A keine
    Daten mehr findet dann Ende.

    Ach ja vergesst das Skript in der Mitte das wird ausgetauscht gegen das QWS Skript
    Das war nur zum testen.

    Ich hoffe jemand kann mir hier weiter helfen.

    [autoit]

    #include <Excel.au3>

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $sFilePath1 = @ScriptDir & "\Test1.xls" ; Diese Datei sollte bereits existieren

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $oExcel = _ExcelBookOpen($sFilePath1)

    [/autoit][autoit][/autoit][autoit]

    $sCellValue = _ExcelReadCell($oExcel, 1, 1)

    [/autoit][autoit][/autoit][autoit]

    clipput($sCellValue)

    [/autoit][autoit][/autoit][autoit]

    ; das script wird noch ausgetauscht dann macht auch das _ExcelReadCell($oExcel, 1, 1) einen sinn

    [/autoit][autoit][/autoit][autoit]

    WinActivate ("a1.txt")
    WinWaitActive ("a1.txt")
    Sleep (1000)

    [/autoit][autoit][/autoit][autoit]

    Send("{LSHIFT down}")
    send ("{right 6}")
    Send("{LSHIFT up}")
    send ("^c")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    While Sleep(50)
    $sText = ClipGet()
    _ExcelWriteCell($oExcel, $sText, 1, 2)

    [/autoit][autoit][/autoit][autoit]

    Do
    Sleep(50)
    Until ClipGet() <> $sText

    [/autoit][autoit][/autoit][autoit]

    WEnd

    [/autoit]


    Danke

    Adamkaller

    Einmal editiert, zuletzt von Adamkaller (15. Oktober 2011 um 23:13)

  • Danke Bugfix
    Kann deinen Schritten folgen bekomme sie aber nicht in die Praxis umgesetzt.
    Wenn ich heute nochmal Error lesen muss springe ich aus dem Kellers Fenster.

    Muss ich das _ExcelReadCell($oExcel, 1, 1)
    Und _ExcelWriteCell($oExcel, $sText, 1, 2)

    Nicht auch irgend wie anpassen? Sonst schreibt er ja immer in

    A1 und B1 und geht nicht einen weiter.

    Langsam glaube ich das ich zu blöd dafür bin.

    Habe versucht ein praktisches Beispiel zu finden aber finde nichts
    Wirklich passendes.

    • Offizieller Beitrag

    Ist doch wirklich nur eine simple Schleife.
    Hier mal als Code, was ich in Worten beschrieben hatte.

    [autoit]

    #include <Excel.au3>
    $sPath = 'C:\test2.xls'
    $oExcel = _ExcelBookOpen($sPath)
    $iRow = 1
    While True
    $value = _ExcelReadCell($oExcel, "A" & $iRow)
    If $value = "" Then ExitLoop
    $return = _Funktion_Weiterbearbeitung($value) ; == von dieser Funktion den bearbeiteten Wert zurückgeben lassen
    _ExcelWriteCell($oExcel, $return, "B" & $iRow)
    $iRow += 1
    WEnd
    _ExcelBookClose($oExcel)

    [/autoit]
  • habe es jetzt versucht so um zu stetzen aber er stopt nach dem Kopieren der daten

    [autoit]


    #include <Excel.au3>
    $sPath = @ScriptDir & "\Test1.xls"

    [/autoit][autoit][/autoit][autoit]

    $oExcel = _ExcelBookOpen($sPath)

    [/autoit][autoit][/autoit][autoit]

    $iRow = 1

    [/autoit][autoit][/autoit][autoit]

    While True
    $value = _ExcelReadCell($oExcel, "A" & $iRow)
    clipput($Value)
    $return = ($value)
    WinActivate ("a1.txt")
    WinWaitActive ("a1.txt")
    Sleep (1000)

    [/autoit][autoit][/autoit][autoit]

    Send("{LSHIFT down}")
    send ("{right 6}")
    Send("{LSHIFT up}")
    send ("^c") ; nach dem ist ende
    $return = ($value)
    _ExcelWriteCell($oExcel, $return, "B" & $iRow)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    If $value = "" Then ExitLoop

    [/autoit][autoit][/autoit][autoit]

    $iRow += 1
    WEnd
    _ExcelBookClose($oExcel)

    [/autoit]
  • Bugfix ist liebgemeint aber mach dir mal heute keinen stress mehr deswegen.

    ich denke das ich heute einfach lernresistent.

    werde die tage nochmal drüber schauen.

    Habe morgen Hochzeitstag da gibt das nichts.

    Danke

    Adamkaller

    • Offizieller Beitrag

    Was war an meinem Skript so mißverständlich?!
    Lagere bitte die Bearbeitung in eine Funktion aus, sonst verlierst du die Übersicht, und schlecht zu Lesen ist der Code auch.
    Außerdem hast du dadurch auch die Abfrage ob die Zelle leer ist hinter den Bearbeitungsteil verschoben, was zur Fehlfunktion deines Skriptes führt.

  • Sorry Bugfix

    Ich bin mir sicher das dein script 100% richtig ist.

    Ich habe nur leider heute keine ruhe mich da drauf zu konzentrieren.

    Habe 2 Gruppen Handwerker hier gehabt die denn ganzentag mit Bohrer und Presslufthammer
    am arbeiten sind.. Des weitren habe ich 2 Töchter die heute eine pyjamaparty party mit jeweils
    7 freundinenn hier feiern das heist hier rennen mir 16 blagen um die ohren die einen lärm machen wie
    eine Fußballmanschaft und in all dem Trubel Plane ich noch meinen Hochzeitstag morgen.

    Das kan nichts geben.

    Gruß adamkaller

  • tja das kommt wenn man feuchte wände im keller hat. Die kinder wollen auch ihren spaß da kann ich auch nicht nein sagen.
    2 süße mädchen die auch noch wissen das sie süß sind und papa um denn finger drehen können.
    und mit dem Hochzeitstag da habe ich mal an irgend einer stelle ja gesagt und nunhänge ich in der While 1^^

    Also nicht böse sein wenn ich es heute nicht mehr auf die reihe kriege hatte nur gehofft es montag mitnehmen zu können
    um es zu testen aber das verschiebe ich dann.

    Gruß

    Adam

    • Offizieller Beitrag

    Na gut, ich habs dir mal in den Code eingepaßt. Hoffe, dass ich deine Beschreibung richtig interpretiert habe.

    [autoit]

    #include <Excel.au3>
    $sPath = @ScriptDir & "\Test1.xls"
    $oExcel = _ExcelBookOpen($sPath, 0) ; == Visible auf '0', Excel bleibt im Hintergrund
    $iRow = 1

    [/autoit][autoit][/autoit][autoit]

    While True
    $value = _ExcelReadCell($oExcel, "A" & $iRow)
    If $value = "" Then ExitLoop
    $return = _Data($value) ; == Aufruf der Verarbeitungsfunktion, Verarbeitungswert auffangen
    _ExcelWriteCell($oExcel, $return, "B" & $iRow)
    $iRow += 1
    WEnd
    _ExcelBookClose($oExcel)

    [/autoit][autoit][/autoit][autoit]

    Func _Data($value)
    ClipPut($value) ; == Deine Anwendung braucht den Wert zum Arbeiten in der Zwischenablage?
    WinActivate ("a1.txt")
    WinWaitActive ("a1.txt")
    Sleep (1000) ; == in dem Zeitraum wird der Wert aus der Zwischenablage verarbeitet
    Send("{LSHIFT down}")
    send ("{right 6}")
    Send("{LSHIFT up}") ; == das Ergebnis der Verarbeitung wird markiert
    send ("^c") ; == und in die Zwischenablage kopiert
    Return ClipGet() ; == Inhalt der Zwischenablage wird als Ergebnis zum Zurückschreiben zurückgegeben
    EndFunc

    [/autoit]


    Aber reicht es, wenn der Wert in der Zwischenablage ist? Muß er nicht in das andere Programm eingefügt werden?

  • Meister !!!!

    das ist ja der Hammer.

    das ganze Excel beschreiben läuft im hintergund? ist ja Geil. ( entschuldige die wort wahl )

    Werde das ganze noch versuche morgen in eine GUI zu packen und mit einem
    status balken zu versehen dann sollte es fertig sein.


    ich danke die 1000 mal

    Gruß

    Adam