[gelöst] CALC: Macro mit Dialog - fehlerhafte Ausführung

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: [gelöst] CALC: Macro mit Dialog - fehlerhafte Ausführung

Re: CALC: Macro mit Dialog - fehlerhafte Ausführung

von theindless » Do, 03.05.2012 17:03

*auchvornKopfklatsch*

Hätte ich auch selber merken können *schäm*

Nu funktionierts!

Danke balu

theindless

Re: CALC: Macro mit Dialog - fehlerhafte Ausführung

von balu » Do, 03.05.2012 16:45

Hallo theindless,

oooooooooooohhhhhhhhhhh mmmaannnnnnnnnn! Wie blind ich doch war! *hand-vor-kopf-klatscht* :oops:

Hätte sich einer unserer Makro-Profis sich deinen Code angeschaut, dann wär das Thema schon längst erledigt gewesen. Doch so kommt die Lösung etwas später, aber sie kommt.

Das in der Zelle der Text nicht umgebrochen wird, liegt daran das Du dir wohl höchstwahrscheinlich selber ein dickes fettes Ü-Ei gelegt hast. Und ich Dummy() hatte das übersehen.

Der Fehler liegt in folgender Code-Zeile

Code: Alles auswählen

oSheet.GetCellByPosition(2,3).formulalocal = oDialog.getControl("Eingabe").text
beziehungsweise in der aktuelleren Version

Code: Alles auswählen

oNotizSheet.getCellRangeByName("C4").formulalocal = oDialog.getControl("Eingabe").text
Richtig muss nämlich die Zeile wie folgt lauten.
oNotizSheet.getCellRangeByName("C4").string = oDialog.getControl("Eingabe").text
formulalocal ist in diesem Falle total fehl am Platze!

Das wars! Damit dürfte dein Problem gelöst sein :D



Gruß
balu

Re: CALC: Macro mit Dialog - fehlerhafte Ausführung

von balu » Do, 03.05.2012 12:47

Hallo theindless,
danke für die ausführliche Erklärung.
Wenns denn dir hilft, gern geschehn :).


Da ich "Option explicit" genutzt hatte, musste ich zusätzlich oRow in der Sub NoteEntry noch deklarieren.
In deiner ersten Beispieldatei seh ich aber nichts davon, denn dort hattest Du oRow in der sub init deklariert und in der sub NoteEntry definiert. Aber nun gut, lassen wir das.


Da haben wir uns glaub ich missverstanden.
Falsch mein Freund!
Da habe ICH dich falsch verstanden.

Das Problem tritt auf, wenn ich z.B. eingebe (jeweils mit Enter in neue Zeile)
Jetzt hats auch bei mir endlich *Klick* gemacht. Und ja, ich kann das unter den schon genannten Testumgebungen bestätigen und nachvollziehen.

d.h. er verarbeitet die Zeilenumbrüche nicht.
Das stimmt so nicht ganz. Denn Calc interpretiert die Enter-Taste nicht als Zeilenumbruch, sondern als *Zelleingabe beendet*, mal ganz lapidar gesagt.

Wie dein Problem beseitigt werden könnte, weiß ich momentan nur theoretisch da ich das praktisch noch nicht angewendet habe. Das müsste dann in etwa so ablaufen.

Bevor Du den Text aus oDialog.getControl("Eingabe") direkt in die Zelle schreibst, muss er erstmal in ein Array geschrieben werden. In diesem Array müssen dann alle "Zeilenrückläufe" -{CHR$(13)} durch einen Zeilenumbruch -{CHR$(10)} ersetzt werden. Und dann könnte theoretisch dieses Array anschließend in die Zelle geschrieben werden.

Zeilenrücklauf? Fragst Du dich jetzt bestimmt.
Nun, ich hatte dir ja hier in meiner ersten Antwort den Link zu der deutschen Übersetzung von Andrews Makro-Dokument kundgetan. Und dort ist im Kapitel: 3.3.6. String-Variablen enthalten Text, eine Tabelle (Tabelle 10. Zu Visual Basic kompatible Stringkonstanten.) wo einige CHR-Befehle aufgeführt sind. Und dort ist CHR$(13) als Zeilenrücklauf aufgeführt.

Im OOo-Wiki gibt es ein simples Beispiel das Du als gegentest nutzen kannst um den Unterschied zwischen Zeilenrücklauf und Zeilenumbruch zu sehern, was jetzt aber nur Calc betrifft.
2.2.2. Einen Zeilenumbruch einfügen
In dem Beispiel brauchst Du nur ZEICHEN(10) durch ZEICHEN(13) tauschen, und schon siehst Du was ich meine.

