[gelöst] Druck auf Button-Schaltfläche legt veränderlichen Zellinhalt von A1 in Spalte B fortlaufend ab

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

Moderator: Moderatoren

Andromeda_104
**
Beiträge: 26
Registriert: Di, 12.03.2013 12:46

[gelöst] Druck auf Button-Schaltfläche legt veränderlichen Zellinhalt von A1 in Spalte B fortlaufend ab

Beitrag von Andromeda_104 »

Ein herzliches Hallo ins Forum,

Bei jedem Druck auf einen Button (Schaltfläche/Formular-Steuerelemente) soll ein Makro aktiviert werden, welches den Zellinhalt von A1 in die Spalte B fortlaufend nach unten einträgt.

Den Button habe ich angelegt und er funktioniert.

Die Sache mit dem RefreshListener (von F3K Total) habe ich auch in groben Zügen verstanden.

Allerdings soll der Listener nicht jede Veränderung von A1 in Spalte B eintragen, sondern nur dann, wenn der Button gedrückt wird.

Ich könnte zwar mit einer simplen WENN-Funktion im Feld D25 [=WENN(C4=1;A1;0)] eine Art Trigger vorschalten (Buttondruck erzeugt mittels Makro1 eine temporäre 1 im Feld C4) und dann D25 mit dem RefreshListener verbinden - - - aber es wäre besser, wenn es ohne diesen Umweg ginge.

Wie kann die Bedingung "Button gedrückt" in das Makro des RefreshListeners eingebunden werden, so dass dieser erst dann den entsprechenden Wert von A1 in Spalte B übernimmt?

Danke für eure Hilfe.
Andromeda_104
Zuletzt geändert von Andromeda_104 am Mo, 26.09.2016 01:39, insgesamt 1-mal geändert.
Benutzeravatar
lorbass
********
Beiträge: 4116
Registriert: Mo, 01.05.2006 21:29
Wohnort: Bonn

Re: Druck auf Button-Schaltfläche legt veränderlichen Zellinhalt von A1 in Spalte B fortlaufend ab

Beitrag von lorbass »

Tipp: Dass du noch keine Antwort erhalten hast, könnte daran liegen, dass niemand Lust hat, den „RefreshListener (von F3K Total)“ zu suchen und eine Musterlösung nach deiner nicht unbedingt leicht eingängigen Funktionsbeschreibung (z.B. „Buttondruck erzeugt mittels Makro1 eine temporäre 1 im Feld C4“) zusammenzustellen.

Um ein gemeinsames Verständnis deiner Vorstellungen zur Lösung zu gewinnen, stelle uns bitte eine anonymisierte / verfremdete und auf das Wesentliche reduzierte Beispieldatei zur Verfügung, die deinen Lösungsansatz anschaulich wiedergibt.

Als angemeldeter Benutzer kannst du diese Beispieldatei mit deinem nächsten Beitrag unmittelbar hier im Forum hochladen. Die entsprechende Eingabemöglichkeit findest du auf dem Registerblatt Dateianhang hochladen unterhalb des Texteingabefensters.

Lies bitte auch unsere Allgemeinen Hinweise zur Forumsbenutzung.

Gruß
lorbass
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Druck auf Button-Schaltfläche legt veränderlichen Zellinhalt von A1 in Spalte B fortlaufend ab

Beitrag von clag »

Hallo Andromeda_104,

das sind doch nur wenige Tastenanschläge das könnte man ganz einfach mit dem Makrorecorder aufzeichnen.

Makrorecorder starten
ctrl+pos1
ctrl+einfg
cursor_rechts
ctrl+Cursor_runter
cursor_runter
shift+einf
ctrl+pos1

Markro unter beliebigen Namen speichern

mit der Schaltfäche dieses Makro aufrufen
fertig.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Andromeda_104
**
Beiträge: 26
Registriert: Di, 12.03.2013 12:46

Re: Druck auf Button-Schaltfläche legt veränderlichen Zellinhalt von A1 in Spalte B fortlaufend ab

