_Excel_RangeRead, _ArrayDisplay; Daten im Skript verwenden; Schleife mit Array

  • Hi Leute,

    0. kann ich die Daten dieses langen Display Arrays als Schleife in einem Skript verwenden? Bspw. , das bei Schleife 3, das Skript auf die Datenreihe Col 3 zugreift, entweder send Befehle oder andere Befehle?

    Mein bisheriges Skript für diese Zwecke braucht ca. 2-3 minuten für jede neue Schleife; was auf Dauer ziemlich viel Zeit und Strom kostet. Vielleicht liegt es an dem vielen Text den ich in meiner Excel Tabelle habe, den Autoit bei jeder neuen Schleife auslesen muss..., Außerdem ist die Buchstabenanzahl auf 250 Buchstaben pro Zelle begrenzt, was auch nicht so toll ist. Ich suche daher mit diesem Display Array eine neues besseres Skript für meine Zwecke.

    1. Wie kann ich bspw. einen send Befehl für die Zeile "Row 18" formulieren? Also, es soll der Inhalt von Row 18 gesendet werden.
    2. Ab ca. Col 99 scheint mir diese Methodik fehlerhaft zu sein. Zwar ist der gesamte Inhalt bis "HQ" von der Excel Datei in diesem Array, aber die Col- Bezeichnung ist ab Col 99 scheinbar fehlerhaft. Ist diese Methode nicht für mehr als 99 Col´s geeignet?
    3. Gäbe es auch bei dieser Methodik eine Buchstaben Begrenzung?
    4. Wenn ich mit dieser Methodik eine Schleifen Funktion hinbekommen würde, würde meine Skript dann auch für jede neue Schleife ca. 2-3 Minuten Wartezeit benötigen?
    5. Habt ihr Vorschläge, wenn dieser Weg für meine Zwecke der falsche sein sollte, wie ich ein besseres Skript als meines erstellen könnte? Ich brauche die Daten von einer Excel Tabelle, welche ich dann in meinem Skript verwende.

    Ich danke euch im voraus für eure Antworten.

    Gruß Bernd

  • Kannst Du bitte in kurzen Worten beschreiben, was der Zweck des Skriptes ist?

    Ohne zu verstehen, was Du erreichen willst, ist es schwierig Verbesserungsvorschläge zu machen.

  • Zumal die Inhalte der Zellen (also die Bezugsangaben, naja... Fragwürdig sind) Du schleifst einen Wert scheinbar vom Anfang bis zum Ende durch ("=HM86";"=HN86";...), richtig wäre: "=$A$86". (A86 hier als Beispiel, wäre die Quell-Zelle)

    Bei so vielen gleichen Werten stelle ich deine Exceltabelle mal grundsätzlich in Frage (Sinnhaftigkeit), da sich nur 1-2 Zellen vom Wert her wirklich sich zu ändern scheinen.

    Evtl. solltest du diese nach Möglichkeit überarbeiten und dadurch dann auch eine bessere Abfrage erhalten können.

  • Kannst Du bitte in kurzen Worten beschreiben, was der Zweck des Skriptes ist?

    Ohne zu verstehen, was Du erreichen willst, ist es schwierig Verbesserungsvorschläge zu machen.

    Das Skript was ich im Anhang eingefügt habe, ist das Skript was ich aktuell benutze und was eine lange Wartezeit nach jeder Schleife hat. Das Skript C im Beitrag, ist ein Skript-Grundlage auf welches ich eventuell mein aktuelles Skript vom Anhang übertragen möchte, wenn vorteilhaft. Ich möchte auf KDP ( Amazon) mithilfe einer Excel Tabelle Designs und Skripte für Taschenbücher hochladen, automatisert mich AutoIt. Es klappt auch bisher gut mit meinem aktuellen Skript, bis auf die Wartezeit und Buchstabenzahl pro Zelle.

  • Das 255 Zeichen Limit umgehst Du, wenn Du für die Funktion _Excel_RangeRead den Parameter $bForceFunc auf True setzt.

    Dein Skript wird langsam durch

    • die vielen _Excel_RangeRead-Aufrufe
    • die vielen Sleeps

    Abhilfe:

    • Lies das gesamte Excel Workbook in einen Array und arbeite dann diesen Array ab. Ist natürlich eine größere Anpassung!
    • Automatisiere nicht das WebGUI mit MouseClicks etc. sondern mit WebDriver. Ist natürlich eine größere Anpassung!
  • Evtl. solltest du diese nach Möglichkeit überarbeiten und dadurch dann auch eine bessere Abfrage erhalten können.

    Vielen dank für diese Antwort. Ich merke mir diesen Tipp. Aktuell benutze ich nicht dieses "Display Array" sondern, das Skript im Anhang. Dort habe ich keine Probleme damit. Sollte mein neues Skript klappen, würde ich eventuell dann deinen Tipp anwenden. Der Inhalt einiger Zellen soll gleich sein und für meine Zwecke macht dies auch sinn.

  • Wie gesagt, ich würde an deiner Stelle überlegen, ob der Aufbau deiner Exceltabelle so wie sie jetzt ist Sinn ergibt (Erklärung in meinem vorigen Post) oder anders besser wäre und somit leichter zu verarbeiten (siehe hier).

    Aus meiner Sicht ändert sich nur der Wert in der Zelle 1, 13, ?17?, ?18?

    Den Rest schleifst du von vorne durch und könnte als Konstante direkt am Anfang eingelesen werden.

    Dann würde ich anstatt das in Spalten zu packen, es in Zeilen umpacken, womit deine Tabelle schmaler wird (evtl. 1 Spalte als counter + 2-4 Spalten mit Variablen + 1-2 Spalten oben mit Konstanten; ohne sie durch zu schleifen!) dafür aber länger.

    Vorteil ist dann weniger Handhabung mit den Spaltenbeschriftungen und höchstwahrscheinlich schnellere/einfachere Abfragen, da die die Zeilen einfach durchläufst ohne die Werte in "AB" etc. umwandeln zu müssen.

    In der aktuellen Verison:

    Wegen deinem "HQ" Problem, kann ich mir vorstellen, das es zu viele Zellen sind, die in A:HQ enthalten sind. Evtl. versuch dies mal zu begrenzen. Z.B. mit "A1:ZZ100" und shcaue nach ob das dann geht.

  • die vielen Sleeps

    Wie meinst du das? Das die sleeps zeit beanspruchen, das weis ich. Ich meine das nach der letzten Aktion einer Schleife, 2-3 minuten gewartet wird... Wenn ich einige Sleep befehle streiche oder zusammenfasse oder die "Random" sleeps in normale sleeps umwandle, könnte mein Skript dann etwas schneller werden?

    Lies das gesamte Excel Workbook in einen Array und arbeite dann diesen Array ab. Ist natürlich eine größere Anpassung!

    Ich habe schon in meinem bisherigen "Excel Workbook" eingebaut, wie genau meinst du das? Meinst du, das diese Range in meinem Skript verschwinden soll und ich es auf einem "Array" organisieren soll?

    Das 255 Zeichen Limit umgehst Du, wenn Du für die Funktion _Excel_RangeRead den Parameter $bForceFunc auf True setzt.

    Sorry..., wie kriege ich das hin? Muss ich in jede Klammer diesen Parameter einfügen? Könntest du mir dies bitte zeigen.

    Code
    $_readA = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][0])
    $_readB = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][1])
  • Ja, das gilt nur für den jeweiligen Funktionsaufruf:

    Code
    $_readA = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][0], 1, True)
    Zitat

    Ich habe schon in meinem bisherigen "Excel Workbook" eingebaut, wie genau meinst du das?

    Du öffnest derzeit mit _Excel_BookOpen das Excel-Arbeitsblatt und liest dann mit 100-en Funktionsaufrufen von _Excel_RangeRead Zelle für Zelle - das kostet Zeit.

    Lies alles mit einem Aufruf und greife dann nur mehr auf den Array zu:

    Code
    $aArray = _Excel_RangeRead($oWorkbook)

    Das liest das gesamte Arbeitsblatt in einen 2D Array ein. Dann brauchst Du Dich nur mehr in Schleifen durch den Array durcharbeiten.

  • $aArray = _Excel_RangeRead($oWorkbook)

    Das liest das gesamte Arbeitsblatt in einen 2D Array ein. Dann brauchst Du Dich nur mehr in Schleifen durch den Array durcharbeiten.

    Vielen dank für deine Hilfe. Ich möchte das die Schleifen Funktionalität weiterhin beibehalten wird in meinem Skript. Also ich möchte nicht bsp. mein Skript 100 mal wiederholen müssen und dort die Werte der einzelenen Reihen reinschreiben müssen, sondern das sich mein Skript weiterhin Reihe für Reihe an meinem Skript abarbeitet.
    Ist dies bei diesem "$aArray = _Excel_RangeRead($oWorkbook)" gegeben oder habe ich dann nur ein einziges riesiges Array wo ich explicit die Reihe und Zeile nennen muss, wenn ich dieses verwenden will?

    $_readA = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][0], 1, True)

    Müsste dann anstelle dieser ca. 220 Reihe nur eine Reihe mit "$aArray = _Excel_RangeRead($oWorkbook)" in mein Skript kommen und meine riesige Range müsste noch bleiben? Sorry, ich weis ich bin hier nervig.

  • water vielen, vielen Dank für deine Hilfe.
    MIt "$_readA = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][0], 1, True)" habe ich das Buchstabenproblem lösen können. Und indem ich "Global $aArray = _Excel_RangeRead($oWorkbook)" oben in mein Skript eingefügt habe und sonst nchts weiteres unternommen habe, braucht mein Skript aktuell für jede neue Schleifenur ca. 15 Sekunden und nicht mehr 2-3 minuten. Ich hoffe das bleibt auch so.

    Ihr, besonders aber water, habt mir sehr weitergeholfen. Danke.

  • :)