[gelöst] Warum funktioniert ein Makro nicht auf allen Tabellenblättern?

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

Moderator: Moderatoren

junmod
**
Beiträge: 31
Registriert: Di, 07.02.2012 09:06

[gelöst] Warum funktioniert ein Makro nicht auf allen Tabellenblättern?

Beitrag von junmod »

Hallo Forum,

ich stehe gerade vor einem Problem:
Ich habe mit Calc ein Dokument mit mehreren Tabellenblättern erstellt, 2 davon habe ich mit einem Datumsfeld versehen und dann mit folgendem Makro verknüpft

Code: Alles auswählen

Sub Setze_Datum()
With ThisComponent.CurrentController.getActiveSheet
   dpf = .Drawpage.Forms
   dfn = dpf.getByName("Formular").GetByName("blablabla").date
   .getCellRangeByName("A1").FormulaLocal = CDateFromIso(dfn)
End With
End Sub
wobei sich die Makros bei "blablabla" und "A1" unterscheiden.
Und jetzt kommt mein Problem, denn im ersten Tabellenblatt funktioniert alles prima und im zweiten streikt das Makro. Ich habe es mit 2 getrennten Makros für jedes Blatt probiert und auch mit einem gemeinsamen Makro, ohne Erfolg.
Unbenannt.png
Unbenannt.png (11.72 KiB) 7525 mal betrachtet
Es wäre prima wenn mir jemand helfen könnte.

Gruß
Dirk
Zuletzt geändert von junmod am Do, 06.10.2016 06:42, insgesamt 1-mal geändert.
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Warum funktioniert ein Makro nicht auf allen Tabellenblättern?

Beitrag von F3K Total »

Hallo,
wenn du eine verfremdete Beispieldatei hochlädst, kann dir sicher jemand helfen.
Vermutlich heißt das strukturelle Formular auf der Drawpage des zweiten Tabellenblattes nicht "Formular".
Wieso verwendest du ein Datumsfeld um eine Zelle zu füllen?
Gruß R
junmod
**
Beiträge: 31
Registriert: Di, 07.02.2012 09:06

Re: Warum funktioniert ein Makro nicht auf allen Tabellenblättern?

Beitrag von junmod »

Hallo R,

vielen Dank für die schnelle Antwort.
Wieso verwendest du ein Datumsfeld um eine Zelle zu füllen?
Ich finde es einfach überersichtlich, wenn ich ein Datum aus einer Art Kalender auswählen kann.
wenn du eine verfremdete Beispieldatei hochlädst, kann dir sicher jemand helfen.
Ich habe die Datei ohne alles Störende, genaugenommen ohne Inhalt angefügt und testweise in jedes der 9 Tabellenblätter die 2 Datumsfelder eingefügt, aber beide funktionieren nur in 2 Tabellenblättern. Genau das macht mich ratlos. Kann es an einer Einstellung der Tabellenblätter liegen?

Gruß
Dirk
Dateianhänge
Kopie.ods
(29.17 KiB) 198-mal heruntergeladen
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Warum funktioniert ein Makro nicht auf allen Tabellenblättern?

Beitrag von Stephan »

also ich finde auf die Schnelle den Fehler nicht (ich würde aber z.B. aus Prinzip nicht zwei gleichnamige Makros verwenden)

Als Lösung würde ich vorschlagen den Bezug auf das Datumssteuerelement direkt zu übergeben und nicht indirekt herzustellen, z.B. so:

Code: Alles auswählen

Sub Setze_Datum(tmp)
With ThisComponent.CurrentController.getActiveSheet
   .getCellRangeByName("A11").FormulaLocal = CDateFromIso(tmp.Source.date)
End With
End Sub


Gruß
Stephan
Karolus
********
Beiträge: 7438
Registriert: Mo, 02.01.2006 19:48

Re: Warum funktioniert ein Makro nicht auf allen Tabellenblättern?

Beitrag von Karolus »

Hallo

Ich würde vorschlagen dem Argument das da durchgereicht wird einen passenderen Namen zu geben, und dann direkt den Text übernehmen.

Code: Alles auswählen

Sub Setze_Datum( event )
With ThisComponent.CurrentController.getActiveSheet
   .getCellRangeByName("A11").FormulaLocal = event.Source.Text)
