Seite 1 von 1
Werte Datumsabhängig übertragen
Verfasst: Mi, 27.04.2016 14:23
von Yati1
Hallo,
wie kann man einen Wert aus einer Zelle datumsabhängig in andere Zellen kopieren ?
Bsp:
in der Zelle A1 steht der Wert eines Energiezählers, der laufend steigt. Nun möchte ich während des ersten Tags den Wert von A1 dauernd in B1 übertragen. Am nächsten Tag soll der Wert in B2 erscheinen usw., der letzte Wert in B1, B2 usw. soll jedoch erhalten bleiben.
Ich hab's mit der Wenn-Funktion versucht, jedoch konnte ich so den Wert nach dem Tageswechsel nicht stehen lassen.
=WENN(HEUTE() = 42487;A1;"") gibt nach dem Tageswechsel Blank aus.
=WENN(HEUTE() = 42487;A1) gibt nach dem Tageswechsel FALSCH aus.
Es sollte jedoch der letzte Wert vor dem Tageswechsel stehen bleiben
Viele Grüße
Yati1
Re: Werte Datumsabhängig übertragen
Verfasst: Mi, 27.04.2016 15:43
von paljass
Hi,
guck mal, ob du
hiermit was anfangen kannst.
Gruß
paljass
Re: Werte Datumsabhängig übertragen
Verfasst: Mi, 27.04.2016 17:14
von F3K Total
Moin,
wie kommt der Wert des Energiezählers in die Calc-Datei?
Gruß R
Re: Werte Datumsabhängig übertragen
Verfasst: Mi, 27.04.2016 20:25
von Yati1
Hallo,
der Wert des Energiezähler steht in einer S7, die dessen Impulse zählt. Ein OPC-Server liest die Daten aus der S7 und per DDE werden sie von OO in die Tabelle eingelesen.
z.b: =DDE("TCPIPH1";"AG001";"DB200DW0")
Viele Grüße
Yati1
Re: Werte Datumsabhängig übertragen
Verfasst: Mi, 27.04.2016 22:19
von F3K Total
Hi,
anbei eine Datei mit Makros, die du natürlich zulassen musst, die immer dann, wenn sich in der DDE-Quelle etwas tut, nach der Uhrzeit schaut. Ist es 23:59 Uhr, wird der Wert aus der DDE-Zelle A1 in B1 geschrieben, in C1 der dazugehörige Zeitstempel. Die bereits gefüllten Zellen in den Spalten B und C werden nach unten geschoben, so dass der neueste Wert immer oben steht.
Du musst nur deinen DDE-Link in A1 schreiben, die Datei speichern, schliessen und wieder öffnen.
Code: Alles auswählen
global oListener
Sub S_add_DDE_Link_RefreshListener
on error goto errorhandler
oddelink = thiscomponent.ddelinks(0)
oListener = CreateUnoListener( "RefreshListener_", "com.sun.star.util.XRefreshListener" )
oddelink.addRefreshListener(oListener)
errorhandler:
End Sub
Sub S_remove_DDE_Link_RefreshListener
on error goto errorhandler
oddelink = thiscomponent.ddelinks(0)
oddelink.removeRefreshListener(oListener)
errorhandler:
End Sub
sub RefreshListener_refreshed
if hour(now()) = 23 AND minute(now()) = 59 Then
osheet = thiscomponent.sheets(0)
osourcecell = osheet.getcellbyposition(0,0)'A1
otargetcells = osheet.getcellrangebyposition(1,0,2,0)
acelladdress = otargetcells.rangeaddress
osheet.insertCells(acelladdress,com.sun.star.sheet.CellInsertMode.DOWN)
onewtargetcell1 = osheet.getcellbyposition(1,0)
onewtargetcell1.value = osourcecell.value
onewtargetcell2 = osheet.getcellbyposition(2,0)
onewtargetcell2.value = now()
endif
end sub
sub RefreshListener_disposing
end sub
Wenn du zum Testen, diese zwei Zeilen
Code: Alles auswählen
'if hour(now()) = 23 AND minute(now()) = 59 Then
.
.
.
'endif
mit einem Hochkomma versiehst (auskommentierst) wird etwa alle 4 Sekunden geschaut, und wenn sich etwas geändert hat, eine neue Zeile eingefügt.
Gruß R
Re: Werte Datumsabhängig übertragen
Verfasst: Do, 28.04.2016 20:07
von Yati1
Hallo,
vielen Dank für Eure Hilfen.
Der Hinweis von Paljass würde nur mit Funktionen arbeiten, was mir auch lieber wäre, da ich mit der Programmiersprache noch nicht so vertraut bin. Allerdings wird hier das Datum eingefroren, ich möchte jedoch den Wert anhängig vom Datum in verschiedene Zellen schreiben.
Die Datei mit dem Makro von F3K Total funktioniert einwandfrei und hat mich auch weiter gebracht. Allerdings verstehe ich noch nicht alles, was da passiert. Mich würde noch interessieren, wie man eine Sub anlegen muss, dass sie dauernd bearbeitet wird. Hängt das irgendwie mit dem Namen zusammen ?
Viele Grüße und nochmals herzlichen Dank an Alle
Re: Werte Datumsabhängig übertragen
Verfasst: Do, 28.04.2016 20:30
von F3K Total
Hallo,
Yati1 hat geschrieben:Mich würde noch interessieren, wie man eine Sub anlegen muss, dass sie dauernd bearbeitet wird. Hängt das irgendwie mit dem Namen zusammen ?
Nein, das hängt nicht mit dem Namen zusammen. Der
com.sun.star.util.XRefreshListener wird beim Öffnen der Datei (siehe Extras/Anpassen/Reiter Ereignisse) mit
S_add_DDE_Link_RefreshListener initialisiert. Er reagiert wenn der DDE-Link "neue Daten" schickt und löst bei diesem Ereignis das Programm
RefreshListener_refreshed, was die Calc Datei beschreibt, aus.
Gruß R
Re: Werte Datumsabhängig übertragen
Verfasst: Mo, 09.05.2016 19:49
von Yati1
Hallo,
ich hätte noch Fragen zu den DDE-Verbindungen:
Wenn man mehrere Zellen per DDE aus der SPS mit Werten beschreibt, welche Zelle löst dann das Programm "RefreshListener_refreshed" aus ?
Müsste es eigentlich nicht jede Zelle tun in der sich der Wert ändert ?
Ich habe das Problem, das dieses Programm nicht immer angestoßen wird, komme aber nicht dahinter von was das abhängt.
Viele Grüße
Yati1
Re: Werte Datumsabhängig übertragen
Verfasst: Di, 10.05.2016 22:00
von F3K Total
Hi,
da müsstest du mal schauen, welchen DDE-Link du überwachen willst, mit oddelink = thiscomponent.ddelinks(0) wird der erste (Index 0) überwacht.
Gruß R
Re: Werte Datumsabhängig übertragen
Verfasst: Mi, 11.05.2016 10:53
von Yati1
Hallo,
dann werde ich mal ausprobieren, wie das Verändern dieses Index reagiert.
Inzwischen habe ich es so gemacht, dass ich die Tabelle zunächst nur mit dem DDE-Wert der triggern soll, gespeichert und wieder geladen habe. Anschließend habe ich die anderen DDE-Verbindungen wieder hinzu gefügt. Auch nach erneutem speichern und wieder laden bleibt nun der Trigger erhalten. Man kann ihn sogar in eine andere Zelle kopieren und in der ursprünglichen Zelle löschen, es funktioniert trotzdem.
Vielen Dank und viele Grüße
Yati1
Re: Werte Datumsabhängig übertragen
Verfasst: Do, 26.05.2016 16:27
von Yati1
Hallo,
nun habe ich Versuche mit dem Index in der Sub "S_add_DDE_Link_RefreshListener" gemacht. Man kann damit die Zelle die Triggern soll umschalten, jedoch kann ich nicht immer genau nachvollziehen, wie und warum.
Mein Problem habe ich nun wie folgt gelöst:
Die SPS liefert außer den Daten noch den aktuellen Minutenwert (um bei jedem Minutenwechsel zu Triggern) sowie die Nr. der Zeile in die die Daten abhängig vom Datum geschrieben werden sollen. Das ganze wird per DDE in eine Hilfszeile außerhalb der eigentlichen Tabelle geschrieben. Bei jedem Minutenwechsel wird das (natürlich angepasste) Makro von F3K Total getriggert und damit die Daten in die aktuelle Tageszeile geschrieben. Ändert sich das Datum, liefert die SPS ja die neue Zeilen-Nr. ,die alte Zeile bleibt auf dem letzten Stand und die Daten wandern in die neue Zeile.
Nachteil: Ist die Datei während des Tageswechsels nicht offen, stimmen die Daten des vergangenen Tages nicht.
Um die Daten dann nicht von Hand nachtragen zu müssen, werden sie auf der SPS immer um 23:59:00 inklusive der zugehörigen Zeilen-Nr. eingefroren. Diese Daten werden per DDE in eine zweite Hilfszeile übertragen und können dann mit einem ähnlichen Makro wie oben, das jedoch mit einer Taste getriggert wird, am folgenden Tag in die entsprechende Zeile geschrieben werden.
Nochmals vielen Dank insbesondere an F3K Total ohne dessen Hilfe mir dies so nicht möglich gewesen wäre !
Viele Grüße
Yati1