Beitrag von Andromeda_104 »

Habe mal noch etwas probiert und gebastelt - anbei die Datei. Der Druck auf den Übernahme-Button führt zu einer fortlaufenden Auflistung der Werte in Spalte B.

Der komplette RefreshListener ist für diese Funktion eigentlich gar nicht nötig, da ja nichts automatisch auf Änderungen überwacht werden soll, sondern nur bei einer definierten Aktion. Somit reicht also die source- und targetcell-Variante zur Realisierung aus.

Allerdings gibt es bei dieser Variante einen grundlegenden Haken.

Bei einem Neustart des Programms werden bereits vorhandene Werte in der Spalte B wieder überschrieben. Das ist aber so nicht gewünscht. Es sollte vielmehr so sein, dass das Makro nicht wieder oben anfängt einzutragen, sondern dort, wo die Eintragungen das letzte Mal endeten. Wurde das Programm also bei einem letzten Eintrag in B10 beendet und gespeichert, dann muss der nächste Eintrag ab B11 erfolgen.

Noch raffinierter wäre es jedoch, wenn das Makro außerdem noch erkennen würde, wo in der Spalte B sich eine leere Zelle befindet - z.B. wurde der Wert in B4 gelöscht - und dort dann "vorrangig" neue Eintragungen vornimmt.

Ist dies umsetzbar? Wie müsste das Makro erweitert werden, um dieses Verhalten zu erzeugen?

Grüße
Andromeda_104
Dateianhänge
Button_fortlaufende Übernahme_A1 nach Spalte B.ods
(9.4 KiB) 137-mal heruntergeladen
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Druck auf Button-Schaltfläche legt veränderlichen Zellinhalt von A1 in Spalte B fortlaufend ab

Beitrag von clag »

Hallo Andromeda_104,

hatte dir ja oben schon einen Weg zu einer Makro Variante vorgezeichnet, die funktioniert nicht bei dir?

Der Weg den du hier mit einer Globalen Variablen gehen willst, kann nicht funktionieren;
denn der Inhalt der Variablen ist natürlich weg wenn OO beendet wird. Das hast du ja auch bereits bemerkt

Du mußt schon die letzte benutzte Zeile ermitteln und dann die Zielzelle entsprechend adressieren.
Zudem sollte man auch ein versehentliches mehrfaches übernehmen des Zelleninhalts verhindern,
habe ich hier durch das leeren von A1 realisiert.

Code: Alles auswählen

Sub addtolist
 oCalc = thisComponent
 oSheet = oCalc.Sheets.getbyName("Tabelle1")
 oSource = oSheet.getCellRangebyName("A1")
'  oSourceAddress = oSource.getRangeAddress		' Zellinhalt komplett
  x = oSheet.Columns(1).queryEmptyCells()
  iR = x(x.Count - 1).RangeAddress.StartRow
  oTarget = oSheet.getCellByPosition(1,iR)

'  if oSource.String <> oSource.Value then exit Sub	' nur Wert
'  sTransmit = oSource.Value
'  oTarget.Value = sTransmit
'  oSource.ClearContents(7)

  if oSource.String = oSource.Value then exit Sub		' nur Text
  sTransmit = oSource.String 
  oTarget.String = sTransmit
  oSource.ClearContents(7)	

'  if oSource.String = "" then exit Sub 				' Zellinhalt komplett
'  oTargetAddress = oTarget.getCellAddress
'  oSheet.copyRange(oTargetAddress,oSourceAddress)	
'  oSource.ClearContents(1023)
End Sub
dann muß man nur noch entscheiden was in die Liste soll, Werte, Text oder alles?
Im Makrocode und in der Beispieldate ist der teil nur für Text aktiviert.
add_A1_to_Liste_in_Column_B.ods
(11.28 KiB) 163-mal heruntergeladen
vile Spaß
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Andromeda_104
**
Beiträge: 26
Registriert: Di, 12.03.2013 12:46

