[gelöst] In Calc einen Text aus Formularfeld in Zelle schreiben

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

Moderator: Moderatoren

Rupp
**
Beiträge: 46
Registriert: Mi, 27.01.2010 08:33
Kontaktdaten:

[gelöst] In Calc einen Text aus Formularfeld in Zelle schreiben

Beitrag von Rupp »

Hallo,

ich versuche in Calc den Inhalt eines Textfeldes (in einem Formular) in eine Zelle schreiben zu lassen.

Bei einem Datumsfeld klappt das hervorragend mit folgendem Code:

Code: Alles auswählen

Sub Feldwerte_in_Zelle (evt)

'	Makro, dass das ausgewählte Datum in einem Datumsfeld (bzw. Uhrzeit in einem Uhrzeit-Feld) dann auch zur Weiterverwendung bei Berechunungen in eine gewünschte Zelle schreibt.
'	Bei jeder Änderung des Datums/Uhrzeit wird auch das entsprechende Datum/Uhrzeit in der zugehörigen Zelle geändert.
' In die Einstellungen zum Feld muss unter Zusatzinformation die Zelle geschrieben werden, in die geschrieben werden soll  z.B. B3 (ohne Anführungszeichen) - sprich die gewünschte Zelle, in die der Wert geschrieben wird darauf achten, dass nicht mehrere Felder in gleiche Zellen schreiben
' Unter Ereignisse-Tab dann als  "Text modifiziert" dieses Makro auswählen

	oDoc = ThisComponent
	oActiveSheet = oDoc.currentController.ActiveSheet 'Setze aktives Sheet als aktiv
	
	oCtl=evt.source.model
	oCell=oActiveSheet.getcellrangebyname(oCtl.tag)
	oCell.value= cDate(oCtl.text)
	
End sub
Wenn ich dann z.B. mit dem Mausrad eine Datum ändere, klappt das hervorragend. Jede Änderung wird in Zelle übernommen.

Wenn ich aber das Datum per Hand ändere, kommt eine Fehlermeldung.
Bein einem reinen Text- oder Zahlenfeld klappt es gar nicht. Wenn ich dort Text oder Zahl eingebe, kommt wieder diese Fehlermeldung.

Woran kann das liegen? Was kann ich da machen?

Danke für Eure Hilfe!

Rupp
Zuletzt geändert von Rupp am Do, 01.04.2021 10:26, insgesamt 3-mal geändert.
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: In Calc einen Text aus Formularfeld in Zelle schreiben

Beitrag von mikeleb »

Hallo,
Woran kann das liegen?
Wenn das Datum manuell eingetragen wird, wird das Makro bei jeder Zeichenänderung ausgelöst. Daher kann manchmal ein Text im Feld stehen (z. B. 31.0.2021), der nicht als Datum interpretiert werden kann.
Was kann ich da machen?
Füge eine Fehlerbehandlung ein:

Code: Alles auswählen

Sub Feldwerte_in_Zelle (evt)

'	Makro, dass das ausgewählte Datum in einem Datumsfeld (bzw. Uhrzeit in einem Uhrzeit-Feld) dann auch zur Weiterverwendung bei Berechunungen in eine gewünschte Zelle schreibt.
'	Bei jeder Änderung des Datums/Uhrzeit wird auch das entsprechende Datum/Uhrzeit in der zugehörigen Zelle geändert.
' In die Einstellungen zum Feld muss unter Zusatzinformation die Zelle geschrieben werden, in die geschrieben werden soll  z.B. B3 (ohne Anführungszeichen) - sprich die gewünschte Zelle, in die der Wert geschrieben wird darauf achten, dass nicht mehrere Felder in gleiche Zellen schreiben
' Unter Ereignisse-Tab dann als  "Text modifiziert" dieses Makro auswählen

	oDoc = ThisComponent
	oActiveSheet = oDoc.currentController.ActiveSheet 'Setze aktives Sheet als aktiv
	
	oCtl=evt.source.model
	oCell=oActiveSheet.getcellrangebyname(oCtl.tag)
	on error resume next
	oCell.value= cDate(oCtl.text)
	
End sub
Bein einem reinen Text- oder Zahlenfeld klappt es gar nicht.
Für diese Felder benötigst du kein Makro. Du kannst sie direkt mit einer Zelle verknüpfen: Eigenschaften des Feldes->Daten->Verknüpfte Zelle
Gruß,
mikeleb
Rupp
**
Beiträge: 46
Registriert: Mi, 27.01.2010 08:33
Kontaktdaten:

Re: In Calc einen Text aus Formularfeld in Zelle schreiben

Beitrag von Rupp »

Danke, Mikeleb, für die rasche Antwort!

Die Sache mit der Errorbehandlung "on error resume next" hat bestens geklappt.

