Calc: Angewendete Zell-Formatvorlage tauschen, die 2te.

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Calc: Angewendete Zell-Formatvorlage tauschen, die 2te.

Beitrag von balu »

Hallo liebe Gemeinde,

diesmal handelt es sich um eine Fortsetzung eines Threads von mir:
Calc: Angewendete Zell-Formatvorlage tauschen, welches aber diesmal ein LibreOffice (LO) Problem ist.

Folgender Code,

Code: Alles auswählen

Sub ROTEIN
        oRange = ThisComponent.Sheets(0).getCellRangeByName("A1:B6")
        oSuchen = oRange.createReplaceDescriptor()
        With oSuchen
        .SearchStyles = TRUE
        .SearchString = "GRUEN"
        .ReplaceString = "ROT"
        End With
        oRange.replaceAll( oSuchen )
            With oSuchen
            .SearchStyles = TRUE
            .SearchString = "GRUENEZAHLEN"
            .ReplaceString = "ROTEZAHLEN"
            End With
            oRange.replaceAll( oSuchen )
End Sub
funktioniert in LO überhaupt nicht! Und damit meine ich diesmal; es rührt sich gar nix, njada, njente nix, gar nix geschieht. Und damit ihr das selber in LO testen könnt ist im Anhang eine Datei wo in ein paar Zellen der Hintergrund farblich umgeschaltet werden soll, und ein paar Zellen wo die Schriftfarbe umgeschaltet werden soll und zwar gleichzeitig.

Die Buttons die für diesen, und ähnlichen (*) Code zuständig sind, lauten wie folgt:
- Rot einschalten
- Gruen einschalten

(*) ähnlich deshalb, weil er aus ROT wieder GRUEN machen soll, also umgekehrt gegenüber dem gezeigten Code.


Warum ich auf den alten Thread von mir verlinkt habe kommt jetzt.

Der dort eingangs gezeigte Code hatte mich dazu inspiriert, ihn etwas umzuschreiben. Und heraus kam dabei folgendes.

Code: Alles auswählen

Sub ROTEIN

    oBlatt = ThisComponent.sheets(0)

        oHintergrund = oBlatt.getCellRangeByName("A1:B3")
            IF oHintergrund.CellStyle = "GRUEN" THEN
                oHintergrund.CellStyle = "ROT"
            END IF

        oText = oBlatt.getCellRangeByName("A5:B6")
            IF oText.CellStyle = "GRUENEZAHLEN" THEN
                oText.CellStyle = "ROTEZAHLEN"
            END IF
end Sub
Er ist genüber dem hier oben zu sehende Code doch so um einiges kürzer. Doch jetzt kommt das dicke Fette

ABER!
So bald in dem Zellbereich auch nur eine einzige Zelle ohne, oder mit einer anderen Formatvorlage versehen ist, werden die Formatvorlagen nicht getauscht.

Ein einfaches Beispiel:
Gegebener Zellbereich = A1 bis A4
Zellbereich A1:A4 durchgehend mit identischer Formatvorlage versehen, also werden alle getauscht.
Zellbereich A1:A2 mit identischer Formatvorlage, und A3 ohne oder andere, und A4 wieder mit der identischen wie A1:A2, so werden keine Formavorlagen getauscht.

Ist auch logisch, da folgendes

Code: Alles auswählen

XRAY ThisComponent.sheets(0).getCellRangeByName("A1:A4").CellStyle
für den Zellbereich nur identische Formatvorlagen aufführt. Wenn also alle z.B. mit der Formatvorlage ROT versehen sind, dann steht in dem String auch ROT drin. Wenn aber auch nur eine einzige abweicht, dann ist der String leer. Also kann nix getauscht werden.


Eigentlich könnte ich damit ja leben. Aber in meinem Projekt werden nicht nur durchgehende Zellbereiche mit ein und derselben Formatvorlage versehen -{wo ich also das 2. gezeigte Beispiel anwenden kann}- , sondern auch unterbrochene Zellbereiche in der Form von:
B1, D1, F1, H1, J1 ...


In der Beispieldatei habe ich nicht nur den ersten Code eingebaut, der wie oben schon erwähnt aufgerufen werden kann, sondern auch den zweiten Code der wie folgt aufgerufen werden kann:

- Rot einschalten in LO
- Gruen einschalten in LO


In OOo und AOO funktionieren bei Code-Arten, jedoch nicht in LO ab ca. 3.6.x.x (vielleicht auch schon früher).


Meine Fragen lauten also jetzt:

- Warum funktioniert der erste hier gezeigte Code mit dem createReplaceDescriptor in LO ab ca. 3.6.x.x nicht?
- Wie müsste der erste Code geändert werden, damit er auch in LO funktioniert?
- Wie könnte eine alternative aussehen?
- Wer kann mir helfen?

Ich bedanke mich schon mal im voraus für Eure Bemühungen. :)



Gruß
balu
Dateianhänge
DEMO-ZELLVORLAGE_V2.ods
(12.99 KiB) 77-mal heruntergeladen
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Calc: Angewendete Zell-Formatvorlage tauschen, die 2te.

Beitrag von F3K Total »

Hallo Balu,
habe mal versucht, die Format Suche in LO von Hand durchzuführen, da muss es einen Bug geben, denn die vorhandenen Zellvorlagen werden beim Suchbegriff nicht angezeigt, wohl aber beim Ersetzungsbegriff.

Dieses Makro sollte sowohl in AOO als auch in LO funktionieren:

Code: Alles auswählen

Sub ROTEIN
		oRange = ThisComponent.Sheets(0).getCellRangeByName("A1:B6")
		oCellformatRanges = oRange.CellformatRanges
		For i = 0 to oCellformatRanges.count - 1
		    oCellformat = oCellformatRanges(i)
		    if oCellformat.CellStyle = "GRUEN" Then oCellformat.CellStyle = "ROT"
		    if oCellformat.CellStyle = "GRUENEZAHLEN" Then oCellformat.CellStyle = "ROTEZAHLEN"
		next i
End Sub
Für GRUENEIN entsprechend.



Gruß Rik
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Calc: Angewendete Zell-Formatvorlage tauschen, die 2te.

Beitrag von balu »

Hallo Rik
habe mal versucht, die Format Suche in LO von Hand durchzuführen, da muss es einen Bug geben, denn die vorhandenen Zellvorlagen werden beim Suchbegriff nicht angezeigt, wohl aber beim Ersetzungsbegriff.
Schön das Du das gemacht hast, und eine schlüssige Behauptung "Bug" aufgestellt hast. Ich bin da nämlich sehr vorsichtig bis das ich so etws sage. Denn es kann ja durchaus sein, das sich etwas im technischen Ablauf geändert hat so das noch irgendeine Bedingung mit aufgenommen werden muss, damit es Funktioniert.
So nach dem Motto:
Wenn man per Makro ein Diagramm erstellt, dann muss auch die Füllfarbe für die Wand mit angegeben werden oder explizit ausgeschaltet werden, denn ansonsten wird die Wand mit Grau 10% gefüllt -{das entspricht der realität in LO}-. Während bei OOo und AOO kein Zwang zur Wandfüllfarbe besteht, wenn nix angegeben ist wird halt auch nix genommen.

Du siehst, es besteht schon ein Unterschied zwischen den beiden aktuellen Projekten (LO und AOO). Und deshalb bin ich ja auch so ins schleudern gekommen. Und das nächste Problem mit LO steht auch schon an, aber das kommt später in einem extra Thread.

Dieses Makro sollte sowohl in AOO als auch in LO funktionieren:
Kann ich bestätigen.


Oh man was bin ich stinkig. Erst Qäult man sich einen ab, damit in OOo/AOO und LO 3.3.0 alles bestens läuft, und dann macht LO Bocksprünge. Und das heißt für mich: Wieder ran an die Bouletten, und Ursachenforschung zur Problembesitigung betreiben. Na das wird wieder mägga luschdich :? .

Spoilerwarnung!
Ich werde bestimmt demnächst noch mehrere Threads mit LO-Problemen eröffnen.


Wie auch immer. Ich danke dir aufrichtig von Herzen für deine Arbeit :D . Denn dadurch ist zumindest schon mal ein Problem mit LO gelöst.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Karolus
********
Beiträge: 7438
Registriert: Mo, 02.01.2006 19:48

Re: Calc: Angewendete Zell-Formatvorlage tauschen, die 2te.

Beitrag von Karolus »

Hallo

Es ist nicht nur ein Bug, es ist sogar ein bereits gemeldeter

Das frustrierende dabei:
Die Bugmeldung schlummert dort seit 2 Jahren, ohne wesentliche Reaktionen, das einzige was kommt ist eine automatisch generierte Nachricht mit sinngemäss der Aussage:
Man möge doch bitte nochmal gegen die aktuelle 5.nochwas testen (vielleicht hat sich der Fehler ja wieder zufällig :lol: in Luft aufgelöst)
Ok - der Teil in der Klammer ist meine Interpretation.
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Calc: Angewendete Zell-Formatvorlage tauschen, die 2te.