End With
End Sub
Damit ist das ohne weitere Verrenkungen auch kompatibel mit LO-calc
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
junmod
**
Beiträge: 31
Registriert: Di, 07.02.2012 09:06

Re: Warum funktioniert ein Makro nicht auf allen Tabellenblättern?

Beitrag von junmod »

Hallo Stephan,

jetzt funktioniert's.

Klasse!!!

Das Umbenennen der Makros ist ja kein Problem.

Ich danke Dir

@Karolus: Ich danke auch Dir für die Antwort. Kannst Du Dir einen Reim darauf machen warum es vorher nicht ging?

Gruß
Dirk
Karolus
********
Beiträge: 7438
Registriert: Mo, 02.01.2006 19:48

Re: Warum funktioniert ein Makro nicht auf allen Tabellenblättern?

Beitrag von Karolus »

junmod hat geschrieben: @Karolus: Ich danke auch Dir für die Antwort. Kannst Du Dir einen Reim darauf machen warum es vorher nicht ging?
Nein kann ich nicht, aber den praktisch doppelt vorhandenen Code würde ich vermeiden:

Code: Alles auswählen

Sub Setze_Datum(event)

if event.Source.Model.Name = "Lieferdatum" then
    ziel = "A3"
else
    ziel = "A11"
end if

With ThisComponent.CurrentController.getActiveSheet   
   .getCellRangeByName(ziel).FormulaLocal = event.Source.Text
End With

End Sub
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Warum funktioniert ein Makro nicht auf allen Tabellenblättern?

Beitrag von Stephan »

Kannst Du Dir einen Reim darauf machen warum es vorher nicht ging?
Warum tust Du das nicht selbst? Makros debugt man nicht durch Quizfragen im Forum sondern indem man sich hinsetzt und sie ... ja eben ... debugt, denn es zählt dabei nicht mögliches 'Mehrwisssen' von Experten sondern ganz überwiegend die praktische Überprüfung und Eingrenzung des Fehlers.

die Fehlerzeile ist:

Code: Alles auswählen

dfn = dpf.getByName("Formular").GetByName("blablabla").date
also fange da an zu gebuggen und nimm das erste Objekt:

Code: Alles auswählen

Msgbox dpf.hasByName("Formular")
liefert True also ist das in Ordnung. Nimm den zweiten Teil:

Code: Alles auswählen

Msgbox dpf.getByName("Formular").hasByName("blablabla")
... aha, das liefert False, also finde nun heraus was an der Stelle nicht stimmt, möglicherweise der konkrete Name?

Bitte finde es heraus und antworte nicht gleich es wäre alles in Ordnung, denn mit den Diskussionen wo der Hilfesuchende beschwört es wäre ja alles in Ordnung und dann nach tagelangem wechselseitigem Posten die Entschuldigung kommt es täte ihm leid er habe das nur übersehen, ist das Forum hinreichend gefüllt.
Auch ich selbst stecke manchmal fest und auch ich selbst kopiere dann notfalls Namen von Elementen direkt, obwohl ich vorher zehnmal hingeschaut hatte und alles richtig aussah stelle ich dabei dann doch fest ich habe mich nur verschrieben.



Gruß
Stephan
junmod
**
Beiträge: 31
Registriert: Di, 07.02.2012 09:06

Re: Warum funktioniert ein Makro nicht auf allen Tabellenblättern?

Beitrag von junmod »

@Karolus
aber den praktisch doppelt vorhandenen Code würde ich vermeiden
Genau den gleichen Gedanken hatte ich gestern auch und hatte schon angefangen zu tüfteln. Danke.


@Stephan
Warum tust Du das nicht selbst? Makros debugt man nicht durch Quizfragen im Forum sondern indem man sich hinsetzt und sie ...
Genau das habe ich versucht, aber irgendwann ist man an einem Punkt wo es nicht weiter geht und ich empfinde es nicht als Quizfragen, denn...
also finde nun heraus was an der Stelle nicht stimmt, möglicherweise der konkrete Name?
kopiere dann notfalls Namen von Elementen direkt.......stelle ich dabei dann doch fest ich habe mich nur verschrieben.
daran kann es ja nicht gelegen haben wenn ich alle 2 Datumsfelder in alle Tabellenblätter kopiere, sie aber nur in 2 von 9 funktionieren, obwohl sie alle auf die gleichen 2 Makros zugreifen.
Bitte finde es heraus und antworte nicht gleich es wäre alles in Ordnung,
Entschuldige bitte, aber was soll ich anderes antworten, wenn Dein Vorschlag das Datumssteuerelement direkt zu übergeben auch dort funktioniert, wo vorher nichts funktionierte?