Das direkte Arbeiten mit den Formularfeldern ohne Makro (also einfach unter "Eigenschaften des Feldes->Daten->Verknüpfte Zelle" in eine Zelle schreiben lassen), klappt bei mir leider nicht. Das liegt daran, dass ich das Formular in einer Art "Vorlage-Sheet" habe, das ich dann immer wieder unter neuem Namen kopiere. Im Vorlagen-Sheet selbst klappt das mit dem direkten Zellbezug. Bei der Kopie wird aber weiter auf das Vorlage-Sheet Bezug genommen. So das jede Änderung im neuen Sheet die Zellen im Vorlage-Sheet beschreibt und nicht im gewünschten neune Sheet.

Das Problem habe ich im Datums- und Uhrzeit-Feld, in dem ich ja mit dem Makro arbeite, nicht. Da wird dann jeweils nur in die richtige Zelle und auch nur in dem jeweiligen Sheet geschrieben.

Weißt Du, wie ich für Kombinationsfelder, Text-Felder und Zahlen-Felder ebenfalls mit Makro in die gewünschte Zelle schreiben kann?

Vielen Dank

Rupp
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: In Calc einen Text aus Formularfeld in Zelle schreiben

Beitrag von F3K Total »

Hallo,
ich habe dir mal ein Makro geschrieben, was deine vier Feldtypen unterscheiden kann:

Code: Alles auswählen

Sub Feldwerte_in_Zelle (evt)
    oDoc = ThisComponent
    oActiveSheet = oDoc.currentController.ActiveSheet 'Setze aktives Sheet als aktiv
    
    oCtl = evt.source.model
    oCell = oActiveSheet.getcellrangebyname(oCtl.tag)
    if oCtl.supportsservice("com.sun.star.form.component.TextField") then 
        oCell.String = oCtl.Text
    endif
    if oCtl.supportsservice("com.sun.star.form.component.ComboBox") then
        oCell.String = oCtl.CurrentValue
    endif
    if oCtl.supportsservice("com.sun.star.form.component.FormattedField") then
        oCell.value = oCtl.CurrentValue
    endif
    if oCtl.supportsservice("com.sun.star.form.component.DateField") then
    oCell.value= cDate(oCtl.text)
    endif
End sub
Viel Erfolg damit.
Gruß R
Rupp
**
Beiträge: 46
Registriert: Mi, 27.01.2010 08:33
Kontaktdaten:

Re: [Bitte noch um Hilfe] In Calc einen Text aus Formularfeld in Zelle schreiben

Beitrag von Rupp »

Super vielen Dank F3K Total.

Das probiere ich dann heute Abend aus und schreibe, ob es so klappt.
Rupp
**
Beiträge: 46
Registriert: Mi, 27.01.2010 08:33
Kontaktdaten:

Re: In Calc einen Text aus Formularfeld in Zelle schreiben

Beitrag von Rupp »

F3K Total,

habe es doch rasch getestet - klappt perfekt so.

Ich bräuchte auch noch die Variante für Listenfelder und für numerische Felder. Vermutlich sind das auch die wieder die englischen Bezeichnungen und dann für Listenfelder "text" und für numerische "value".

Wie heißen die auf englisch? Oder geht das doch anders?

Bei der Variante für normale Listenfelder gibt es noch eine Besonderheit: unter Ereignisse fehlt die Möglichkeit unter Ereignisse "Text modifiziert" auszuwählen. Verknüpfe ich das Makro dort dann einfach mit dem Ereignis "Modifiziert"?

Gruß Rupp
Rupp
**
Beiträge: 46
Registriert: Mi, 27.01.2010 08:33
Kontaktdaten:

Re: In Calc einen Text aus Formularfeld in Zelle schreiben

Beitrag von Rupp »

So jetzt habe ich mir meine Fragen selbst beantworten können.

Hier ist das vollständige Makro, einschließlich der normalen Listenfelder und numerischen Felder:

Code: Alles auswählen

Sub Feldwerte_in_Zellen_schreiben (evt)

	oDoc = ThisComponent
	oActiveSheet = oDoc.currentController.ActiveSheet 'Setze aktives Sheet als aktiv
	
	oCtl = evt.source.model
    oCell = oActiveSheet.getcellrangebyname(oCtl.tag)
    if oCtl.supportsservice("com.sun.star.form.component.TextField") then 
        oCell.String = oCtl.Text
    endif
    if oCtl.supportsservice("com.sun.star.form.component.ComboBox") then
        oCell.String = oCtl.CurrentValue
    endif
    if oCtl.supportsservice("com.sun.star.form.component.FormattedField") then
        oCell.value = oCtl.CurrentValue
    endif
    if oCtl.supportsservice("com.sun.star.form.component.DateField") then
	    oCell.value= cDate(oCtl.text)
    endif
    if oCtl.supportsservice("com.sun.star.form.component.ListBox") then
        oCell.String = oCtl.CurrentValue
    endif
      if oCtl.supportsservice("com.sun.star.form.component.NumericField") then
        oCell.value = oCtl.CurrentValue
    endif
	
end sub
Und für die normalen Listenfelder muss das Makro unter dem Ereignis "Modifiziert" zugeordnet werden.

Vielen Dank für Eure rasche und gute Hilfe F3K Total und Mikeleb - tolles Forum!

Einen schönen Tag an alle

Rupp
Antworten