nicht aneinander grenzende Zellen mit Makro ausblenden

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

hannov1942
Beiträge: 4
Registriert: Sa, 19.12.2020 04:33

nicht aneinander grenzende Zellen mit Makro ausblenden

Beitrag von hannov1942 »

Gibt es eine Möglichkeit, mit Hilfe eines Makros nicht aneinander grenzende Zellen/Zeilen/Spalten/Bereiche auszublenden?
Das Ausfüllen von mehreren separaten Zellen ist ja in oO nicht möglich. Wohl aber das Einfärben/Löschen/ Ausblenden u.a., indem man die betreffenden Zellen mit gedrückter Strg-Taste markiert. Wenn man das aber mit Makro versucht, indem man die betr. Zellen/Spalten/Bereiche auflistet, wird nur die erstgenannte Adresse berücksichtigt.
Interessanterweise hat Excel damit kein Problem. Und wenn man eine Excel-Datei mit dieser Funktion mit oO öffnet, funktioniert das Makro auch dann - aber nur, bis man die Datei im odt-Format abspeichert.
Der Vorgang soll nicht seriell ablaufen! Dafür ist die Datei zu umfangreich und damit die Laufzeit zu lang - dann macht man es erfahrungsgemäß lieber gar nicht.
Beispiel: Es soll jede zweite Zeile einer Tabelle auf Knopfdruck ausgeblendet werden

Hat jemand eine Idee oder einen Verweis? Ich habe bisher nichts Funktionierendes gefunden.
Vielen Dank im Voraus
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: nicht aneinander grenzende Zellen mit Makro ausblenden

Beitrag von Stephan »

Gibt es eine Möglichkeit, mit Hilfe eines Makros nicht aneinander grenzende Zellen/Zeilen/Spalten/Bereiche auszublenden?
Teils (Zeilen, Spalten) ja, teils (Zellen, Bereiche) nein oder ich verstehe letztere Anforderung miss.
Und wenn man eine Excel-Datei mit dieser Funktion mit OO öffnet, funktioniert das Makro auch dann - aber nur, bis man die Datei im odt-Format abspeichert.
Was genau meint das? Die Funktion das man bei Excel gleichzeitig in mehrere Zellen/Bereiche einfügen kann ist eine Funktion des Programms und keine Funktion einer Datei.
Wenn in einer Datei hingegen ein Makro vorliegt IST das ein Makro und es wäre zu klären warum das in OO nicht funktioniert.

Die benannte Situation das das Makro beim Öffnen einer 'Excel-Darei' in OO funktioniert und nach Abspeichern als ods nicht mehr ist ungewöhnlich und aber wäre z.B. dadurch erklärbar das OO die beim Öffnen der Excel-Datei automatisch eingefügte sog. Kompatibilitätsoption (Option VBASupport 1) nicht mit abspeichert, nur weiß ich nicht unter welchen Umständen sich OO so (falsch) verhält.

Lade bitte eine beispielhafte Excel-Datei hoch welche sich so verhält, dann kann man das klären.
Hat jemand eine Idee oder einen Verweis?
Selbst wenn Du dass Ausblenden in einem Schritt machst, müssten doch vorher Markierungen erfolgen um überhaupt festzulegen was ausgeblendet werden soll, selbst das ist aber verhältnismäßig langsam, z.B.:

Code: Alles auswählen

bereiche = ThisComponent.CreateInstance("com.sun.star.sheet.SheetCellRanges")
For i = 1 To 5000
	bereiche.addRangeAddress(ThisComponent.Sheets(0).getCellRangeByName("A" & (i+1)*2).getRangeAddress(), False)
Next i

ThisComponent.getCurrentController.Select(bereiche)
Allerdings hilft solcherart Ausblenden ohnehin nicht beim Einfügen in getrennte Bereiche, denn selbst wenn jede zweite Zeile ausgeblendet wäre, wird bei Copy-Paste in jede (auch die Ausgeblendeten) Zeile eingefügt. Es wäre also naheliegender ein Makro zu schreiben das das Einfügen in getrennte Bereiche erledigt.


Gruß
Stephan
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: nicht aneinander grenzende Zellen mit Makro ausblenden

Beitrag von F3K Total »

Moin,
ich würde das Ausblenden ala
hannov1942 hat geschrieben: Sa, 19.12.2020 05:19 Beispiel: Es soll jede zweite Zeile einer Tabelle auf Knopfdruck ausgeblendet werden
mit dem Autofilter machen, Beispieldatei anbei.
Da braucht man kein Makro.

Gruß R
Dateianhänge
Jede_nte_Zeile_Ausblenden_Autofilter.ods
(15.38 KiB) 51-mal heruntergeladen
hannov1942
Beiträge: 4
Registriert: Sa, 19.12.2020 04:33