Also praktisch kann ich dir momentan nicht weiter helfen, da mein Wissensstand dafür nicht ausreicht. Aber vielleicht kann ja jemand anderer weiterhelfen, was ich dir Wünsche.



Gruß
balu

Re: CALC: Macro mit Dialog - fehlerhafte Ausführung

von theindless » Do, 03.05.2012 09:01

Hallo Balu,

danke für die ausführliche Erklärung.

Wenn ich oDoc, oSheets, oSheet als "public" deklariere, funktioniert der Code.
Da ich "Option explicit" genutzt hatte, musste ich zusätzlich oRow in der Sub NoteEntry noch deklarieren.
Wenn Du weiterhin Probleme mit den Leerzeichen zwischen den Wörtern hast, vermute ich das etwas mit deinem Benutzerprofil nicht stimmt. Denn weder in OOo 3.2.1, 3.3.0 noch in LO 3.3.4 werden bei mir hier unter WinXP Leerzeichen ignoriert.
Da haben wir uns glaub ich missverstanden.

Das Problem tritt auf, wenn ich z.B. eingebe (jeweils mit Enter in neue Zeile)

Test
Test
Test

dann zeigt es mit in der Zelle nach dem Eintragen

TestTestTest

an, d.h. er verarbeitet die Zeilenumbrüche nicht.
Wenn ich allerdings über F2 den Edit-Modus starte, werden wieder mehrere Zeilen angezeigt.

Komisch...

theindless

Re: CALC: Macro mit Dialog - fehlerhafte Ausführung

von balu » Mi, 02.05.2012 16:23

Hallo theindless,
Kann es sein, dass ich da grundsätzlich was falsch verstehe?
Ja.
Dazu komme ich gleich noch.

Kann ich überhaupt in der Sub "init" eine Definition wie

Code: Alles auswählen

oDoc = ThisComponent
machen, die für alle Subs des Moduls gelten?
Ja.
Jedoch, und da wird es dann schon etwas verzwickter, kommt es wirklich auf das gesamte Makro drauf an.
Zu unterscheiden gilt:
- Wird mit Formularen gearbeitet, wie z.B. einem Button in der Tabelle?
- Wird mit Dialogen gearbeitet?
- Kommen Formulare UND Dialoge zum Einsatz?
- Werden weder Formulare noch Dialoge eingesetzt?
- Aus wievielen Modulen besteht das Makro?
- Wenn mehrere Module, welche Variablen werden in den anderen Modulen angewendet?

Mal ein kleiner versuch zu verdeutlichen was ich damit sagen will, und vielleicht verstehst Du dann auch Dannenhöfer besser.

In dem einen Thread von dir: Mehrere Inputbox-Variablen vereinfachen, ist ja eine Beispieldatei von mir; Simpler_Dialog_anstatt_Inputboxen_0.ods
Und mit dieser kannst Du eigentlich recht gut testen was passiert wenn...

Füge dort in der sub auswerten nach der Zeile mit oDialog1.endexecute noch folgende 2 Zeilen ein.

Code: Alles auswählen

	oSheet = oDoc.Sheets(0)
	oSheet.getcellByPosition(0,10).value = 123456
Nun klicke auf den Grünen Button im Tabellenblatt, und klicke gleich im Dialog auf OK. Das Ergebnis ist sehr eindeutig, denn Du wirst ne Fehlermeldung bekommen.
Und warum?
Weil die Variablen oDoc und oSheet nur in der Sub Projekt_erfassen_Array deklariert und definiert sind. Sie sind also nur dort gültig, sie sind also nur Lokal wirksam. Und das ist dein ungewollter Fehler.

Damit aber die Variablen oDoc und oSheet auch in der sub auswerten gelten, müssen sie Öffentlich deklariert werden. Und das geschieht dadurch, das sie nicht in einer Sub, sondern ganz am Anfang eines Moduls "freistehend" deklariert werden. Genau so wie dort zu sehen mit diesen beiden Zeilen.

Code: Alles auswählen

	Public oDialog1 as Object
	Public oProjektBlatt as Object
Folglich müssten dann in ungefähr die allerersten Zeilen wie folgt aussehen.

Code: Alles auswählen

	Public oDialog1 as Object
	Public oProjektBlatt as Object
	dim oDoc as Object, oSheet as Object
Ob jetzt Dim oder Public angewendet wird, ist wahrscheinlich Geschmackssache. -{Bin ich mir aber noch nicht so 100pro sicher.}- Auf jeden Fall kann jetzt in in der Sub Projekt_erfassen_Array die Zeile mit den Dim gelöscht werden.