Re: Druck auf Button-Schaltfläche legt veränderlichen Zellinhalt von A1 in Spalte B fortlaufend ab

Beitrag von Andromeda_104 »

Hallo clag,

deine Lösung funktioniert sehr gut. Es wird alles so übernommen beim Neustart und fährt dann in der Eintragung an erster freier Stelle weiter fort - so war es gedacht. Werden Werte an letzter Stelle gelöscht, beginnt der nächste Wert an eben jener Stelle. Toll! Ich habe es nur für Zahlenwerte aktiviert und die anderen beiden Varianten mittels Apostroph vor den Zeilen inaktiv gesetzt. Somit bleibt es variabel.

Danke für deine Hilfe.

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

Re: Druck auf Button-Schaltfläche legt veränderlichen Zellinhalt von A1 in Spalte B fortlaufend ab

Beitrag von balu »

Hallo Andromeda_104,

sehe das folgende bitte nicht als einen persönlichen Angriff an.
Die Sache mit dem RefreshListener (von F3K Total) habe ich auch in groben Zügen verstanden.
Allein schon bei dem Wort "Listner" sträuben sich bei mir die Nackenhaare. Nicht weil ich ihn hasse, oder verpönen wurde, nein, vielmehr deshalb weil er mir stellenweise einfach zu "Hoch", zu unverständlich ist. Ich habe stellenweise meine Probleme mit dem einfachen StarBasic, aber der Listner ist für mich persönlich einfach eine andere Hausnummer. Und Du als Anfänger, so darf ich dich ja titulieren, oder(?), hast diesen speziellen Listner in groben Zügen verstanden? Das kann ich mir gar nicht so recht vorstellen. Zumal Du ja noch nicht mal die wirklich Grundlegenden und wirklich wichtigen Grundbausteine von StarBasic verstehst. Denn ansonsten wärst du von allein darauf gekommen, warum sich dein Makro so verhällt wie von dir beschrieben. Dazu sage ich gleich noch mal was.

Doch wie war das in einem anderen Beitrag von dir?
hier hat geschrieben: Aber sobald es in die Tiefe geht und eigene Wege gefunden werden müssen, steht der Anfänger vor einer extrem schweren Aufgabe.
Es muss noch nicht mal in die Tiefe gehen, dafür reicht schon etwas leichtes so wie in deinem Makro. Ohne wirklich elementar wichtiges Grundverständnis über StarBasic stolpert man sehr schnell über Probleme und Fehler die man nicht sofort versteht.

Als erstes, und schreib dir das ganz Dick und FÄTT hinter die Ohren.

StarBasic arbeit ein Makro, genauer gesagt eine SUB, generell immer Zeilenweise von oben nach unten ab.

Du wirst gleich noch verstehen wie wichtig allein schon dieser Merksatz ist.

Ich gehe mal dein Makro Zeilenweise von oben nach unten durch.

Code: Alles auswählen

global ncounter as long
Warum Global? Weißt Du was das für Auswirkungen haben kann?
Und warum Long? Bist Du dir ganz sicher das Du so viel brauchst?

Code: Alles auswählen

Sub Uebernahmeroutine
osheet = thisComponent.sheets(0)
osourcecell = osheet.getcellbyposition(0,0)
 
So weit OK.

Code: Alles auswählen

otargetcell = osheet.getcellbyposition(1,ncounter)
 
Irgendwie richtig, aber dennoch Falsch!
Du hast wohl ncounter schon zu Anfang als Global deklariert, aber bis hier noch nirgendwo defeniert. Und folglich hat ncounter den Wert 0.

Code: Alles auswählen

otargetcell.value = osourcecell.value
Ok.

Code: Alles auswählen

ncounter = ncounter + 1

End Sub
Jetzt erhöst Du den Wert von ncounter um 1. Das ist ja auch korrekt. Und so nebenbei, das Ende der Sub ist auch korrekt.

