Excel Datei auslesen und Daten kopieren.

  • Hallo zusammen :)

    vorweg gesagt, ich bin nicht gerade sehr Affin in Autoit und tue mich mit einigen Sachen recht schwer im verstehen bzw den zusammen hängen.

    Ich habe versucht weitestgehend alles mit Google und der Hilfe hin zu bekommen, nur leider hänge ich grade etwas fest.

    Mein Programm soll folgendes tun:


    In einer Excel Tabelle stehen Zahlen von Artikel Nummern. Zu jeder Artikel Nummer gibt es ein Bild was den auch den Namen der Artikel Nummer hat. Nun soll mein Programm eine Excel Tabelle auslesen, und mir die Bilder in ein vorher ausgewählten Ordner Kopieren.


    Bis jetzt sieht mein Script so aus:

    Spoiler anzeigen

    Ich gebe auch zu das ich viel einfach nur kopiert habe aus der Hilfe heraus, aber zumindest habe ich es auch (so denke ich zumindest) verstanden.

    Nur Stehe ich total auf dem Schlauch was das Kopieren angeht. Zur zeit Listet Autoit mit alles auf was in Spalte A drin ist in einem Eigenen msgbox. Nur müsste ich das ja als Variable speichern um es zu kopieren. Und das verstehe ich nicht wie ich jede einzelne spalte als Variable zum Kopieren speichern kann.

    Hoffe ihr könnt mir den weg erleuchten :D

  • Hallo lsc

    Das sind ja wirklich nur aneinandergefügte Beispiele. :D

    Funktioniert es denn? Siehst du am Ende ein Fenster, dass dir Die Inhalte deiner Excel-Datei anzeigt?

    Die Variable $aResult die du da hast, ist ein Array. Wenn du auf einzelne Werte zugreifen möchtest, musst du sie angeben, wie du sie da in dem Fenster siehst (Feld A1 wäre $aResult[0][0])

    Du kannst dieses Array in einer Schleife durchgehen. Schau dir dazu vielleicht auch noch die Hilfe an. Bsp. wenn die Nummern in der zweiten Spalte stehen:

    Code
    For $i = 0 To Ubound($aResult) - 1
        FileCopy($BilderPfadA & $aResult[$i][1] & ".png", $BilderPfadB & $aResult[$i][1] & ".png")
    Next

    Grüße autoiter

  • Hey Autoitler,

    Ja das script geht soweit er zeigt mir das auch an was drin steht. Ich verstehe diese Arrays nicht nicht. bzw dieses Ubound und wie ich das in eine schleife setzen soll. KAnnst du mir das vielleicht für dumme erklären :x

  • Hallo lsc !

    Es gibt bzgl. Arrays wirklich gute Tutorials, z.B. von BugFix :

    http://www.bug-fix.info/array_tut.htm

    Würde man jetzt isoliert UBound beantworten, dann kommt 10 min. garantiert die nächste Frage ;)

    Warum also das Rad mehrmals erfinden ?

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hey Musashi

    Ich habe mir die Anleitung gerade mal durch gelesen und bin nur halb schlauer als vorher :/ Ziemlich kompliziert für mich. Also UBound bedeutet schon mal (wenn ich das richtig verstanden habe) das er das Array weiter führt bis der letzte wert erreicht ist richtig ?

    Und so wie ich AutoItler verstanden habe, muss ich in meinem Falle mit 2 Dimensionen arbeiten. Halt so wie es mir im _ArrayDisplay auch angezeigt wird. Also in dem Falle Sieht der Code ja so aus:

    Code
    For $i = 0 To Ubound($aResult) - 1
        FileCopy($BilderPfadA & $aResult[$i][1] & ".jpg", $sFileSelectFolder & $aResult[$i][1] & ".jpg")

    Das bedeutet das [$i] die Elemente so lange weiter nach unten führt bis keine mehr da sind bzw das letzte erreicht ist. Und [1] bedeutet in dem Falle das er immer den Wert aus der Spalte 1 nehmen soll richtig soweit ?

    Ich bekomme dabei den Fehler "Array variable has incorrect number of subscripts or subscript dimension range exceeded."

  • Also UBound bedeutet schon mal (wenn ich das richtig verstanden habe) das er das Array weiter führt bis der letzte wert erreicht ist richtig ?

    UBound gibt dir die Größe des Arrays in der entsprechenden Dimension zurück, die du angibst.

    Wenn du den Fehler bekommst heißt das, dass dein Array kein 2D Array ist bzw. die 2. Dimension kleiner als 1 ist.

    Lass dir mal mit UBound($aResult, 2) in einer MsgBox oder in der Konsole die Größe davon ausgeben oder prüfe es in _ArrayDisplay händisch nach.

  • lsc

    Ja, du hast ein eindimensionales Array, weil du nur eine Spalte ausliest.

    Local $aResult = _Excel_RangeRead($oWorkbook, Default, $oWorkbook.ActiveSheet.Usedrange.Columns("A:A"), 2)

    Das hatte ich übersehen.

    Wenn du folgendes gemacht hättest, hättest du deine ganze Tabelle ausgelesen (davon bin ich ausgegangen).

    Local $aResult = _Excel_RangeRead($oWorkbook, Default, Default, 2)


    Das bedeutet das [$i] die Elemente so lange weiter nach unten führt bis keine mehr da sind bzw das letzte erreicht ist. Und [1] bedeutet in dem Falle das er immer den Wert aus der Spalte 1 nehmen soll richtig soweit ?

    Nein. Arrays sind nullbasiert (Also der erste Wert steht nicht in Feldnummer 1 sondern 0). Das Feld A1 aus Excel wäre bei einem zweidimensionalen Array $aResult das Element $aResult[0][0].

    Daher kommt auch der Fehler. Du versuchst Werte aus der Array(spalte) auszulesen, die es nicht gibt.

    Du kannst hier überall die zweite eckige Klammer löschen, da es ein eindimensionales Array ist. Also statt

    $aResult[$i][1] einfach $aResult[$i].

    Grüße autoiter

  • Ah okay ich glaube ich fange an Array zu verstehen. Danke für die Infos. Ich setz mich gleich direkt mal hin und Probier das. Versteh grade zumindest wo der Fehler lag. Vielen Dank für eure Geduld.


    PS: Ich sollte auch absenden drücken.. Hat super geklappt :) Habs dann noch etwas erweitert mit zip packen usw. Vielen Dank