Re: nicht aneinander grenzende Zellen mit Makro ausblenden

Beitrag von hannov1942 »

Hallo, Stephan
Zunächst mal vielen Dank für die schnelle Antwort.
Möglicherweise habe ich mich in einigen Punkten etwas zu knapp ausgedrückt, um evtl. Leser nicht zu verschrecken.
Der Vergleich mit Einfügen bzw. Löschen usw. bezog sich nur auf die "händische" Markierung mit gedrückter Strg.-Taste.
Das von mir benötigte Makro soll "nur" jede zweite Zeile ausblenden, damit man einen besseren (und umfangreicheren) Überblick über die wichtigeren nicht ausgeblendeten Zeilen hat. Zur weiteren Bearbeitung werden die ausgeblendeten Zeilen später wieder eingeblendet (das ganze funktioniert mit einer toggle-Funktion).
Dein Argument, dass ja ohnehin eine Berechnung/Selektion der auszublendenden Zeilen erfolgen muss, ist plausibel. Ich habe aber den Eindruck, dass (zumindest bei meinem etwas lahmen Notebook) der Vorgang des Ausblendens der zeitbestimmende Faktor ist: Das Ausblenden mit einer for/next-Schleife dauerte bei einer 100-Zeilen-Datei ca. 7 Sekunden (man konnte das aufeinanderfolgende Ausblenden beobachten).
Da aber bei vielen Dateien nicht alle Zeilen relevanten Inhalt enthalten, habe ich dann an den Anfang des Makros eine for/next-Schleife gesetzt, die abfragt, welche Zeile als letzte einen relevanten Inhalt hat. Diese Abfrage dauert weniger als eine Sekunde. Dadurch konnte die Laufzeit des Ausblende-Makros für viele Fälle auf ca. 3 Sekunden verringert werden, weil das Makro nicht mehr bis Zeile 100 laufen musste.
Das ist schon eine brauchbare Lösung, vor allem für einen schnelleren Rechner. Aber mich frustrierte, dass man einen Vorgang, der mit Maus und Tastatur einfach (aber zeitaufwendig) zu erledigen ist, nicht automatisieren kann.
Den von Dir angegebenen Code habe ich schon mal eingebaut. Aber noch ohne Erfolg. Wahrscheinlich fehlt mir da noch was. Ich werde - auch wg. der Excel-Kompatibilität - noch was basteln müssen und melde mich dann später wieder.
Viele Grüße
hannov1942
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: nicht aneinander grenzende Zellen mit Makro ausblenden

Beitrag von mikeleb »

Hallo,
was ist "relevanter Inhalt"? Nach welchen Kriterien willst du was ausblenden?
Es wäre vielleicht hilfreich, wenn du uns dein Makro oder besser deine Datei mal vorstellen würdest.
Gruß,
mikeleb
hannov1942
Beiträge: 4
Registriert: Sa, 19.12.2020 04:33

Re: nicht aneinander grenzende Zellen mit Makro ausblenden

Beitrag von hannov1942 »

Hallo, F3K total
Zunächst mal bitte ich um Nachsicht, dass ich hier im Forum möglicherweise technisch nicht alles sinnvoll bzw. richtig mache. Ich bin zum ersten mal selbst in so was aktiv - habe bisher immer nur als Zaungast gelesen (und nur daher stammen meine bescheidenen Kenntnisse).
Die Idee, das ganze mit Autofilter zu lösen, ist an dieser Stelle sehr elegant. Ich habe es an anderer Stelle früher bei eigenen Tabellen auch schon mal eingesetzt, vor allem, weil man flexibel in der Handhabung ist.
Allerdings habe ich beobachtet, dass meine Bekannte, für die diese Datei gedacht ist, die Filterfunktion nicht wirklich gerne benutzt (ich weiß nicht, warum), besonders, wenn ansonsten eine Reihe anderer Funktionen mit Makros ablaufen.
Dass ich die Idee mit dem Makro weiter verfolge, hängt damit zusammen, dass das Problem mit der Mehrfachselektion ja auch bei anderen Aktionen auftritt. Deswegen noch mal kurz meine Beobachtungen zusammengefasst:
Wenn man mit Hilfe der Strg-Taste mehrere Zellen markiert, kann man (im Unterschied zu Excel) anschließend in die markierten Zellen keine Werte und keine Gleichungen eintragen und auch nichts einkopieren. (Mehrfachselektion nicht möglich). Wohl aber ist es möglich, die selektierten Zellen zu formatieren (Farbe, Rahmen, bedingte Formatierung), Inhalte zu löschen und, wenn es sich um Zeilen oder Spalten handelt, diese auszublenden. Und das geht schnell!
Wenn man nun eine Mehrfachselektion z.B. mehrerer Zeilen und anschließendes Ausblenden mit dem Makro-Recorder aufzeichnet, findet man im aufgezeichneten Makro keine Adresse. Und wenn man das Makro dann laufen lässt, wird nur die Zeile ausgeblendet, an der zufällig der Cursor steht.
Zeichnet man ein entsprechendes Makro zum Einfärben von Zellen auf, erscheint im Skript nur die Adresse der als erstes selektierten Zelle, und entsprechend läuft das Makro dann auch ab.
Wenn man ein Makro, das für das Ausblenden einzelner Zeilen in einer for/next-Schleife gedacht war (das dauert je nach Größe des Arbeitsblattes ziemlich lang), dann dahingehend abwandelt, dass die Adressen - durch Komma getrennt - aufgelistet werden, wird nur die Zeile der ersten gelisteten Adresse ausgeblendet.
Was mir fehlt, ist demnach eine Routine, die die Adressen der markierten Zellen/Zeilen/Spalten für die beabsichtigte Aktion bereithält, so, wie bei der Selektion per Hand.
hannov1942
Beiträge: 4
Registriert: Sa, 19.12.2020 04:33