Beitrag von balu »

Hallöchen!

Eigentlich wollte ich mich ja wegen was anderem Rückmelden, aber zu erst kommt Karolus an die Reihe.
Karolus hat geschrieben: Es ist nicht nur ein Bug, es ist sogar ein bereits gemeldeter
Na gug mal einer wie er gugt.

Karolus hat geschrieben: Das frustrierende dabei:
Die Bugmeldung schlummert dort seit 2 Jahren, ohne wesentliche Reaktionen
Und dabei scheint ar aber schon länger zu bestehen. Denn wie ich ja schon eingangs sagte
balu hat geschrieben: jedoch nicht in LO ab ca. 3.6.x.x (vielleicht auch schon früher)
kam diese Version irgendwann so um ende 2012 raus und mit der hatte ich das ja auch getestet. Aber nun gut, zwischen feststellen eines Bug und seiner Meldung klaffen ja manchmal gewisse Zeitunterschiede.

Aber dennoch danke ich dir Karolus für deine Nachricht.


So, und nun zu dem warum ich mich eigentlich noch mal Rückmelden wollte.

Ich habe jetzt den Code von Rik genommen, und in meine Projektdatei eingebaut.
Kurz etwas dazu, zum besseren Verständnis.
Die Datei umfasst in diesem Testfalle 30 Tagesblätter, mit je einem Diagrammen pro Blatt und einen "etwas größeren" Datenbereichen (AA1:BB108) aber auch nur mit 2 Formatvorlagen pro Blatt.

Mit dem ersten hier gezeigten Code unter Einsatz des createReplaceDescriptor dauerte der Prozess: Öffnen der Datei, ein paar kleinigkeiten vor und nach der gezeigten Coderoutine ca. 3 Sekunden.

Und jetzt mit der geänderten Routine je nach Office folgende Zeiten.
OOo 3.2.1 (richtig installiert) ca. 40 sek.
OOo 3.2.1 (portable) ca. 40 sek.
AOO 4.1.1 (portable) ca. 50 sek.
LO 4.2.1.1 (portable) ca. 70 sek.
LO 4.3.4.1 (portable) ca. 65 sek.

Auch wenn ich mich vielleicht um die ein oder andere Sekunde vertan habe, so ist doch deutlich zu sehen das der Code, obwohl so schön kurz ist, doch recht lange braucht bis er fertig ist. Das ist wohl sehr schade, aber so ist das nun mal halt.

Ich komme deshalb zu dem Entschluss, dass ich mich wohl doch für eine andere Methode entscheiden werde. Ich werde wohl mit Spalten ausblenden arbeiten. Auch wenn ich sie eigentlich vermeiden wollte, so ist sie momentan die bessere alternative (zumindest so lange wie der Bug in LO nicht beseitigt ist).

Auch wenn ich den Code nicht mehr anwenden werde, so heißt das ja nicht das er generell nicht funktioniert oder überhaupt nicht angewendet werden kann. Vielleicht ist er ja anderen Usern behilflich.


Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Karolus
********
Beiträge: 7438
Registriert: Mo, 02.01.2006 19:48

Re: Calc: Angewendete Zell-Formatvorlage tauschen, die 2te.

Beitrag von Karolus »

Hallo Balu

Teste mal mit

Code: Alles auswählen

...UniqueCellFormatRanges
# anstelle von
...CellFormatRanges
Karolus
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Calc: Angewendete Zell-Formatvorlage tauschen, die 2te.

Beitrag von balu »

Mahlzeit Karolus!

Danke für deinen Vorschlag. :)
Mit UniqueCellFormatRanges ergaben sich jetzt folgende Zeiten.

OOo 3.2.1 (richtig installiert) ca. 5 sek. -> 40
OOo 3.2.1 (portable) ca. 5 sek. -> 40
AOO 4.1.1 (portable) ca. 16 sek. -> 50
LO 4.2.1.1 (portable) ca. 18 sek. -> 70
LO 4.3.4.1 (portable) ca. 18 sek. -> 65

Ist also schon mal nicht schlecht, der Zeitunterschied zwischen UniqueCellFormatRanges und CellFormatRanges.

Der Zeitenvergleich ist wohl keine Hunderprotzentige angelegenheit, da per Auge die Zeit aufgenommen wurde, aber das Ergebnis ist dennoch eindeutig.