Die deklaration der Varialen ist also Öffentlich erledigt worden. Nun können die Variablen in einer Sub defeniert werden, und sie gelten dann auch in anderen Subs, so wie zu sehen mit oProjektBlatt.


Je nach Aufgabe und Funktionalität des Makros reicht es einmal

Code: Alles auswählen

oDoc = ThisComponent
zu deklarieren und zu defenieren. Aber pauschal gilt die Aussage dennoch nicht, da die von mir eingangs genannten Punkte zum tragen kommen. Es sei denn, Du nimmst anstatt Dim oder Public die "dauernd" wirkende Global. Diese jedoch bitte mit Vorsicht anwenden!


Wenn Du weiterhin Probleme mit den Leerzeichen zwischen den Wörtern hast, vermute ich das etwas mit deinem Benutzerprofil nicht stimmt. Denn weder in OOo 3.2.1, 3.3.0 noch in LO 3.3.4 werden bei mir hier unter WinXP Leerzeichen ignoriert.



Gruß
balu

Re: CALC: Macro mit Dialog - fehlerhafte Ausführung

von theindless » Mi, 02.05.2012 14:37

Hallo balu,

ich habe gerade deine Datei ausprobiert und folgende Sonderheit bemerkt, die ich auch schon hatte.

Ich habe eine neue Notiz über 4 Zeilen angelegt und bekomme jetzt in C3 den Text ohne Umbruch und Leerzeichen.
Wenn ich in den Editier-Modus gehe (F2) werden aber normal 4 Zeilen angezeigt. :?

Die Datei füge ich nochmals bei.


Ach ja... nicht dass es an der Version liegt:

Windows Vista; OO 3.3.0 Build: 9567
Dateianhänge
Notiz-Test.ods
(13.59 KiB) 95-mal heruntergeladen

Re: CALC: Macro mit Dialog - fehlerhafte Ausführung

von theindless » Mi, 02.05.2012 14:13

Hallo balu,

danke für deine Hilfe!
Und das kann nicht funktionieren. Richtigerweise muss das wohl so lauten.

Code: Alles auswählen

    Standard.Module1.NewNote (document, Basic)
ähm... das resultiert aus einem Fehler von mir.
Ich hatte das Macro unter "Meine Makros" geschrieben und nur zum hochladen ins Dokument verschoben.
"Automatischer Zeilenumbruch"(*)
Das müsste wiederum im Macro geschehen, da ich ja jeweils neue Zeilen oben in meinem Datenbereich einfüge.
Muss ich mal schauen, wie das funktioniert.
Du musst dich unbedingt mit den Gültigkeiten und Lebensdauern von Variablen auseinander setzen, sonst wirst Du immer wieder Probleme damit haben.
Dannehöfer habe ich erst am Wochenende und auch heute extra nochmals gelesen, aber scheinbar dann doch nicht ganz kapiert, da ich es nicht hinbekomme. :shock:
Doch trotz des Aufrufes mit "init()" bekomme ich in der Sub "NoteEntry" eine Fehlermeldung, wenn ich oDoc, oSheets,... nicht hier deklariere. Warum?
Und wie lautet die Fehlermeldung, und welche Zeile in deinem Code wird dabei angemäääckert?
Ich bekomme in der Zeile

Code: Alles auswählen

oRow = oSheet.getRows
den Fehlercode: "Variable nicht definiert".

Kann es sein, dass ich da grundsätzlich was falsch verstehe?
Kann ich überhaupt in der Sub "init" eine Definition wie

Code: Alles auswählen

oDoc = ThisComponent
machen, die für alle Subs des Moduls gelten?

Re: CALC: Macro mit Dialog - fehlerhafte Ausführung

von balu » Mi, 02.05.2012 13:00

Hallo theindless,

Ich musste erstmal das Makro ändern, beziehungsweise den Button im Blatt Notizen, damit ich überhaupt den Dialog starten konnte. Denn dem Button war bei "Aktion ausführen" folgendes eingetragen:

Code: Alles auswählen

Calc.NewNote.NewNote (application, Basic)
Und das kann nicht funktionieren. Richtigerweise muss das wohl so lauten.

Code: Alles auswählen

Standard.Module1.NewNote (document, Basic)
Ich bin mir wohl nicht ganz sicher, aber ich vermute das es da vielleicht zu einem Fehler kommen kann. Denn bei mir hier werden Wörter mit Leerzeichen eingetragen, gar so wie ich sie eingebe.

