Script für Datenübertragung in Excel ! WICHTIG plz help (:

  • hey leute, hab mich gerad mal im forum angemeldet, hab es bei google stöberei gefunden..

    also ich habe im august ne ausbildung zum fisi angefangen :) ..und seit ca. 2 wochen kenne ich AutoIT, mein chef hats mir vorgstellt hat gesgt ich soll mich da einlernen weils wirklich geil ist, und das ist es auch ;)

    hab schon paar sachen gescripted, zum üben usw, gestern habe ich ein script geschrieben mit tastensimulierung wie ich daten von einer excel tabelle per copy & paste und alt+tab bildswitch in eine sql datentabelle übertrage. ziemlich cool wie von geisterhand ;)


    so und JETZT zum wesentlichen! mein chef hat mir die aufgabe gegeben, 2 excel tabellen zu erstellen. eine in der was drin steht.. paar zeilen/spalten, und eine leere. die daten sollen aus der 1. tabelle in die 2. tabelle mit autoIT alle automatisch übertragen werden, wie ich das hinkriegen könnte, das krieg ich hin, aber er möchte das ich das mit schleifen erledige. ere sagt als tipp ich bräuchte 2 schleifen (while glaub ich)...die äußere schleife ist für spalten, und die innere für zeilen, d.h. das programm soll jede zeile einzeln auslesen und in die andere tabelle kopieren, wenn die zeile fertig ist sprich autoit merkt im nächsten feld ist leer soll er in die nächste zeile springen. also das es von links nach rechts wie als wenn man ein buch lesen würde abarbeitet.

    nur was schleifen betrifft, ist mein script-anfänger latein schon fast am ende, könnt ihr mir nen kleinen code basteln, wie das aussehen müsste, oder wie ich vorzugehen habe?? wäre seehr cool wenn ihr mir schnell antworten könnt, bis ca. 17:00 uhr heut nachmittag wollt ich schon was vorgestellt haben ;)

    mfg und danke im vorraus, slydon!

    Einmal editiert, zuletzt von sLydon (30. September 2009 um 17:19)

  • Schau dir mal die Excel UDF an. Damit kannst du mit Indexen die Zeile und Spalte definieren. Mit 2 Schleifen meint er vermutlich so etwas. (PSEUDOCODE)

    Code
    For $i = 1 To 50 //Das ist die Schleife für die Zeilen
    For $x = 1 To 10 //Das ist die Schleife für die Spalten
    $wert = holeinformationvonzelle($exceldokument1, $i, $x) //$i = Zeilennummer, $x = Spaltennummer
    schreibeinformationinzelle($exceldokument2, $wert, $i, $x)
    Next
    Next

    Mehr verrate ich an dieser Stelle mal nicht es ist ein Denkanstoss ;) Mit der Hilfe (schau dir einfach mal die _Excel Befehle an und die Beispiele dazu) wirst du wohl weiterkommen :)

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • vielen dank für die schnelle hilfe!

    nur bei dem code bzw der for-schleife ist das problem, das du die zeilen angabe machen musst.. aber er soll ja aus der schleife aussteigen und das programm beenden wenn er selber merkt oh in dem feld is nixmehr drin, alle daten fertig. also ohne zeilen/spalte vorgabe aussteigen wenns leer ist.

    vielleicht iwas mit clipget()>0 ? weil ich kopiere ja jedes feld und übertrage es in das neue, und wenn im feld nixmehr ist steigt er aus.. das würd ich schon irgendwie hinkriegen.

    nur wichtig ist halt mit diesen 2 schleifen..

  • Nein,

    mit der ersten Funktion bekommst du doch den Inhalt der Zelle (verabschiede dich mal gedanklich von der Zwischenablage und Mouseclicks etc. AutoIt kann das auch besser ;))
    Den Inhalt kannst du ganz einfach überprüfen
    Wenn $wert = "" Dann

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • also ich hab deine funktion jetzt einfach mal dazu gebaut zum rumprobieren, und bin ja noch nicht so der kenner. bis jetzt sieht er so aus, nur wie gehts weiter^^?

  • Ich sagte doch verabschiede dich davon das alles sichtbar gemacht werden muss ;)
    Aus der Hilfe zu dem Befehl: _ExcelReadCell

    [autoit]

    ; ***************************************************************
    ; Example 1 - Write to a Cell after opening a workbook and returning its object identifier. Read the cell, then Save and Close file.
    ; *****************************************************************

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

    #include <Excel.au3>

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

    Local $oExcel = _ExcelBookNew() ;Create new book, make it visible

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

    _ExcelWriteCell($oExcel, "I Wrote to This Cell", 1, 1) ;Write to the Cell
    $sCellValue = _ExcelReadCell($oExcel, 1, 1)
    MsgBox(0, "", "The Cell Value is: " & @CRLF & $sCellValue, 2)

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

    MsgBox(0, "Exiting", "Press OK to Save File and Exit")
    _ExcelBookSaveAs($oExcel, @TempDir & "\Temp.xls", "xls", 0, 1) ; Now we save it into the temp directory; overwrite existing file if necessary
    _ExcelBookClose($oExcel) ; And finally we close out

    [/autoit]

    Kopiere mal diesen Quellcode und begreife wie er funktioniert ;)

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • okay das ist ja eigentlich ziemlich simple.

    neue tabelle erstellen,

    neue zeile erstellen/schreiben,

    variable für die zeile definieren,

    zeile auslesen & mit msg box bekannt geben,

    msgbox abfrage zum schließen btw. speichern,

    am angegeben ort speichern und schließen.

    okay das heißt damit müsste ich vorher erst gar keine tabellen erstellen, er macht eine selber, schreibts selber rein was ich ihm sage, danach speichert er es in einer neuen oder anderen tabelle ^^


    ..aber wie benutz ich das jetzt zu meinem thema zurück?

    weil eig möchte mein chefe ja das man sehen kann wie die zeilen von links nach rechts abgelesen, bzw in die andere leere tabelle kopiert werden, und wenn nen leeres feld kommt also alles kopiert wurde die schleife "aussteigt" und das prog beendet.

    also exitloop

    alt+f4 ^^

    ..ich werd zwar auch eins mit deiner variante machen, um ihm zu zeigen wies auch anders geht, nur ersmtal so, mit den 2 schleifen.. kannst mir da noch sagen wie ich das hinkriegen könnt?

    danke für deine hilfe!

  • Wieso will er es sehen??? :( Dies ist eine deutlich bessere Methode ;)
    Egal also hier mal die befehle die du alle brauchst:

    [autoit]

    _ExcelBookOpen
    _ExcelBookNew ;kommt drauf an ;)
    _ExcelReadCell
    _ExcelWriteCell
    _ExcelBookSaveAs
    While / WEnd
    Exitloop
    If Then Else EndIf
    MsgBox ;braucht man aber nicht unbedingt ;)

    [/autoit]

    So jetzt versuche mal mit diesen Befehlen und dem Pseudocode den ich oben hingeschrieben hatte ein Script zu programmieren was aus dem einen Exceldokument liest und in das andere schreibt :)
    Du bist ja hier zum lernen und verstehen und nicht um dir irgendwelchen Code vorkauen zu lassen :D

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • mit dem befehlen die du gerad gepostet hast das ist ja nicht so schwer das krieg ich hin :)

    ich mach jetzt erstmal meins fertig und danach mach ichs mal nach deinem prinzip.

    ty

  • ist ne aufgabe von meinem chef, lernen damit umzugehen ;)

    @ FireFlyer

    hier mal mein aktueller quellcode:

    so klappt das halt nicht wie ichs möchte =(

    bitte hilft mir jmd. so das es mit 2 schleifen ist, er geht dann zeile für zeile durch und hört auf wenn in der nächsten zelle nichts mehr steht, sprich die zelle leer ist..

  • Aber warum denn so? :/
    Eigentlich sollte es doch im Interesse deines Chefs sein wenn du einen möglichst einfachen Code machst ;)
    Mit meinem Beispiel kannst du das auch sichtbar erledigen (wenn es unbedingt sein muss) aber Sends etc. sind meist die schlechteste Wahl ;)

    Warum dein Code nicht funktioniert kann ich dir nicht sagen da ich grade keinen windowsrechner um mich habe und auch kein wine mit excel...

    @xeno: naja du weisst ja nicht zur Strafe, nur zur Übung :D

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Hi,

    schau in der Hilfe.
    Dein Ablauf:
    1) Öffne Quellexcel und weise es einer Variablen zu-> _ExcelOpen
    2) Erzeuge neues Excelsheet und weise einer neuen Variablen zu -> _ExcelBookNew
    Exemplarisch für 50 Zeilen und Spalten
    3) 1. Schleife für Zeilen: For $i=1 to 50
    4) 2. Schleife für Spalten: For $k=1 to 50
    In der Schleife 2:
    4a) Lies Quell Zelle aus und weise es einer Variablen zu: _ExcelReadCell
    4b) Wenn Variable leer, dann Ausstieg aus For Schleife -> ExitLoop
    Wenn nicht, schreib Variable in Zielzelle -> _ExcelWriteCell
    5) Beide Schleifen voll abgearbeitet -> Schliesse Quell Excel -> _ExcelClose
    6) Speichere Ziel Excel unter einem Namen ab: _ExcelBookSaveAs
    7) Schliesse Ziel Excel.

    Fang an zu programmieren. Schau Dir die Funktionen und die Definitionen für _Excel* Funktionen, For...Next Schleifen und If Bedingungen an.
    Bei Problemen poste Code und Dir wird weitergeholfen.

    ;-))
    Stefan

  • danke stefan son "tutorial" hab ich gebraucht..

    nach den punkten werde ich jetzt vorgehen, nur wie schreibe ich im code `

    Wenn Variable leer, dann Ausstieg aus For Schleife -> ExitLoop ??

    if $zelle ?!?!?!? Then

    ExitLoop

    ?!?!

    also wie muss das aussehen?

  • ist ne aufgabe von meinem chef, lernen damit umzugehen ;)


    Meistens ist es klug sich nach den Wünschen des Chefs zu richten - hier erscheint es allerdings ziemlich unsinnig.
    "Send", "Mouseclick" usw. ist fast immer nicht die beste Wahl (eher der Notnagel wenn gar nichts anderes geht), darum kann man den Lerneffekt bei solchen Übungen getrost vernachlässigen.
    Ich hoffe dein Chef programmiert selbst nicht so? :D

    Wie wärs du erstellst eine Lösung mit der Excel UDF und schickst deinen Chef im Zweifelsfall hier vorbei? ;)

  • hey leute,ich hab jetzt begriffen das das mit dem send zeugs schmarn ist ;)

    habs versucht nach dem tutorial, bin auch "relativ" weit...

    also die neue tabelle wird auch in dem angegebenen ordner gespeichert, jedoch ohne inhalt..also scheint irgendwas mit dem read/write usw nicht zustimmen, naja hier der quelltext ihr wisst wo der fehler liegt ;)


  • Hi,

    siehst Du. Ein guter Schritt vorwärts:

    Deine Excel Befehle müssen nur noch der Schleife angepasst werden und die richtigen Excelsheets auslesen und schreiben:

    [autoit]

    #include <Excel.au3>
    ;Quelle öffnen
    ;$open = ShellExecute("L:\Praktikant\Krenz_Fabian\autoIT\hardware.xls")
    ;Du brauchst ein ExcelObjekt:
    $open = _ExcelBookOpen ("L:\Praktikant\Krenz_Fabian\autoIT\hardware.xls")
    Local $new = _ExcelBookNew() ;neue Tabelle öffnen/erstellen

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

    ;1. Schleife
    for $i=1 to 50
    ;2. Schleife
    for $j=1 to 50
    $zelle = _ExcelReadCell($open, $i, $j)
    If $zelle = "" Then
    ExitLoop
    Else
    _ExcelWriteCell($new, $zelle, $i, $j)
    Endif
    Next
    Next
    _ExcelBookSaveAs($new, "L:\Praktikant\Krenz_Fabian\autoIT\neueTabelle.xls", "xls", 0, 1)
    _ExcelBookClose($open)
    _ExcelBookClose ($new)

    [/autoit]

    ;-))
    Stefan

  • wahnsinn ist das krass :)


    meine 1. fertigstellung von diesem programm brauch über ne minute bis alles rüber kopiert und gesppeichert ist, außerdem muss man paar buttons drücken..


    nud hier..einfacher und blitzschnell ;)


    mein chef kannte das natürlich, ich muss mir das größenteils selber erarbeiten, "dadurch lerne ich besser", aber stimmt ja auch ;)


    vielen danke für den supoort, bis demnächst, hab bestimmt noch oft fragen ;)


    bb