Aber kannst Du mir vielleicht auch mal den eigentlich Unterschied zwischen den beiden erklären, oder weißt Du das nicht so ganz genau?


Ich muss mich selber mal korrigieren.
balu hat geschrieben: Mit dem ersten hier gezeigten Code unter Einsatz des createReplaceDescriptor dauerte der Prozess: Öffnen der Datei, ein paar kleinigkeiten vor und nach der gezeigten Coderoutine ca. 3 Sekunden.
Hatte ich vergessen gehabt zu erwähnen, das sich das nur auf OOo 3.2.1 als referenzzeit bezog.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Karolus
********
Beiträge: 7438
Registriert: Mo, 02.01.2006 19:48

Re: Calc: Angewendete Zell-Formatvorlage tauschen, die 2te.

Beitrag von Karolus »

Hallo
Balu hat geschrieben:Aber kannst Du mir vielleicht auch mal den eigentlich Unterschied zwischen den beiden erklären, oder weißt Du das nicht so ganz genau?
ohne Unique zerlegt den Ausgangsbereich in ein Mosaik aus rechteckigen Unterbereichen in denen jeweils ein Zellformat benutzt wird. ( →→ein Postcontainer mit ganz vielen Päckchen )

Mit Unique werden zusätzlich die "gleichfarbigen***" Mosaiksteinchen jeweils in ihren eigenen "Koffer" (Multi-zellbereich) gesammelt. ( →→ein Postcontainer mit Postsäcken die jeweils ins gleiche Verteilzentrum gehen)
Das hättest du aber auch mit Hilfe von Mri in drei Minuten selbst rausfinden können.

***sinnbildlich
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Calc: Angewendete Zell-Formatvorlage tauschen, die 2te.

Beitrag von F3K Total »

Hallo Balu,
kannst Du mal eine solche Datei, bei der das so lange dauert, ggf. verfremdet, zur Verfügung stellen?
Gruß Rik
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Calc: Angewendete Zell-Formatvorlage tauschen, die 2te.

Beitrag von balu »

Hallo.

@Karolus
Tschuldi, aber ich bin extrem genervt.
Das hättest du aber auch mit Hilfe von Mri in drei Minuten selbst rausfinden können.
Was hätte ich da rausfinden können? Egal ob Xray, oder Mri, beide sagen mir das gleiche (bei einem Zellbereich AA1:BB108 mit 2 unterschiedlichen angwendeten Formatvorlagen). Und zwar:

CellFormatRanges gibt bei Count 111 aus.
UniqueCellFormatRanges gibt bei Count 12 aus.

Und was soll mir das jetzt sagen?

Sorry, es ist doch aber so, dass ich bestimmt nicht alle Namen die mir die genannten Tools ausgeben, sofort verstehe, und besonders nicht den tieferen Sinn des Namen der da hinter steckt. Einige kann man mit der Zeit verstehen, aber andere bleiben einem ein Rätsel. Und wenn man dann noch z.B. sich mit der API rumschlagen muss, die nicht jeder versteht der die englische Sprache nicht als seine Muttersprache sein eigen nennt, dann steht man noch mehr auf dem Schlauch. Und die google-Übersetzung davon ist da auch nicht hilfreich.

Glaubst Du denn etwa allen ernstes das ich hier blöde rumsitze und nix tue!? 12 bis 15 Stunden am Stück rumdoktorn (nicht nur ein Tag, sondern mehrere hinterinander) und versuchen herauszubekommen warum in LO bestimmte Sachen nicht so funktionieren wie in OOo/AOO rauben schon einem den letzten, und zwar den allerletzten Nerv. Und dabei ist das Hauptproblem hier noch recht harmlos gegenüber dem was als nächtes mit LO ansteht.


Aber dennnoch ein Danke schön für deine Erklärung, sie hilft mir beim Verstehen schon sehr.




@Rik
kannst Du mal eine solche Datei, bei der das so lange dauert, ggf. verfremdet, zur Verfügung stellen?
Das würde ich wohl gerne machen wollen, jedoch habe ich da einiges zu überarbeiten und das geht nicht von jetzt auf gleich. Es kann wohl etwas dauern bis das ich sie hier anhänge.

Aber nach dem jetzigen Stand der Dinge wird mir wohl nix anderes übrigbleiben, als das nächste Problem in Angriff zu nehmen und davon eine abgespeckte Datei dann im anderen Thread als Beispiel anzuhängen. Obwohl anderes Thema, handelt es sich um die gleiche Datei (Dateien). Ist etwas kompliziert, da die eine Datei auf der anderen aufbaut.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Antworten