Re: nicht aneinander grenzende Zellen mit Makro ausblenden

Beitrag von hannov1942 »

Hallo mikeleb
Mit "relevantem Inhalt" wollte ich elegant umgehen, dass ich erläutern müsste, warum ich die Abfrage nach der letzten Zeile nicht mit dem Befehl
oCellCursor.GotoEndOfUsedArea(False)
ermittle, sondern mit einer for/next-Schleife.
Grund ist, dass immer 4 Zellen eine Gruppe bilden, z.B. B8, C8, B9, C9.
B8 enthält einen Namen, B9 eine Aufgabe (aber nur und immer dann, wenn B8 einen Namen enthält)
C8 enthält immer eine Gleichung mit einem Bezug auf eine andere Adresse (ein Zeitrasterin Spalte A)
C9 ist z.Z. leer.
Und diese "Quartette" bilden dann 7*2 Spalten für die 7 Wochentage.
Wenn ich nun den o.g. Befehl benutze, um die letzte benutzte Zelle zu ermitteln, findet der die in Zeile 100, weil da ja auch die Gleichungen in "Quartetten" stehen, die evtl. gar keinen Namen enthalten. Die Tabelle muss aber so groß sein, damit sie möglicherweise so viele Quartette aufnehmen kann.
Darum werden in einer Schleife alle "Namens"-Zellen spaltenweise auf Inhalt überprüft, die Zeilen-Nr. der letzten gefüllten festgehalten, dann zur nächsten Quartett-Spalte gesprungen und geprüft, ob dort darunter weitere gefüllte Namenszellen stehen usw. Die letzte gefundene gibt dann den Bereich, bis zu dem das Ausblenden der jeweils unteren ("Aufgabe" und "leer") erfolgen soll.
Damit erspare ich mir, dass das Ausblend-Makro Zeilen ausblenden muss, die ohnehin unter den letzten ausgefüllten Namenszellen liegen.
Ich werde mal ein Muster posten, falls ich mit der Technik hier klarkomme.

Gruß
hannov1942
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: nicht aneinander grenzende Zellen mit Makro ausblenden

Beitrag von F3K Total »

Moin,
ich habe dir ein einfaches Makro geschrieben:

Code: Alles auswählen

const ZEILEN = "2,3,5,7,9,10,11,12,14,16,22,24"

Sub Zeilen_Ausblenden_Einblenden
    oSheet = ThisComponent.CurrentController.activeSheet
    aRows = Split(Zeilen,",")
    for i = 0 to uBound(aRows)
      oRow = oSheet.Rows(CInt(aRows(i))- 1 )
      oRow.isVisible = not oRow.isVisible
    next i 
End Sub
in dessen erste Zeile schreibt man die ein- oder auszublendenden Zeilen.

Mit Hilfe dieser Seite: https://wiki.openoffice.org/wiki/Docume ... ation_File habe ich die Tastenkombinatin STRG+ALT+H im Dokument gespeichert und ihr die Ausführung des Makros zugewiesen.
Beispiel anbei.
Einfach STRG+ALT+H drücken, und die orangen Zeilen werden ausgeblendet und beim erneuten Drücken der Tastenkombination wieder eingeblendet.

Gruß R
Dateianhänge
Zeile_Ausblenden_Makro_Tastenkombi_STRG_ALT_H.ods
(16.68 KiB) 45-mal heruntergeladen
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: nicht aneinander grenzende Zellen mit Makro ausblenden

Beitrag von mikeleb »

