[gelöst] Wie kann man Zellinhalte in Echtzeit kopieren und schreiben?

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

Moderator: Moderatoren

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

[gelöst] Wie kann man Zellinhalte in Echtzeit kopieren und schreiben?

Beitrag von junmod »

Hallo Forum,

ich habe mir bereits die Finger wund gesucht und einiges ausprobiert, aber ich komme nicht weiter.
Ich hoffe Ihr könnt mir den entscheidenden Tipp geben.

Folgendes würde ich gerne in OO Calc mit einem Makro realisieren:

Ich habe z.B. die Zelle A1, die über die Funktion VERWEIS mit Text befüllt wird,
dann gibt es eine weitere Zelle, z.B. A2, die abhängig vom Text in Zelle A1 eine 1 oder 0 enthält,
wenn jetzt in Zelle A2 z.B die 1 erscheint soll automatisch ein Makro den Text aus A1 in eine andere Zelle, z.B. A3 schreiben, bei 0 soll die Zelle A3 leer und beschreibbar bleiben.

Ich hatte schonmal diverse Versuche gestartet, aber entweder war es nicht in Echtzeit, d.h. der Text wurde erst eine Eingabe später in A3 geschrieben oder es kam die Fehlermeldung dass die Zelle angeblich geschützt sei.

Ich würde mich freuen wenn mir jemand helfen könnte.

Gruß
Dirk
Zuletzt geändert von junmod am Di, 07.06.2016 10:34, insgesamt 1-mal geändert.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Wie kann man Zellinhalte in Echtzeit kopieren und schreiben?

Beitrag von Stephan »

ordne z.B. folgendes Makro:

Code: Alles auswählen

Sub Main(a)
blatt = ThisComponent.CurrentConTroller.ActiveSheet
tmp = Split(a.AbsoluteName,".")
If (tmp(1) = "$A$1" OR tmp(1) = "$A$2") AND blatt.getCellRangeByName("A2").Value = 1 Then
		blatt.getCellRangeByName("A3").String = blatt.getCellRangeByName("A1").String
	ElseIf (tmp(1) = "$A$1" OR tmp(1) = "$A$2") AND blatt.getCellRangeByName("A2").Value = 0 Then
		blatt.getCellRangeByName("A3").String = ""
End if
End Sub
dem Ereignis "Inhalt geändert" des Tabellenblattes zu (Rechtsklick auf Reiter des Tabellenblattes und Menüpunkt "Ereignisse...)


Gruß
Stephan
Dateianhänge
Beispiel_A1_A2_A3.ods
(9.29 KiB) 152-mal heruntergeladen
junmod
**
Beiträge: 31
Registriert: Di, 07.02.2012 09:06

Re: Wie kann man Zellinhalte in Echtzeit kopieren und schreiben?

Beitrag von junmod »

Danke Stephan!

Es funktioniert soweit ganz gut, allerdings nur wenn ich die "1" oder "0" direkt eingebe, sobald ich diese aber durch einen VERWEIS erzeuge, passiert nichts mehr. Ich habe schon gedacht es liegt an der Formatierung der Zelle, aber selbst wenn ich mit Buchstaben arbeite funktioniert es nicht.

Hättest du da vielleicht auch noch einen Tipp?

Gruß
Dirk
mikeleb
*******
Beiträge: 1412
Registriert: Fr, 09.12.2011 16:50

Re: Wie kann man Zellinhalte in Echtzeit kopieren und schreiben?

Beitrag von mikeleb »

Hallo,

ich kann deine Beobachtung nicht bestätigen. Auch wenn ich die Zelle A2 per Formel mit 1 oder 0 fülle, arbeitet das Makro exakt.
Kann es sein, dass du anstelle der Zahlen 0 und 1 die Texte "0" und "1" in der Formel verarbeitest?
Poste mal deine konkrete Verweis()-Funktion.
Gruß,
mikeleb
junmod
**
Beiträge: 31
Registriert: Di, 07.02.2012 09:06

Re: Wie kann man Zellinhalte in Echtzeit kopieren und schreiben?

Beitrag von junmod »

Hallo mikeleb,

hier ist mein Versuch.

Gruß
Dirk
Dateianhänge
Unbenannt 3.ods
(11.12 KiB) 131-mal heruntergeladen
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Wie kann man Zellinhalte in Echtzeit kopieren und schreiben?

Beitrag von Stephan »

Hättest du da vielleicht auch noch einen Tipp?
Nach Deiner jetzt übermittelten Beispieldatei am Einfachsten indem Du zusätzlich auf ein EReignis in ZElle H2 prüfst:

Code: Alles auswählen

Sub Main(a)
blatt = ThisComponent.CurrentConTroller.ActiveSheet
tmp = Split(a.AbsoluteName,".")
If (tmp(1) = "$A$1" OR tmp(1) = "$A$2" OR tmp(1) = "$H$2") AND blatt.getCellRangeByName("A2").Value = 1 Then
      blatt.getCellRangeByName("A3").String = blatt.getCellRangeByName("A1").String
   ElseIf (tmp(1) = "$A$1" OR tmp(1) = "$A$2" OR tmp(1) = "$H$2") AND blatt.getCellRangeByName("A2").Value = 0 Then
      blatt.getCellRangeByName("A3").String = ""
End if
End Sub
strenggenommen ist die Prüfung überflüssig und es sollte genügen:

Code: Alles auswählen

Sub Main()
blatt = ThisComponent.CurrentConTroller.ActiveSheet
If blatt.getCellRangeByName("A2").Value = 1 Then
      blatt.getCellRangeByName("A3").String = blatt.getCellRangeByName("A1").String
   ElseIf blatt.getCellRangeByName("A2").Value = 0 Then
      blatt.getCellRangeByName("A3").String = ""
End if
End Sub


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

Re: Wie kann man Zellinhalte in Echtzeit kopieren und schreiben?

Beitrag von junmod »

Hallo Stephan,

dein Beispiel 2 ohne Prüfung macht genau das was ich mir vorgestellt habe. Super!
Dann lag es wohl nur an der Prüfung.

Vielen Dank!

Gruß
Dirk
Antworten