Excel.au3 _Excel_RangeRead maximale Textlänge?

  • Ich finde nirgendwo eine Angabe, wie viele Zeichen eine Zelle in Excel haben darf. Bei 360 Zeichen steigt _ReadExcel() bei mir aus. Grundsätzlich: gibt es irgendwo eine Stelle, wo solche Maxima beschrieben sind?

    :)

  • Ich finde nirgendwo eine Angabe, wie viele Zeichen eine Zelle in Excel haben darf.

    Etwas googlen könnte helfen ;), z.B. mittels Suchparameter Excel maximum cell length

    Erster Treffer : excel-specifications-and-limits

    Total number of characters that a cell can contain 32,767 characters

    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."

  • Diese Funktion ist mir unbekannt und die gibt es auch nicht in der Excel.au3... du meinst wohl _Excel_RangeRead?

    Stimmt, das war meine eigene Funktion die _Excel_RangeRead aufgerufen hat :S

    Und bevor du fragst:

    AutoIt3 Limits/defaults MAX_STRINGLEN 2,147,483,647 Maximum string length.

    AutoIt3 Limits/defaults hatte ich auch schon gefunden und gedacht, mit MAX_STRINGLEN 2,147,483,647 komme ich locker hin 8) Problem ist nur, dass in meiner Excel-Tabelle ein Eintrag mit 352 Zeichen war und _Excel_RangeRead abgestürzt ist - musste den Wert auf unter 256 kürzen (langen XPath durch kurzen ersetzt) . Daher mein Verdacht, dass beim Lesen von AutoIt aus Excel ein anderes Maximum gilt und daher die Frage, ob es irgendwo eine Liste gibt, die die Maxima für alle Funktionen bzw. zumindest Excel.au3 auflistet.

    :)

  • Ich kenne _ReadExcel() auch nicht. Aber an dem Phänomen, bin ich auch schon kläglich gescheitert. :D

    Genau wie du schreibst ist das Problem die (für neuere Office Versionen undokummentierte) Anzahl der Buchstaben pro Zelle, wenn du die COM Schnittstelle benutzt.

    Wenn man die (Standard) Excel UDF von Water benutzt, findet man aber auch recht schnell einen Hinweis https://www.autoitscript.com/wiki/Excel_UDF#Script_crashes

    Grüße autoiter

  • Auch im Helpfile findest Du die entsprechende Info:

    Function _Excel_RangeRead:

    The Excel transpose method doesn't support cells with more than 255 characters. Set $bForceFunc = True to bypass this limitation(s).

  • Problem ist nur, dass in meiner Excel-Tabelle ein Eintrag mit 352 Zeichen war und _Excel_RangeRead abgestürzt ist - musste den Wert auf unter 256 kürzen (langen XPath durch kurzen ersetzt) .

    Du meinst sicher, dein Script ist beim Ausführen der Funktion _Excel_RangeRead abgestürzt - dann vermute ich mal, dass du in deinem Script keinen COM-Error-Handler benutzt, der solche Fehler abfängt, denn dann könntest du den Fehlercode abfragen und wärs zumindest einen Schritt weiter. Beispiele dazu, wie man das macht, findest du in der AutoIt-Hilfe bei ObjEvent im Bsp. 1 und Bsp. 2.

  • Abhängig von der Excel Version kriegst Du einen COM-Error oder nicht.

    Das Problem ist, dass Excel einen Range im Format Spalte-Zeile zurückgibt, wir in einem Array aber Zeile-Spalte erwarten. Für diese Konvertierung verwendet _Excel_RangeRead die Excel-Methode Transpose. Die ist aber leider doof und kann (obwohl Excel mit bis zu 32.767 Zeichen pro Zelle umgehen kann) nur 255 Zeichen pro Zelle transponieren.
    Das Problem kann man umgehen, wenn man den _Excel_RangeRead-Parameter $bForceFunc = True setzt.
    Dann gelten nur mehr die AutoIt Limits für Arrays ;)

  • Ich habe das jetzt mal getestet...

    _Excel_RangeWrite kann Strings schreiben, die sogar deutlich länger als 32767 Zeichen sind, _Excel_RangeRead liefert zwar auch ein Ergebnis, wenn der String länger als 32767 Zeichen lang ist, dann werden jedoch nur die ersten 32767 Zeichen gelesen!

    So funktioniert es bei mir:

    _Excel_RangeRead - read a long string (MAX_STRINGLEN = 32767)

    Wie hoch das Limit der Stringlänge für _Excel_RangeRead ist, hängt einerseits von der Excel-Version ab und anderseits auch von dem verfügbaren Speicher.

    Einmal editiert, zuletzt von Bitnugger (12. Mai 2020 um 23:12)

  • Auch im Helpfile findest Du die entsprechende Info:

    Function _Excel_RangeRead:

    The Excel transpose method doesn't support cells with more than 255 characters. Set $bForceFunc = True to bypass this limitation(s).

    Da hatte mich das "transpose" in die Irre geführt. Bei transpose dachte ich an Transponieren also Zeilen und Spalten vertauschen und das mache ich ja nicht. Aber ich versuche jetzt das mit dem $bForceFunc = True. Wenn ich lese "Wenn mehr als 65535 Zellen transponiert werden, dann wird $bForceFunc automatisch von der Funktion auf True gesetzt." dann frage ich mich, warum der Wert nicht immer auf True ist. Wird aber sicher irgendeinen anderen negativen Einfluss haben!?

    Ich kenne _ReadExcel() auch nicht. Aber an dem Phänomen, bin ich auch schon kläglich gescheitert. :D

    _ReadExcel() = Funktion von mir, die _Excel_RangeRead() aufruft ^^

    :)

  • Warum $bForceFunc nicht immer auf True gesetzt ist? Aus Performance-Gründen. Die interne Excel-Methode Transpose ist natürlich schneller als eine AutoIt Funktion die Zeilen und Spalten vertauscht.
    Automatisch wird $bForceFunc bei mehr als 65536 Zellen verwendet, da sich dieser Wert sehr schnell erheben lässt und dann nur $bForceFunc = True nicht abstürzt.

    Um festzustellen, ob eine der Zellen > 255 Zeichen enthält müsse man jede prüfen und das dauert ewig bzw. ich glaube sogar, dass ich immer nur 255 Zeichen zurückkriege und somit nicht sicher sagen kann, ob eine Zelle > 255 Zeichen beinhaltet.

    Also: NIcht ganz einfach das Thema ;)

  • Bitnugger 12. Mai 2020 um 23:49

    Hat den Titel des Themas von „Excel.au3 _ReadExcel maximale Textlänge?“ zu „Excel.au3 _Excel_RangeRead maximale Textlänge?“ geändert.
  • Warum $bForceFunc nicht immer auf True gesetzt ist? Aus Performance-Gründen. Die interne Excel-Methode Transpose ist natürlich schneller als eine AutoIt Funktion die Zeilen und Spalten vertauscht.

    Also: NIcht ganz einfach das Thema ;)

    Habe ich noch nicht ganz verstanden:

    hat also doch was mit Zeile/Spalte vertauschen zu tun? Ich will nur einlesen, nicht Transponieren.

    Mit $bForceFunc = True funktioniert es und da meine Tabelle nicht sehr groß ist, merkt man auch keine Verzögerung.

    :)

  • Angenommen, Du hast im Excel folgende Daten:

    |1|2|

    |3|4|

    Dann kriegst Du ohne Transpose von Excel

    |3|1|

    |4|2|

    zurück. Also muss die von Excel zurückgegebene Tabelle transponiert werden. Entweder mit der Transpose-Funktion von Excel oder von der internen Funktion (durch $bForceFunc = True aktiviert).

  • Du sagst es ;)

  • Haha, danke Bitnugger

    und ich schwadroniere was von undokummentiert. :D

    Bitte schüttelt mich, wenn ich noch wirrer werde und irgendwas fasele wie Corona ist eine Erfindung, um die 5G-Toten zu verheimlichen.

    Grüße autoiter