Ich habe wirklich nicht vor das Forum voll zu müllen, ich sitze auch mindestens ein paar Tage an einem Problem bevor ich euch um Rat frage denn ich freue mich jedesmal auf's Neue wenn meine Vorhaben funktionieren und ich bin viel zu ehrgeizig um schon nach 10 Minuten aufzugeben.

Gruß
Dirk
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Warum funktioniert ein Makro nicht auf allen Tabellenblättern?

Beitrag von Stephan »

Entschuldige bitte, aber was soll ich anderes antworten, wenn Dein Vorschlag das Datumssteuerelement direkt zu übergeben auch dort funktioniert, wo vorher nichts funktionierte?
Ich habe wirklich nicht vor das Forum voll zu müllen, ich sitze auch mindestens ein paar Tage an einem Problem bevor ich euch um Rat frage denn ich freue mich jedesmal auf's Neue wenn meine Vorhaben funktionieren und ich bin viel zu ehrgeizig um schon nach 10 Minuten aufzugeben.
Du brauchst dich nicht zu entschuldigen, denn Du hast nichts Falsches getan, Dein Vorgehen ist nur unzweckmäßig denn jeder hier im Forum weiß doch das das Makro debuggt werden muss und das Du das genausogut tun kannst wie wir, es ist einfach so das mir meine ganze Erfahrung da auch nicht hilft, sondern das für mich die Arbeit genauso groß ist, eher etwas höher, weil ich in Deinen Code (wenn er länger wäre) nicht eingearbeitet bin.

Einzig, und deswegen ist der Versuch zu fragen nicht falsch, kann es immer mal sein das ein sehr spezieller Fehler vorliegt der Erfahrenen gleich ins Auge sticht, das ist hier im Konkreten aber nicht der Fall.


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

Re: Warum funktioniert ein Makro nicht auf allen Tabellenblättern?

Beitrag von balu »

Hallo Leute,

ich diskutiere nicht mit beim Thema "Debuggen", weil das nix bringt so lange man sich nicht die Datei an anderen Stellen mal etwas genauer angeschaut hat.
junmod hat geschrieben: Kannst Du Dir einen Reim darauf machen warum es vorher nicht ging?
Unter vorbehalt sage ich jetzt mal: "Ja, ich kann!"

Das von dir beschriebene kopierverfahren und die geschilderte und gezeigte Fehlermeldung machte mich doch etwas stutzig. Denn nach meinem verständniss dürfte es eigentlich gar nicht zu einer Fehlermeldung kommen, wenn die Datumsfelder kopiert und an anderer Stelle eingefügt werden.

Ich hatte beim betrachten der Datei wohl schon so einen leichten unbestätigten Verdacht, aber bevor ich den hier aussprechen wollte, musste ich erstmal eine neue und leere Datei nehmen und im groben die Beispieldatei von Dirk nachbauen um der Sache näher auf den Grund zu gehen.

Nach dem ich meine Datumsfelder fast 1:1 nach der Beispieldatei aufgebaut hatte -{bezogen auf die technisch relevanten Informationen, also ohne Form, Größe und Farbe}-, musste ich anschließend beim kopieren und einfügen mit anschließendem Datum auswählen feststellen:

Es funktioniert so wie es soll, und das mit seinen Makros.


Jetzt kann ich auch meinen Verdacht laut aussprechen.

Die Datei hatte entweder eine Excel Vorgeschichte, oder sie wurde zwischenzeitlich in Excel bearbeitet, oder als Excel Datei gespeichert anstatt als ods.

Dafür sprechen zumindest für mich folgende Punkte. Es kann aber auch sein das ich mich vielleicht bei einem Punkt irre, aber im groben müsste ich schon recht haben.

Also, schaut Euch mal die Zellformatvorlagen (F11) etwas genauer an.
Wie kommen folgende Vorlagen zustande?

Code: Alles auswählen

ConditionalStyle_1
[...]
ConditionalStyle_5
Und ferner.

Code: Alles auswählen