Hallo,
Damit erspare ich mir, dass das Ausblend-Makro Zeilen ausblenden muss, die ohnehin unter den letzten ausgefüllten Namenszellen liegen.
Wenn es dich nicht stört, dass diese Zeilen auch ausgeblendet sind, wäre es aber erheblich einfacher und schneller.
Wenn ich dich richtig verstehe, willst du praktisch im Bereich von Zeile 8 bis 100 jede ungerade Zeile aus-/einblenden.
Dafür würde folgendes vereinfachtes (basierend auf F3K Total's) Makro reichen:

Code: Alles auswählen

Sub Zeilen_Ausblenden_Einblenden2
    oSheet = ThisComponent.CurrentController.activeSheet
    for i = 8 to 100 Step 2
      oRow = oSheet.Rows(i)
      oRow.isVisible = not oRow.isVisible
    next i 
End Sub
Gruß,
mikeleb
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: nicht aneinander grenzende Zellen mit Makro ausblenden

Beitrag von Stephan »

Das ist genau das, was ich brauche
herzlichen Dank für die Veralberung errst ausdrüvklich zu schreiben: "Der Vorgang soll nicht seriell ablaufen!" jetzt aber eine solche Lösung als "genau das" [Richtige] zu bezeichnen


Stephan
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: nicht aneinander grenzende Zellen mit Makro ausblenden

Beitrag von mikeleb »

Hallo,
Das macht das Toggeln zwar etwas aufwendiger (es müssen 2 unterschiedliche Teilmakros zusammengehängt werden)
So aufwändig ist es nicht. Es reicht ein Makro.

edit: Vielleicht noch zur Erläuterung: Das Makro blendet per Button jede zweite Zeile zwischen Zeile 9 und Zeile 101 aus bzw. bei erneutem Button-Klick alle (!) Zeilen 9-101 wieder ein.
Dateianhänge
einausblende.ods
(8.91 KiB) 58-mal heruntergeladen
Gruß,
mikeleb
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: nicht aneinander grenzende Zellen mit Makro ausblenden

Beitrag von F3K Total »

Moin,
Nochmal, wenn ich den Autofilter verwende, kann ich bei 10000 Zeilen jede zweite, dritte, vierte ... in weniger als 1 Sekunde ausblenden.
Was soll das mit dem Makro?

R
Dateianhänge
Jede_nte_Zeile_Ausblenden_Autofilter.ods
(144.01 KiB) 43-mal heruntergeladen
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: nicht aneinander grenzende Zellen mit Makro ausblenden

Beitrag von F3K Total »

Sag mal, bist du nur ein Troll, der uns hier ärgern will?
Mit jedem Beitrag fällt dir wieder etwas anderes, das dir noch fehlt, ein.
Entweder willst du unter tausenden von Zeilen jede zweite ausblenden, dann kommen wieder Spalten dazu, wie von Hand markiert?
Hast du wirklich ein Problem, oder stänkerst du nur?
Hier nun mein letzter Beitrag zu diesem Thema, mit folgenden zwei Makros kann man gleichzeitig Zeilen uns Spalten, die oben im Makro definiert sind entweder aus- oder Einblenden.

Code: Alles auswählen

const ZEILEN = "2,3,5,7,9,10,11,12,14,16,22,24"
const SPALTEN = "E,F,J,K,L,O,Q"

Sub Zeilen_und_Spalten_Ausblenden
    oSheet = ThisComponent.CurrentController.activeSheet
    aRows = Split(ZEILEN,",")
    aColumns = Split(SPALTEN,",")
    for i = 0 to uBound(aRows)
      oRow = oSheet.Rows(CInt(aRows(i))- 1 )
      oRow.isVisible = false
    next i 
    for i = 0 to uBound(aColumns)
      oColumn = oSheet.columns.getbyName(aColumns(i))
      oColumn.isVisible = false
    next i
End Sub

Sub Zeilen_und_Spalten_Einblenden
    oSheet = ThisComponent.CurrentController.activeSheet
    aRows = Split(ZEILEN,",")
    aColumns = Split(SPALTEN,",")
    for i = 0 to uBound(aRows)
      oRow = oSheet.Rows(CInt(aRows(i))- 1 )
      oRow.isVisible = true
    next i 
    for i = 0 to uBound(aColumns)
      oColumn = oSheet.columns.getbyName(aColumns(i))
      oColumn.isVisible = true
    next i
End Sub
Das ganze wird in meiner Beispieldatei anbei entweder über die Schaltflächen oben auf Tabelle 1 gesteuert, oder mit den Tastenkombinationen
  • STRG+ALT+H für hide, ausblenden
  • STRG+ALT+S für show, einblenden
gestartet.
Beides geht blitzschnell.

R
Dateianhänge
Zeilen_Spalten_ausblenden_Makro_Tastenkombi_STRG_ALT_H__STRG_ALT_S.ods
(17.69 KiB) 45-mal heruntergeladen
Antworten