Zeilen in Exceltabelle löschen

  • Wo findet man Beschreibungen von Anweisungen mit Punkterweiterungen wie z.B. "$oWorkbook.ActiveSheet"

    Generell: https://msdn.microsoft.com/

    Speziell zu Excel Workbook: https://msdn.microsoft.com/de-de/vba/exce…ok-object-excel

    Wie gebe ich Variable bei denExcel-Anweisungen an, vielleicht z.B. für eine zu löschende Zeile


    _Excel_RangeDelete($oWorkbook.ActiveSheet, $Zeile)

    Du kannst bei der Funktion _Excel_RangeDelete den Range so setzen, dass eben nur die gewünschte Zeile gelöscht wird.

    Bsp.: Nur Zeile 7 löschen

    AutoIt
    Local $vRange = '7:7' ; Der Bereich kann ein Bereichsobjekt sein, ein A1-Bereich (z.B. "A1:B2", "1:2" (Zeile 1 bis 2), "D:G" (Spalten D bis G) usw.).
    _Excel_RangeDelete($oWorkbook.ActiveSheet, $vRange) ; Löscht eine oder mehrere Zellen, Zeilen oder Spalten aus dem angegebenen Arbeitsblatt
  • Hallo Grufti39

    Aussserdem enthält der Lösungsansatz eine Text-Datei statt einer Exceltabelle.

    Ich denke water konnte hier einfach keine Datei mit Endung csv anhängen. Die Datei ist aber schon im richtigen Format. Du kannst die Datei auch von test.txt in test.csv umbenennen und das dann auch im Skript ändern.

    Allerdings funktioniert es bei mir einwandfrei (auch als test.txt).

    _Excel_RangeDelete($oWorkbook.ActiveSheet, "2:4")


    liefert zur Anweisung ".ActiveSheet" die Meldung "Variable must be of txpe Object".

    Du hast das Beispiel (txt und au3) von water heruntergeladen? Sie lagen im selben Ordner, als du das Skript ausgeführt hast?

    Kann es sein, dass du gar kein Office installiert hast, sondern nur den Office- oder Excel-Viewer?


    Mit der Punktnotation musst du dich aktuell nicht kümmern. (Es bringt sich an dieser Stelle einfach nicht weiter..). Aber hier der Link zu MS. Links siehst du die Liste mit den Objekten https://msdn.microsoft.com/de-de/vba/exce…ns-object-excel

    Grüße autoiter

  • Wenn du gar kein Excel hast, oder wir an dieser Stelle nicht weiter kommen, dann ist das eigentlich auch kein Problem.

    Da du csv-Dateien vorliegen hast, aus denen du bestimmte Zeilen löschen möchtest, kann man auch die ganz normalen String-Funktionen verwenden (csv-Dateien sind nämlich ganz normale Textdateien, die diesen in einem bestimmten Format organisieren).

    Ich will nicht übertreiben aber mit den Stringfunktionen ist die Aufgabe wahrscheinlich tausendmal schneller in der Ausführung.

    Grüße autoiter

  • Danke für die vielen Hilfen.

    Das Hauptproblem ist die Meldung zur Anweisung "_Excel_RangeDelete($oWorkbook.ActiveSheet, "1")"
    ActiveSheet: Variable must be of type Object".

    So komme ich garnicht zur Ausführung der Delete-Anweisung.

    txt- und csv-Dateien nutzen nichts. Es muss schon richtig Excel sein. Ich habe MS Office 2010 installiert.

    Mir scheint das Problem am Windows 10 zu liegen.

    Grüße

    Friedhelm39

  • Hallo Grufti39 !

    txt- und csv-Dateien nutzen nichts

    Ich würde den Vorschlag von autoiter aus Beitrag 23 nicht vorschnell verwerfen !

    Meine zu verarbeitende Datei ist eine CSV-Datei, Sie wird aber beim manuellen Aufruf als Exceltabelle dargestellt.

    Deine Datenausgangsquelle ist demnach die/eine .csv-Datei - habe ich das richtig verstanden ?

    Dass die .csv-Datei bei einem manuellen Aufruf als Exceltabelle dargestellt wird, liegt wahrscheinlich an einer direkten Verknüpfung der Extension .csv mit Excel.

    Was spricht dagegen, Lösch- oder auch andere Operationen an der .csv-Datei vorzunehmen, BEVOR Du sie nach Excel überführst ? Dafür ständen Dir, wie von autoiter beschrieben, div. String- und Arrayfunktionen zur Verfügung. Excel müsste dann nur die bereinigten Daten anzeigen !

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

  • Danke für die vielen Hilfen.

    Das Hauptproblem ist die Meldung zur Anweisung "_Excel_RangeDelete($oWorkbook.ActiveSheet, "1")"
    ActiveSheet: Variable must be of type Object".

    So komme ich garnicht zur Ausführung der Delete-Anweisung.

    txt- und csv-Dateien nutzen nichts. Es muss schon richtig Excel sein. Ich habe MS Office 2010 installiert.

    Mir scheint das Problem am Windows 10 zu liegen.

    Grüße

    Friedhelm39

    Da hat sich ein Mißverständnis eingeschlichen. Zu bearbeiten ist eine reine Exceldatei mit ca. 1000 Zeilen und ca. 20 Spalten und ca. 15 Arbeitsblättern (Tabellen), die laufend mit Scripts fortgeschrieben werden ( - sollen, mit der alten Excel UDF ging das problemlos).

    Noch hoffe ich auf eine funktionierende Idee.

    _Excel_RangeDelete muss doch auch auf meinem PC laufen.

    Grüße

    Friedhelm39

  • Hallo Grufti39 !

    Bereits aus Beitrag #7 :

    Werden wir konkret. Poste bitte Deine CSV-Datei und Dein Skript oder ein reduziertes Skript damit wir das Problem nachstellen und lösen können.

    Ohne Minimalskript + von Dir erzeugter Exceldatei kommen wir hier nicht weiter :!:

    Verwende doch bitte die Testdaten von water aus seinem Beitrag 17

    Du musst lediglich die test.txt in test.csv umbennen, oder Du kopierst :

    Code
    Line 1 Col A;Line 1 Col B;Line 1 Col C;Line 1 Col D;Line 1 Col E
    Line 2 Col A;Line 2 Col B;Line 2 Col C;Line 2 Col D;Line 2 Col E
    Line 3 Col A;Line 3 Col B;Line 3 Col C;Line 3 Col D;Line 3 Col E
    Line 4 Col A;Line 4 Col B;Line 4 Col C;Line 4 Col D;Line 4 Col E
    Line 5 Col A;Line 5 Col B;Line 5 Col C;Line 5 Col D;Line 5 Col E
    Line 6 Col A;Line 6 Col B;Line 6 Col C;Line 6 Col D;Line 6 Col E

    in einen Texteditor und speicherst die Datei unter test.csv ab.

    Daraus erstellst Du eine Exceldatei und speicherst auch diese ab (wie jetzt auch).

    Dann greifst Du mit einem Minimalskript (siehe Beitrag 18) auf diese Exceldatei zu (Dateinamen anpassen).

    Das Minimalskript bitte auch hier posten (ggf. alles in einer .zip anhängen, da nicht alle Extensionen im Forumseditor zugelassen sind).

    Sollte der Fehler bereits bei dieser Testumgebung auftauchen, dann haben wir eine Referenz zu Analyse.

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

    Einmal editiert, zuletzt von Musashi (10. November 2018 um 18:02) aus folgendem Grund: Beitrag 17, nicht 18

  • Was meinst Du damit?

    Du glaubst dein Problem sei:

    Das Hauptproblem ist die Meldung zur Anweisung "_Excel_RangeDelete($oWorkbook.ActiveSheet, "1")"

    Dabei bricht hier nur das Skript ab, weil $oWorkbook kein Objekt ist. Das liegt daran, dass die Funktion _Excel_BookOpen nicht erfolgreich war. Water hatte einfach nur die Fehlermeldungen entfernt. Sonst hättest du immer noch die gleiche Meldung wie bei deinen ersten Versuchen mit dem Beispiel aus der Hilfe erhalten.

    Es liegt nicht am Format. Ich kann die txt, die water dir in Beitrag 17 verlinkt hatte in csv umbennen und aus Excel heraus als xls oder xlsx speichern und es würde immer noch funktionieren (nach Angabe des korrekten Dateinamens im Skript). Die UDF ist auch sehr gut erprobt und gilt als absolut zuverlässig. Man geht in der Regel nur andere Wege, wenn man Dinge machen möchte, die von der UDF nicht berücksichtigt werden.

    Bei dir funktioniert das aber nicht. Daher sage ich, es liegt ganz sicher an deiner speziellen Konfiguration. Irgendetwas mit deinem System, deiner Installation, deiner Art das Auszuführen, was auch immer. Ich weiß es nicht. Es ist aber kein allgemeines Problem.

    Ich fürchte, hier wird kein besserer Code kommen, um dein Problem zu lösen. Ich glaube, das Problem muss auf deinem Rechner gelöst werden.

    Grüße autoiter

  • Ich habe mir für meineTests ein Minimalscript erstellt und dazu eine einfache Exceldatei.Ich werde beides posten. Hoffentlich finde ich heraus, wie das un diesem Forum geht.test.au3

    Die txt-Datei ist eine xlsx-Datei und muss entsprechend umbenannt werden. Hoffentlich ist meine Test-Variante für Euch so ok..

    Einmal editiert, zuletzt von Grufti39 (10. November 2018 um 18:49) aus folgendem Grund: Die Exceldatei ist wohl hängen geblieben. Der Trick mit dem Umbenennen hat wohl nicht funktioniert. Das ist schade. Am einfachsten ist es nach meiner Meinung einfach eine Test-Excel-Datei zu erstellen. Meine Exceldatei hat folgenden Inhalt: 1 2 3 4 5 6 11 22 33 44 55 66 111 222 333 444 555 666 1111 2222 3333 4444 5555 6666

  • Hallo Grufti39 !

    Allgm. Tipp so nebenbei :

    Wenn Du einen Thread am Laufen hast, kannst Du auch gerne mal einen Blick in die Shoutbox werfen.

    Bitnugger hat dort z.B. die Vermutung geäußert, dass deine AutoIt-Installation möglicherweise fehlerhaft sei. Dies könnte ggf. zu dem von Dir beschriebenen Folgefehler führen.

    So etwas in dieser Art meinte auch autoiter, als er von einem 'lokalen Problem' schrieb.

    Zum Posten :

    -> Gehe auf den Reiter Dateianhänge am unteren Rand des Beitragsfensters

    Dort werden auch die zugelassenen Dateigrößen und -endungen angezeigt, also :

    Maximale Anzahl an Dateianhängen: 10
    Maximale Dateigröße: 5 MB
    Erlaubte Dateiendungen: 7z, au3, bmp, gif, jpeg, jpg, lua, pdf, png, rar, txt, zip

    -> Button HOCHLADEN klicken und Datei(en) auswählen

    Die txt-Datei ist eine xlsx-Datei und muss entsprechend umbenannt werden.

    Sollte eine Dateiendung (also z.B. .xlsx) nicht zugelassen sein, dann packe sie (oder alle Dateien) besser in eine .zip-Datei. Das verkleinert die Datenmenge (siehe 5 MB Limit), und man muss nichts umbenennen.

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

  • Hallo Grufti39

    beschreibe mal in Worten, was in dem Skript passieren soll.

    (Es ist nicht lauffähig, der Dateiname passt für mich nicht, du hast mehrere Syntaxfehler drin)


    EDIT: Wobei ich dir gleich sagen muss, wenn ich den richtigen Dateinamen eintrage, scheitert das Skript nur noch an den Syntaxfehlern und nicht daran, dass $oExcelU kein Objekt sei. Du musst doch nach _Excel_BookOpen in deiner Messagebox schon einen Fehlerwert gesehen haben.

    Grüße autoiter

  • Guten Morgen Grufti39 !

    Hier ist mein zweiter Hochladeversuch.

    Das Hochladen hat einwandfrei geklappt ;).

    Leider sitze ich an meinem HomePC (= kein Office installiert), und kann es daher nicht testen.

    Es werden aber sicher in Kürze Feedbacks von anderen Usern folgen.

    Vorab einige allgm. Anmerkungen :

    - Nachfolgende, mit [optional] gekennzeichnete Funktionsparameter müssen nicht angegeben werden, wenn sie Defaultwerte verwenden.

    Beispiel : $oExcel = _Excel_Open(1,0,1,1,0)

    ==> $oExcel = _Excel_Open() reicht aus

    Ist z.B. der Dritte von fünf Optionalparametern nicht Default , dann :

    ==> $oExcel = _Excel_Open(Default, Default, False)

    - Interessant wäre der Wert von @error in der Messagebox zu :

    $oExcelU = _Excel_BookOpen($oExcel, @ScriptDir & "\Excel.xlsx",0,1,"","")

    MsgBox(0, "_Excel_BookOpen", "@error = " & @error & ",@extended = " & @extended)

    @error = 1 ==> $oExcel is not an object or not an application object

    Statt Messageboxen (oder auch zusätzlich) ist die Funktion ConsoleWrite sehr nützlich !

    Sie gibt Meldungen im Konsolenbereich des Editors aus. Du musst also nicht dauern MsgBoxen wegklicken, und könntest ALLE Meldungen als ein Text oder Screenshot posten.

    EDIT :

    Wie autoiter gerade schrieb, verwendest Du einen falschen Dateinamen :

    Dateiname im Skript : Excel.xlsx - Dateiname in der Test1.zip : ExcelDelete.xlsx

    Etwas mehr Sorgfalt beim Aufbereiten der Testdaten wäre schon hilfreich ;)

    Beim Build erhalte auch ich in der Zeile _Excel_RangeDelete($oExcelU.ActiveSheet (1),"1", ,1) einen Syntaxfehler.


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

    Einmal editiert, zuletzt von Musashi (11. November 2018 um 09:47)

  • Hurra! Ich bin einen Schritt weiter.

    Diese Anweisung läuft:

    _Excel_RangeDelete($oExcelU.ActiveSheet,"A2:A3")

    Zwar werden noch nicht die richtigen Zellen gelöscht,

    aber die Anweisung bringt keine Fehlermeldung mehr.


    Jetzt muss ich erst weiter testen, bevor ich auf meine Fragen zurückkomme.

    Zu den allgemeinen Bemerkungen:

    Um mehr Sorgfalt bin ich sehr bemüht. Leider tue ich mich damit doch sehr schwer. Beim Tippen muss ich viel korrigieren. Da rutscht leider immer wieder etwas durch.

    Wenn ich nicht gleich auf alles antwortet, bitte ich um Nachsicht. Es ist seh r viel Neues bei Eueren Antworten, was erst verdaut werden muss. Sonst müsste ich sehr viele Fragen stellen.

    Funktionsparameter verwende ich normalerweise so wie in dem letztten Beitrag beschrieben.

    Zwei erhebliche Wissenslücken habe ich bei den Console-Anweisungen. Wo finde ich Stdout?

    Da greift evtl. die zweite Lücke. ich habe den Umstieg auf SciTE bisher nicht geschafft. Ich konnte mich bisher nicht vom Notepad++ lösen. Kann man beim NP++ Stdout aanzeigen? Oder kann mir jemand beim Umstieg auf SciTE helfen. SciTEl luft auf meinem PC.

    Jetzt werde ichh erst mal versuchen, herauszufinden,wie ich die Sheets und Zellen richtig adressiere. Mit den Angaben in den Beipielen bin ich nicht weitergekommen.

    Bis auf weiteres

    Friedhelm39

  • ich habe den Umstieg auf SciTE bisher nicht geschafft. Ich konnte mich bisher nicht vom Notepad++ lösen.

    SciTE ist als Editor enorm hilfreich :!:Den Umstieg solltest Du so schnell wie möglich machen.

    Es gibt Komplettpakete, die sowohl AutoIt selbst, als auch eine speziell für AutoIt modifizierte Version von SciTE installieren. Das modifizierte SciTE beinhaltet, anders als Notepad++, zig Features nur für AutoIt.

    Auf Details können wir aber eingehen, wenn dein Kopf wieder etwas freier ist ^^.

    Wenn ich nicht gleich auf alles antwortet, bitte ich um Nachsicht.

    Für mich absolut kein Problem, und für die anderen sicher auch nicht :).

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

  • Hurra! Ich bin einen Schritt weiter.

    Diese Anweisung läuft:


    _Excel_RangeDelete($oExcelU.ActiveSheet,"A2:A3")

    Na super! :thumbup:

    Hier hast du nun auch einen korrekten Range angegeben... denn "1" ist kein korrekter Range... weil ein Range aus Start:Ende besteht, wobei Start und Ende auch identisch sein können.

    Zwei erhebliche Wissenslücken habe ich bei den Console-Anweisungen. Wo finde ich Stdout?

    https://de.wikipedia.org/wiki/Standard-Datenströme

    Stdout kannst du mit der Funktion StdoutRead auslesen, doch das ist momentan nicht relevant für dich. Das brauchst du nur, wenn du die Ausgaben aus dem STDOUT-Stream eines zuvor ausgeführten untergeordneten Prozesses lesen willst - wenn du z.B. mit AutoIt einen Consolen-Befehl mit Run() ausführst und dessen Ausgabe haben willst. Mehr zu diesem Thema findest du in der AutoIt-Hilfe unter folgenden Funktionen: Run, RunAs, StdoutRead, StderrRead, StdinWrite, StdioClose.

    Da greift evtl. die zweite Lücke. ich habe den Umstieg auf SciTE bisher nicht geschafft.

    Hier will ich direkt mal klar stellen, dass die Ausgabenkonsole von SciTE/NP++ eine spezielle Console (Scintilla-Control) ist, für die du im Normalfall kein Stdout bzw. StdoutRead brauchst.

    Schau dir in der AutoIt-Hilfe folgende Funktionen an: ConsoleWrite, ConsoleRead, ConsoleWriteError

    Du hast den Umstieg noch nicht geschafft? Wieso hast du mit NP++ angefangen, obwohl SciTE der empfohlenen Editor für AutoIt ist? Nein, sage es nicht... weil jeder sich so gut quält, wie er kann. 8o

    Wenn du AutoIt installierst, wird bereits ein abgespeckte Version von SciTE mit installiert. Um alle verfügbaren SciTE-Features nutzen zu können (wärmstens empfohlen!), musst du aber SciTE4AutoIt3 installieren.

    Hier der Link zum Download: https://www.autoitscript.com/site/autoit-sc…itor/downloads/

    Im Anhang findest du noch das test2.zip, das ist deine test1.zip... nur etwas aufgepeppt und mit einigen Kommentaren versehen. Schau es dir an!

    So, jetzt hast du erst mal genug zu lesen... ;)

  • Ganz großen DanK für Eure Hilfen , besonders für das Script von Bitnugger. Inzwischen benutze ich auch SciTE statt NPP. Aber die Rückfallgefahr ist noch groß.

    Mit _Excel_RangeRead komme ich einfach nicht weiter. Dabei geht es um die Angabe von Range. Die meisten Beiträge im Internet dazu nehmen Bezug auf die alte Excel-UDF und sind nicht brauchbar.

    Was gebe ich als Range an, wenn die Werte für die Zeilen und Spalten

    in Variablen stehen?

    Beispiel: Ich will die Zelle $iSpalte:$iZeile lesen oder schreiben. Oder wie gebe ich an, daß die Zeile $iZeile in Tabelle 1 in $iZeile2 in Tabelle 2 kopiert werden soll?

    Kann mir jemand weiterhelfen?

    Grüße

    Friedhelm39