Excel, bestimmte Tabelle einlesen

  • Ich habe eine Exceltabelle mit verschiedenen Arbeitsblättern. von A-Z und von a-z.

    Ich möchte beim Einlesen auf das jeweilige Arbeitsblatt verweisen.

    _ExcelSheetActivate($oExcel, "H") liest mir richtig das Arbeitsblatt H ein.

    _ExcelSheetActivate($oExcel, "h") sollte das Arbeitsblatt h einlesen, liest aber auch H ein.

    Wo liegt der Fehler, bin absoluter Anfänger in Autoit. :(

  • Liegt an der Funktion _ExcelSheetActivate. Die macht nur einen einfachen Vergleich mit "=" und der ist nicht case sensitive.
    Kopier die Funktion und schreib Dir eine neue, z.B:

    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _ExcelSheetActivateEx
    ; Description ...: Activate the specified sheet by string name (case sensitive) or by number.
    ; Syntax.........: _ExcelSheetActivateEx($oExcel, $vSheet)
    ; Parameters ....: $oExcel - An Excel object opened by a preceding call to _ExcelBookOpen() or _ExcelBookNew()
    ; $vSheet - The sheet to activate, either by string name or by number
    ; Return values .: Success - Returns 1
    ; Failure - Returns 0 and sets @error on errors:
    ; |@error=1 - Specified object does not exist
    ; |@error=2 - Specified sheet number does not exist
    ; |@error=3 - Specified sheet name does not exist
    ; Author ........: SEO <locodarwin at yahoo dot com>
    ; Modified.......: litlmike
    ; Remarks .......: None
    ; Related .......:
    ; Link ..........:
    ; Example .......: Yes
    ; ===============================================================================================================================
    Func _ExcelSheetActivateEx($oExcel, $vSheet)
    If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
    If IsNumber($vSheet) Then
    If $oExcel.ActiveWorkbook.Sheets.Count < $vSheet Then Return SetError(2, 0, 0)
    Else
    Local $fFound = 0
    Local $aSheetList = _ExcelSheetList($oExcel)
    For $xx = 1 To $aSheetList[0]
    If $aSheetList[$xx] == $vSheet Then $fFound = 1
    Next
    If Not $fFound Then Return SetError(3, 0, 0)
    EndIf
    $oExcel.ActiveWorkbook.Sheets($vSheet).Select()
    Return 1
    EndFunc ;==>_ExcelSheetActivateEx

    [/autoit]


    Der Unterschied ist nur diese Zeile die mit "==" nun eine strikte Prüfung (case sensitive) duchführt:

    [autoit]

    If $aSheetList[$xx] == $vSheet Then $fFound = 1

    [/autoit]
  • Danke erst mal für den Denkanstoss.

    Geht aber leider auch nicht. :(

    Bei _ExcelSheetActivateEx($oExcel, "H") macht er es richtig.
    Bei _ExcelSheetActivateEx($oExcel, "h") liest er ohne Fehlermeldung das 1.Arbeitsblatt, sprich A ein.

  • Was ist der Wert von @error nach dem Aufruf von _ExcelSheetActivateEx?

  • Wie gesagt ich bin Neuling. Es kommt keine Fehlermeldung.

    Hier mal das Script bisher. Will mich langsam rantasten: :)

    [autoit]


    ; ***************************************************************
    ; Beispiel 1 - Öffnet eine existierende Excel-Datei und gibt deren Objekt-ID zurück
    ; *****************************************************************

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

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

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

    $sFilePath1 = @ScriptDir & "\PassMassTabelle.xls" ; Diese Datei sollte bereits existieren

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

    $oExcel = _ExcelBookOpen($sFilePath1)
    $oExcel = _ExcelSheetActivateEx($oExcel, "h")

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

    If $error = 1 Then
    MsgBox(0, "Fehler!", "Das Excel-Objekt konnte nicht erstellt werden")
    Exit
    ElseIf $error = 2 Then
    MsgBox(0, "Fehler!", "Die Datei existiert nicht!")
    Exit
    EndIf

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

    $aArray = _ExcelReadSheetToArray($oExcel) ; Benutzt die vorgegebenen Parameter
    _ArrayDisplay($aArray)
    _ExcelBookClose($oExcel) ; Zum Abschluss verlassen wir das Programm

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

    Func _ExcelSheetActivateEx($oExcel, $vSheet)
    If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
    If IsNumber($vSheet) Then
    If $oExcel.ActiveWorkbook.Sheets.Count < $vSheet Then Return SetError(2, 0, 0)
    Else
    Local $fFound = 0
    Local $aSheetList = _ExcelSheetList($oExcel)
    For $xx = 1 To $aSheetList[0]
    If $aSheetList[$xx] == $vSheet Then $fFound = 1
    Next
    If Not $fFound Then Return SetError(3, 0, 0)
    EndIf
    $oExcel.ActiveWorkbook.Sheets($vSheet).Select()
    Return 1
    EndFunc ;==>_ExcelSheetActivateEx

    [/autoit]

    Im Anhang die Passmaßtabelle.

  • Kannst Du mal

    [autoit]

    $oExcel = _ExcelBookOpen($sFilePath1)
    $oExcel = _ExcelSheetActivateEx($oExcel, "h")

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

    If $error = 1 Then
    MsgBox(0, "Fehler!", "Das Excel-Objekt konnte nicht erstellt werden")
    Exit
    ElseIf $error = 2 Then
    MsgBox(0, "Fehler!", "Die Datei existiert nicht!")
    Exit
    EndIf

    [/autoit]

    durch diesen Code ersetzen

    [autoit]

    $oExcel = _ExcelBookOpen($sFilePath1)
    If $error Then Exit MsgBox(0, "Fehler!", "Das Excel-Objekt konnte nicht erstellt werden! @error = " & @error)
    $oExcel = _ExcelSheetActivateEx($oExcel, "h")
    If $error Then Exit MsgBox(0, "Fehler!", "_ExcelSheetActivate hat ein Problem! @error = " & @error)

    [/autoit]
  • Hab's grad mal durchgespielt.
    Dein Excel Workbook hat gar keine zwei gleich benannte WorkSheets ("H" und "h"). Das geht lt. Excel auch gar nicht (zumindest bei Excel 2010).
    Deine WorkSheets heissen "H" und "h_".
    D.h. es müsste auch mit der Standard Excel UDF funktionieren! Was es bei mir auch tut.