Excel Built-in Normal
Selbst wenn ich großzügig sagen würde, das ConditionalStyle noch nix zu sagen hat, so sähe die Sache aber spätestens bei *Excel Built-in* schon ganz anders aus, da mir das irgendwie bekannt vor kommt. Und wer erstellt schon in einer OO-Datei freiwillig eine Zellformatvorlage mit dem Namen "Excel....."? Also ich bestimmt nicht. ;-)

Also kann ich nur eins sagen, Dirk, mach deine Datei noch mal komplett neu und diesmal ohne irgendwelchen Excel kontakt. Denn so meine Vermutung; Excel haut dir sonst wieder ein dickes fettes Ei rein was dich dann wieder zur Verzweiflung bringt.

Meine angehängte Beispieldatei besteht aus mehreren Tabellenblättern, wo drin sich immer 2 Datumfelder befinden die ich zuvor aus dem 1. Blatt kopiert und dann dementsprechend eingefügt habe und die sich alle auf deine beiden Makros beziehen.

Erstellt unter AOO 4.1.2, gegengetestet unter AOO 4.0.1 bis 4.1.1. Und keine Probleme gehabt.



Gruß
balu
Dateianhänge
Datumfelder-kopiert.ods
(11.88 KiB) 137-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
Karolus
********
Beiträge: 7438
Registriert: Mo, 02.01.2006 19:48

Re: Warum funktioniert ein Makro nicht auf allen Tabellenblättern?

Beitrag von Karolus »

Hallo

Ich hatte irgendwo oben schon erwähnt, das etwa seit LO4 diese Umwandlung mit:

Code: Alles auswählen

…CDateFromIso(dfn)
fehlschlägt!
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
junmod
**
Beiträge: 31
Registriert: Di, 07.02.2012 09:06

Re: Warum funktioniert ein Makro nicht auf allen Tabellenblättern?

Beitrag von junmod »

Hallo balu,
Die Datei hatte entweder eine Excel Vorgeschichte, oder sie wurde zwischenzeitlich in Excel bearbeitet, oder als Excel Datei gespeichert anstatt als ods.
Du hast Recht, mein Kollege hatte die ursprüngliche Datei mit Excel erstellt und ich habe in OpenOffice Veränderungen vorgenommen und sie weiter ausgebaut.
Also kann ich nur eins sagen, Dirk, mach deine Datei noch mal komplett neu und diesmal ohne irgendwelchen Excel kontakt
Da sollte ich wirklich mal drüber nachdenken, denn ich hatte schon öfter Probleme die ich mir nicht erklären konnte.

Ich danke Euch allen für Eure Hilfe!!!

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

Re: [gelöst] Warum funktioniert ein Makro nicht auf allen Tabellenblättern?

Beitrag von F3K Total »

Hallo zusammen,
es liegt nicht an Excel. Es ist schlicht folgendes, es gibt auf den Tabellenblättern, auf denen das Makro nicht funktioniert, mehrere Formulare mit dem gleichen Namen:Formular
Zur Erklärung:
Jedes Tabellenblatt hat eine Drawpage, der Bereich auf dem Kontrollfelder und strukturelle Formulare liegen. Wenn die Struktur zum ursprünglichem Makro passen soll, muss sie so aussehen:
FN_Code.png
FN_Code.png (25.32 KiB) 7151 mal betrachtet
Das heißt auf den Formularen (im Makro englisch: Forms) liegt ein strukturelles Formular mit dem Namen Formular, auf diesem befinden sich die Kontrollfelder wie Lieferdatum
Diese Reihenfolge findet sich auch im Makro wieder:
dpf = .Drawpage.Forms
dfn = dpf.getByName("Formular").GetByName("Lieferdatum").date
Wie der Benutzer es genau hinbekommen hat, kann ich nicht sagen aber die Tabellenblätter, auf denen das ursprüngliche Makro nicht funktionieren kann, sehen im Formularnavigator so aus:
FN_3fach.png
FN_3fach.png (40.71 KiB) 7151 mal betrachtet
Ja, und da hat das Makro so ein Problem, es soll sich zwischen mehreren Formularen, bis zu drei, mit dem gleichen Namen Formular entscheiden :D Das kann nicht funktionieren. Also, z.B. das Optionsfeld auf das Formular mit den Datumsfeldern verschieben und dann leere Formulare löschen. Es darf nur ein Formular mit dem Namen Formular geben!
Gruß R
Antworten