Excel Zeilen einlesen und auf Array speichern

  • Hallo,
    ich versuche gerade aus einer existierenden Tabelle den Inhalt einer Spalte (30 Zeilen mit "Inhalt 1" usw.) auf ein Array zuschreiben.
    Dabei verwende ich natürlich UDFs. Jedoch bekomme ich einen Fehler der aus der Include Datei kommt.
    Ich poste mal Code und Error.

    [autoit]

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

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

    Global $ExcelArray[30]

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

    ;~ Dateipfad auf Variable speichern
    $Speicherort = @ScriptDir & "\37.xls"
    ;~Datei am Speicherort sichtbar und auch beschreibbar öffnen
    $oExcel = _ExcelBookOpen(""& $Speicherort,1,False)
    WinWaitActive("Microsoft Excel - 37.xls")
    $ExcelArray = _ExcelReadSheetToArray($oExcel,1,1,Default)
    _ExcelWriteArray($oExcel, 1, 2, ""& $ExcelArray)
    MsgBox(1,"Array",""& $ExcelArray)

    [/autoit]

    Als Error wird ausgegeben:
    Line 808 (File "C:\Program Files\Autoit\Include\Excel.au3")

    ReDim $avRET[$iRowCnt + 1][$iColCnt +1]
    ReDim $avRET[^ERROR

    ERROR: Array variable subscript badly formatted.

    Ist vielleicht die Include Datei kaputt? Oder liegt das an meinem Anfängerquelltext? ?(

    • Offizieller Beitrag

    Die Funktion "_ExcelReadSheetToArray" enthält eine Zeile, die auf englischsprachiges Excel gemünzt ist. Das muß man anpassen.
    Es ist die Zeile 795 des Includes.

    Falsch:

    [autoit]

    If $sLastCell = "R1C1" And $oExcel.Activesheet.Cells($iLastRow, $iLastColumn).Value = "" Then Return $avRET

    [/autoit]


    Richtig:

    [autoit]

    If $sLastCell = "Z1S1" And $oExcel.Activesheet.Cells($iLastRow, $iLastColumn).Value = "" Then Return $avRET

    [/autoit]
  • Ich hab jetzt mal den Unterschied (buchstabe Z und S) in der Include Datei geändert.
    Leider gibt es noch den selben Fehler. ;(

    • Offizieller Beitrag

    In der Funktion passiert folgendes:

    [autoit]

    If $iRowCnt = 0 Then $iRowCnt = $iLastRow - $iStartRow + 1

    [/autoit]


    Du übergibst keinen Wert für $iRowCnt, somit ist dieser standardmäßig = 0 und die obige If-Abfrage greift.
    Laut deiner Fehlermeldung enthält dein Array nicht das Element mit dem Index: $iRowCnt + 1
    Deine Tabelle ist also kleiner als dieser Wert. Anders ist das aus meiner sicht nicht erklärbar.

    Edit:

    ODER - Du hast noch eine ältere Version der UDF. Da mußt du noch zusätzlich folgende Änderung vornehmen.:

    [autoit]

    ; Extract integer last row and col
    Local $iLastRow = StringInStr($sLastCell, "Z");"R")
    Local $iLastColumn = StringInStr($sLastCell, "S");"C")

    [/autoit]
  • Ich hab mal die Zeile anhand des Kommentars gesucht und nur diese hier gefunden.
    Ist das die richtige?

    [autoit]

    ; Extract integer last row and col
    $sLastCell = StringRegExp($sLastCell, "\A[^0-9]*(\d+)[^0-9]*(\d+)\Z", 3)
    Local $iLastRow = $sLastCell[0]
    Local $iLastColumn = $sLastCell[1]

    [/autoit]

    Und wo muss ich das einfügen?

  • Könnte es daran liegen, das mit "Global $ExcelArray[30]" ein eindimensionales Array defniert wird mit 30 ähm ... Zeilen/Spalen/Rows/Was auch immer ....
    Und _ExcelReadSheetToArray liest das ganze Sheet ein als das was es ist ... eine Tabelle, ergo ein 2D-Array.
    Und evtl stehen ja mehr als 30 Spalten/Zeilen (nichtzutreffendes streichen) in der Tabelle ....
    Ich hoffe es ist ungefähr klar,was ich meine <.<[MSIE_newline_end ]
    Edith meint: Description ...: Create a 2D array from the rows/columns of the active worksheet.
    Versuchs mal mit _ExcelReadArray (Create an array from a row or column of the active worksheet.)[MSIE_newline_end ]