Was die Zeilenhöhe betrifft, so vertust Du dich. Denn "Optimale Zeilenhöhe" ist nicht gleichzusetzen mit "Automatischer Zeilenumbruch", da dies 2 verschiedene Paar Schuhe sind. Das eine ist für die ZEILE, während das andere nur für eine ZELLE zuständig ist.

Ich empfehle dir, setze alle Zellen wo die Notiz eingetragen werden soll, auf "Automatischer Zeilenumbruch"(*). Und im Code kannst Du dann ruhig auf

Code: Alles auswählen

oSheet.Rows(3).Optimalheight = true
verzichten.

(*) rechtsklick Zelle, Zellen formatieren, Ausrichtung


3. Ich habe, ebenfalls nach Vorschlag balu, versucht, meine Variablen und bestimmte Definitionen in eine separate Sub "init" zu packen.
Es wurden dir schon hilfreiche Tipps zum lesen mitgeteilt, z.B. Andrews Makro-Dokument, beziehungsweise die deutsche Teilübersetzung davon. Aber auch immer wieder lesenswert sind die Seiten von Michael Dannenhöfer. Denn Du musst dich unbedingt mit den Gültigkeiten und Lebensdauern von Variablen auseinander setzen, sonst wirst Du immer wieder Probleme damit haben. Hier mal 3 lesenswerte Links zu Michael wo Du dazu genaueres nachlesen kannst.
Warum haben manche Variablen anscheinend nicht den richtigen Wert?
Wie werden Variablen deklariert?
Welche Gültigkeit haben Variablen?

Doch trotz des Aufrufes mit "init()" bekomme ich in der Sub "NoteEntry" eine Fehlermeldung, wenn ich oDoc, oSheets,... nicht hier deklariere. Warum?
Und wie lautet die Fehlermeldung, und welche Zeile in deinem Code wird dabei angemäääckert?



Um nicht vollends die Kontrolle über deine Makros zu verlieren, würde ich darauf verzichten Dialoge so zu benennen wie die Variable lautet.
oDialog = CreateUnoDialog(DialogLibraries.Standard.oDialog)
Besser ist also,

Code: Alles auswählen

oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog)
Ich hab mal deine Datei, besser gesagt das Makro, etwas überarbeitet und angehängt.
Klappts jetzt damit besser, die Notizen einzutragen?



Gruß
balu
Dateianhänge
Notiz-Test.ods
(13.26 KiB) 101-mal heruntergeladen

[gelöst] CALC: Macro mit Dialog - fehlerhafte Ausführung

von theindless » Mi, 02.05.2012 10:37

Hallo miteinander,

ich will mir eine Art "Gesprächsnotiz-Archiv" aufbauen, in welchem ich die Gespräche mit meinen Kollegen dokumentiere.

Ich habe, nach Vorschlägen und Muster von balu, ein Macro mit Dialog geschrieben, welche für die Eingabe verwendet wird.
Die Testdatei habe ich beigefügt.

Es bleiben folgende Probleme:

1. Bei einer mehrzeiligen Eingabe im Feld "Eingabe" kommt es teilweise vor, dass die Eingabe nicht mehrzeilig in die Zelle übernommen wird, sondern der Text ohne Leerzeichen zwischen den Zeilen in die Tabelle eingetragen wird. Der Fehler tritt nur manchmal auf und ist nicht zuverlässig reproduzierbar. Woran liegt das?

2. Trotz Versuch über

Code: Alles auswählen

oSheet.Rows(3).Optimalheight = true
wird, sofern die Übernahme mehrzeilig erfolgt, die optimale Zeilenhöhe nicht eingestellt. Wenn ich die Zeile auf 4 ändere, so wird mir bei einer weiteren Notizeingabe die Zeile 4 richtig auf optimale Höhe eingestellt. Aber mit der Zeile 3, die ich gerade eingebe, funktioniert das nicht. Warum funktioniert das nicht?

3. Ich habe, ebenfalls nach Vorschlag balu, versucht, meine Variablen und bestimmte Definitionen in eine separate Sub "init" zu packen. Doch trotz des Aufrufes mit "init()" bekomme ich in der Sub "NoteEntry" eine Fehlermeldung, wenn ich oDoc, oSheets,... nicht hier deklariere. Warum?


Ich hoffe ich habe keine dummen Fragen gestellt und ihr könnt mir helfen.

Im Voraus schon mal Danke an alle.

theindless
Dateianhänge
Test.ods
(11.92 KiB) 114-mal heruntergeladen

Nach oben