Meine _ExcelReadSheetToArray Lösung

  • Hallo
    da ich auch das Problem hatte das _ExcelReadSheetToArray nicht mit einer Deutschen Excel version geht
    habe ich eine Lösung Programmiert

    [autoit]

    Func _ExcelReadSheetToArray($oExcel, $iStartRow = 1, $iStartColumn = 1, $iRowCnt = 0, $iColCnt = 0, $iColShift = False)
    Local $avRET[1][2] = [[0, 0]] ; 2D return array

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

    ; Test inputs
    If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
    If $iStartRow < 1 Then Return SetError(2, 0, 0)
    If $iStartColumn < 1 Then Return SetError(2, 1, 0)
    If $iRowCnt < 0 Then Return SetError(3, 0, 0)
    If $iColCnt < 0 Then Return SetError(3, 1, 0)

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

    ; Get size of current sheet as R1C1 string
    ; Note: $xlCellTypeLastCell and $x1R1C1 are constants declared in ExcelCOM_UDF.au3
    Local $sLastCell = $oExcel.Application.Selection.SpecialCells($xlCellTypeLastCell).Address(True, True, $xlR1C1)
    ; Extract integer last row and col
    if $oExcel.Application.International(1)= 49 Then
    Local $iLastRow = StringInStr($sLastCell, "Z")
    Local $iLastColumn = StringInStr($sLastCell, "S")
    else
    Local $iLastRow = StringInStr($sLastCell, "R")
    Local $iLastColumn = StringInStr($sLastCell, "C")
    EndIf
    $iLastRow = Number(StringMid($sLastCell, $iLastRow + 1, $iLastColumn - $iLastRow - 1))
    $iLastColumn = Number(StringMid($sLastCell, $iLastColumn + 1))

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

    ; Return 0's if the sheet is blank
    if $oExcel.Application.International(1)= 49 Then
    If $sLastCell = "Z1S1" And $oExcel.Activesheet.Cells($iLastRow, $iLastColumn).Value = "" Then Return $avRET
    else
    If $sLastCell = "R1C1" And $oExcel.Activesheet.Cells($iLastRow, $iLastColumn).Value = "" Then Return $avRET
    EndIf

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

    ; Check input range is in bounds
    If $iStartRow > $iLastRow Then Return SetError(2, 0, 0)
    If $iStartColumn > $iLastColumn Then Return SetError(2, 1, 0)
    If $iStartRow + $iRowCnt - 1 > $iLastRow Then Return SetError(3, 0, 0)
    If $iStartColumn + $iColCnt - 1 > $iLastColumn Then Return SetError(3, 1, 0)

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

    ; Check for defaulted counts
    If $iRowCnt = 0 Then $iRowCnt = $iLastRow - $iStartRow + 1
    If $iColCnt = 0 Then $iColCnt = $iLastColumn - $iStartColumn + 1

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

    ; Size the return array
    ReDim $avRET[$iRowCnt + 1][$iColCnt + 1]
    $avRET[0][0] = $iRowCnt
    $avRET[0][1] = $iColCnt

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

    If $iColShift Then ;Added by litlmike
    ; Read data to array
    For $r = 1 To $iRowCnt
    For $c = 1 To $iColCnt
    $avRET[$r][$c - 1] = $oExcel.Activesheet.Cells($iStartRow + $r - 1, $iStartColumn + $c - 1).Value
    Next
    Next
    Else ;Default for $iColShift
    ; Read data to array
    For $r = 1 To $iRowCnt
    For $c = 1 To $iColCnt
    $avRET[$r][$c] = $oExcel.Activesheet.Cells($iStartRow + $r - 1, $iStartColumn + $c - 1).Value
    Next
    Next
    EndIf
    ;Return data
    Return $avRET
    EndFunc ;==>_ExcelReadSheetToArray

    [/autoit]


    der Code Basiert AutoIt Version: 3.2.3++, Excel.au3 v 1.5 (07/18/2008 @ 8:25am PST)

  • Funktioniert super bei mir und kann ich grad gut brauchen. :thumbup:

    _ExcelReadSheetToArray muss man umbenennen oder? Ist nämlich schon in der ExcelCOM_UDF.au3 definiert. Zumindest bekomme ich sonst eine enstsprechende Fehlermeldung.

  • Ich hatte das gleiche Problem und habe einfach die Datei Excel.au3 angepasst, dann geht es auch mit einer deutschen Excel Version. Dazu einfach den Schreibschutz der Excel.au3 entfernen, öffnen und folgendes ändern.
    Vorher:

    [autoit]


    Zeile 781 Local $iLastRow = StringInStr($sLastCell, "R")
    Zeile 782 Local $iLastColumn = StringInStr($sLastCell, "C")

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

    Nachher:

    [autoit]


    Zeile 781 Local $iLastRow = StringInStr($sLastCell, "Z")
    Zeile 782 Local $iLastColumn = StringInStr($sLastCell, "S")

    [/autoit]

    Also ganz simple.

    lg