Ecxel + Array

  • Hallo Leute erstmal

    Beschäftige mic seit kurzem mit Autoit und hätte eine Frage

    Spoiler anzeigen


    #include <Array.au3>
    #include <MsgBoxConstants.au3>
    #include <Excel.au3>
    #Include <File.au3>


    Local $aRecords
    If Not _FileReadToArray("C:\Users\dd\Desktop\Array\1.txt",$aRecords) Then
    MsgBox(4096,"Fehler", "Fehler beim einlesen der Daten.")
    Exit
    EndIf
    For $x = 1 To $aRecords[0]
    ; MsgBox(0, "", "Array eingelesen")
    Next


    Local $oExcel = _Excel_Open()
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "_Excel_Open Error", "Error creating the Excel application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    Local $oWorkbook = _Excel_BookOpen($oExcel, "C:\Users\dd\Desktop\" & "\test.xls"); Exceldatei öffnen
    If @error Then
    MsgBox($MB_SYSTEMMODAL, "Reading of Excel File Failed", "Error opening workbook" & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    _Excel_Close($oExcel)
    Exit
    EndIf


    Local $aArray[4] = ["", "", ""]
    _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aRecords, "A1")

    Versuche vergebens ein Array ins Excel zu Bringen klappt auch aber nur bedingt.
    Die txt.Datei hat ca 100 Einträge nur Zahlen.

    Ich habe aber 101 Einträge in der Excel Tabelle und das auch nicht in der richtigen Reihenfolge
    ich würde gerne nur die letzten 4 Zeilen ins Excel bringe aber keine Ahnung wie.
    Vielleicht kann ja jemand kurz drüberschauen und eine wenig helfen.

  • Hallo @Snow12,

    Ich denke, entweder füllst du die Einträge, die du in die Exceldatei schreiben möchtest in ein neues Array und setzt das dann anstelle von $aRecords in den _Excel_RangeWrite-Aufruf (dafür war dein Local $aArray[4] gesacht, oder?), oder du schreibst in Schleife die einzelnen Strings aus $aRecords in die Liste.

    So habe ich das mal gemacht.

    AutoIt
    Local $iRow = 1 ; Deine Startzeile
    
    
    For $i = $aRecords[0] - 4 To $aRecords[0] ; vom viertletzten bis zum letzten Eintrag.
    _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aRecords[$i], "A" & $iRow) ; Im ersten Durchlauf wird $aRecords[viertletzter Wert] in Spalte A Zeile 1 geschrieben.
    $iRow += 1 ; Für den nächsten Durchlauf, wird die Variable $iRow um 1 erhöht, damit immer in die nächste Spalte geschrieben wird.
    Next

    Grüße autoiter

  • Hallo Herr autoiter

    Sie haben mir sehr weitergeholfen, 2 Sachen sind mir noch ein wenig unklar.
    If Not _FileReadToArray("C:\Users\dd\Desktop\Array\1.txt",$aRecords) Then
    hatte Versucht "*.txt" in Array einzulesen da meine txt Dateien immer anders heissen bekomme aber immer eine Fehlermeldung.

    und die 2 Sache ist es möglich die letzten 4 Werte zu "Spiegeln" d.h also der letzte Wert in A1, vorletzter A2, usw....

    und wenn ich den 5 Wert in die Spalte B bringen möchte muss ich diese Zeile
    _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aRecords[$i], "B" & $iRow)
    so nochmal eingeben?
    Oder einfacher gesagt kann man jeden Wert speziell zuweisen.

    mfg
    Snow12


  • Hallo Herr autoiter

    Sie haben mir sehr weitergeholfen,

    Hallo @Snow12
    Das ist wirklich witzig! :D

    Ja, wir kennen uns nicht. Dennoch pflegt man in Foren gemeinhin die persönlichere Anrede du. (Und dann auch noch Herr autoiter :D ). In diesem Umfeld, solltest du das nicht als Unhöflichkeit empfinden.

    If Not _FileReadToArray("C:\Users\dd\Desktop\Array\1.txt",$aRecords) Then

    Hier gibt es sicher viele Wege, wie du an die aktuellen Dateinamen kommst. Sind es viele Dateien, die auf einmal verarbeitet werden sollen, böte sich _FileListToArray oder _FileListToArrayRec an. Wenn du immer eine Datei auswählen möchtest, ist FileOpenDialog die Wahl. Im Zweifel musst du konkreter werden.
    Schau dir das Beispiel in der Hilfe dazu an. Benutzt du eine IDE wie SciTE? Weißt du wie man dort die Hilfe aufruft und die Beispiele direkt ausführt?

    und die 2 Sache ist es möglich die letzten 4 Werte zu "Spiegeln" d.h also der letzte Wert in A1, vorletzter A2, usw....

    Das ist kein Problem. Du kannst in der For.. To-Schleife auch rückwerts zählen. Bei dem aktuellen Beispiel wäre das einfach so:

    AutoIt
    Local $iRow = 1 ; Deine Startzeile
    For $i = $aRecords[0] To $aRecords[0] - 4 Step -1; vom letzten bis zum viertletzten Eintrag rückwärts gehen.
    _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aRecords[$i], "A" & $iRow) ; Im ersten Durchlauf wird $aRecords[viertletzter Wert] in Spalte A Zeile 1 geschrieben.
    $iRow += 1 ; Für den nächsten Durchlauf, wird die Variable $iRow um 1 erhöht, damit immer in die nächste Spalte geschrieben wird.
    Next

    Die Änderung ist in Zeile 2. Du gibst ja immer an, von welchem Wert bis welchen Wert $i Schleifendurchläufe stattfinden sollen. Beim Rückwerts-Zählen musst du nur Step zwingend angeben. Schau dir dazu auch die Hilfe an.


    und wenn ich den 5 Wert in die Spalte B bringen möchte muss ich diese Zeile
    _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aRecords[$i], "B" & $iRow)
    so nochmal eingeben?
    Oder einfacher gesagt kann man jeden Wert speziell zuweisen.

    Du siehst ja in meinem Beispiel, dass ich "A1" durch "A" & $iRow ersetzt habe. Das gleiche kannst du auch mit dem Buchstaben machen. Du kannst also vor dem Einfügen jedem Array-Eintrag eine Position zuweisen und die als Variable bei _Excel_RangeWrite mitgeben.

    Am einfachsten wäre es wahrscheinlich, wenn du ein Array so aufbaust, wie es in die Exceldatei soll. Dann wählst du nur deinen Startpunkt etwa A1 und fügst ganz ohne Schleife das ganze Array ein, wie in deinem Code auch (nur eben mit einem Array das genau die Inhalte hat, die du willst).

    Grüße autoiter

  • Hi autoiter

    O.K mit "du" wird geschrieben kenn es halt anders.


    Das mit den Txt Problem konnte ich dank deiner Hilfe so lösen

    Local $aRecords
    $sSourcePath = "C:\Users\dd\Desktop\Array\"
    $aFilesInFolder = _FileListToArray($sSourcePath, "*.txt" )
    For $i = 1 To $aFilesInFolder[0]
    If Not _FileReadToArray($sSourcePath & $aFilesInFolder[$i],$aRecords) Then
    MsgBox(4096,"Fehler", "Fehler beim einlesen der Daten.")
    Exit
    EndIf

    aber 5. Wert in Spalte B hab ich so versucht

    Local $iRow = 1 ; Deine Startzeile
    For $i = $aRecords[0] To $aRecords[0] - 3 Step -1; vom letzten bis zum viertletzten Eintrag rückwärts gehen.
    For $ii = $aRecords[0] To $aRecords[0] - 1 Step -1; vom letzten bis zum viertletzten Eintrag rückwärts gehen.
    _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aRecords[$i], "A" & $iRow) ; Im ersten Durchlauf wird $aRecords[viertletzter Wert] in Spalte A Zeile 1 geschrieben.
    _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aRecords[$ii], "B" & $iRow) ; Im ersten Durchlauf wird $aRecords[viertletzter Wert] in Spalte A Zeile 1 geschrieben.


    $iRow += 1 ; Für den nächsten Durchlauf, wird die Variable $iRow um 1 erhöht, damit immer in die nächste Spalte geschrieben wird.
    Next
    Next

    Nur hab ich jetzt überall doppelte Einträge

  • Hallo @Snow12,

    versuch mal deinen Code in ein Codefeld zu packen. Das sieht besser aus und andere erkennen besser den Code, da es eine AutoIt Code-Hervorhebung gibt.
    Das ist bei einem neuen Beitrag oder dem Bearbeiten eines Beitrags in der Toolbar über dem Beitrag zu finden. (sieht so aus </> anklicken, den Code hinein kopieren und AutoIt als Hervorhebung wählen).

    Das Problem ist, dass du die zweite Schleife in der ersten hast. Das heißt für jeden Durchlauf von Schleife 1 führst du auch die zweite aus. Dabei wird $iRow hochgezählt und du hast in B dann natürlich den einfach gewünschten Eintrag in jeder Zeile, deren Wert $iRow angenommen hat.

    Grüße autoiter