Bei einem Neustart des Programms werden bereits vorhandene Werte in der Spalte B wieder überschrieben. Das ist aber so nicht gewünscht. Es sollte vielmehr so sein, dass das Makro nicht wieder oben anfängt einzutragen, sondern dort, wo die Eintragungen das letzte Mal endeten. Wurde das Programm also bei einem letzten Eintrag in B10 beendet und gespeichert, dann muss der nächste Eintrag ab B11 erfolgen.
Da ich dir ja den Merksatz schon gesagt habe, kommst Du jetzt von alleine drauf warum das Makro nach jedem erneuten öffnen der Datei in der Spalte B bei B1 anfängt? Das Problem, besser gesagt den Fehler, habe ich dir vorhin schon aufgezeigt.

Mir geht es jetzt nicht darum dir eine Lösung wie von clag aufzuzeigen, sondern darum das Du mehr von den elementar sehr wichtigen Grundprinzipien von StarBasic verstehst. Wenn du das so langsam verstehst, wirst Du dich kein zweites mal darüber wundern warum sich das Makro so verhällt wie von dir beschrieben.

Stephan hatte dir ja schon in dem anderen Thread ein paar weiterführende Hilfsquellen aufgelistet, die möchte ich hier und jetzt um eine weitere lohnenswerte erweitern.
Schau auch ruhig mal bei Dannenhöfer rein. Und befasse dich mal mit dem sehr wichtigen Thema *Variablen*.



gruß
balu
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
Andromeda_104
**
Beiträge: 26
Registriert: Di, 12.03.2013 12:46

Re: Druck auf Button-Schaltfläche legt veränderlichen Zellinhalt von A1 in Spalte B fortlaufend ab

Beitrag von Andromeda_104 »

Ach balu,

es ist nur alles so unendlich kompliziert. Man müsste sich viel intensiver mit der Thematik - in Grundzügen - beschäftigen. Da hast du absolut Recht. Mit der Schritt-für-Schritt-Methode ist es wohl weitaus effektiver als nach Versuch und Irrtum voranzugehen. Aber die Zeit dafür fehlt mir. Also bleibt mir nur, meine Problematik einzustellen und auf eine Hilfe zu hoffen resp. vorhandene Codes abzuändern oder in Teilen neu zusammenzufügen. Manches funktioniert - an manchen Dingen scheitere ich aber auch recht schnell. Ich habe mir schon eine kleine Code-Bibliothek zusammengestellt, wo ich nachschaue und manchmal finde ich auch per Zufall im Forum hier durch die Suche etwas, was zur Lösung beiträgt. Die Seiten von Dannenhöfer kenne ich schon - aber wie gesagt, fehlt mir ganz einfach die Zeit für ein intensives Eintauchen in das alles.

Für mich ist die ganze Programmierungsthematik ein Hochaus mit 100 Etagen - in welchem ich mich gerade vom Keller zur ersten Etage voranquäle.

Bitte nimm mir meine Anfängerfragen und meinen Wunsch nach Hilfe nicht übel - auch du hast einmal ganz klein angefangen - "im Keller". Vielleicht muss man auch dafür geschaffen sein oder es braucht bestimmte genetische Voraussetzungen, die nur wenige Menschen mitbringen - eine Art abstraktes Denken. Es wäre zumindest möglich.

Denn ich gehe mal davon aus, dass der Großteil der hier Fragenden arge Probleme damit hat, die StarBasic-Spache einerseits zu verstehen und auf der anderen Seite aber auch, die Problematik überhaupt in dieser Richtung anzugehen. Das zu lösende Problem ist dabei schon bekannt - allein es fehlt am Wissen, wie dieses Problem so strukturiert werden kann, dass ein funktionsfähiges Makro entsteht. Das ist für Anfänger eine kaum zu überwindende Divergenz. Hier braucht es erfahrene Lehrer, welche Lösungswege aufzeigen. Erlesen von Null auf kann man sich sowas kaum. Dafür ist es zu komplex, zu abstrakt und zu variabel für den Normalmenschen wie ich es auch bin.

Liebe Grüße
Andromeda_104
Antworten