Seite 1 von 1

Kumulieren, aufaddieren

Verfasst: Mi, 20.10.2010 15:36
von Karlson65
Moin Profis!
Ich habe eine anfangs leichte Aufgabe, doch weiß nicht, wie ich sie in OOo Calc umsetzen muss.
Ich muss OOo Calc dazu bringen, dass es mir in einer Zelle einen überschriebenen Wert merkt und kumuliert.
Beispiel anhand einer aktuellen Bestandsliste:
Folgende Zellen haben Inhalt:
A1 = 2 (Bewegung, Entnahme/Zunahme; bei positivem Vorzeichen "Zugang", bei negativem Vorzeichen "Abgang")
B1 = 5 (Anfangsbestand)
C1 = 7 (aktueller Bestand)
Soweit alles klar. Der Anfangsbestand war 5 (A1), 2 kommen hinzu (B1), ergeben in der Summe 7 (C1).
C1 = Summe aus A! und B1.
Wenn ich nun in A1 eine neue Bewegung eintrage, z:B. -2,verändert sich B! nicht. Jedoch C1. Dort erscheint jetzt eine 3 . Logisch. -2 +5 ergeben 3.
Überschreibe ich nun aber den Wert von A1, wo ja noch die -2 steht, so erhalte ich , so erhalte ich ebenfalls als Resultat in C1 eine 3.
Auch logisch.
Ich möchte erreichen, dass sich Cal. den überschriebenen Wert merkt und zur neuen Eingabe kumuliert, aufaddiert. So dass aus -2 und -2 eine -4 herauskommt, so dass in C1 dann eine 1 steht.
Mit Formeln ist so etwas nicht zu erreichen. Ist es mit einem Makro möglich. Wie muss dann dieser Basic - Code aussehen, damit die Operation bei "Enter" ausgeführt wird. Und wie muss es aussehen, wenn ich mehrere Zeilen derart ausstatten möchte?
Über jegliche Hilfe bin ich dankbar. Ich suche schon seit vielen Monaten nach einer Lösung. Bisher ohne Erfolg.

Re: Kumulieren, aufaddieren

Verfasst: Mi, 20.10.2010 20:14
von Karolus
Hallo
@Moderator:
Kann das Thema ins Basicforum verschoben werden ? -danke.

@Carlsen
Da hättest du besser gleich im Basic-forum nachgefragt.

Hier ein Beispiel:

Code: Alles auswählen

Sub Listener_registrieren()

'###################################################################################
'# Hier in der Sub wird ein ModifyListener ( frei übersetzt: "Änderungsüberwacher" )
'# initialisiert und allen Zellen von Tabelle1.A1:A100 zugeordnet.
'#
'# Bitte sicherstellen das dieses Makro während der Bearbeitung des Dokuments
'# nur einmal augeführt wird ( Am besten diese Sub mit dem Ereignis "Dokument öffnen"
'# verknüpfen: -> Extras -> Anpassen -> "Ereignisse" )
'#
'##################################################################################
    odoc = ThisComponent  
    olistener =_
    CreateUnoListener("modListener_","com.sun.star.util.XModifyListener")

'#####################################################
'# Schleife über alle Zellen in A1:A100,
'# damit im Arbeitsmakro "OEvent.source.Celladdress"
'# zur Verfügung steht. (wg. Zeilenindex ermitteln )
'#####################################################

    for irow = 0 to 99 'Schleife über den Zeilenindex
        'sheets(0) ist das erste Tabellenblatt
       oDoc.Sheets(0).GetCellbyposition(0, irow ).addModifyListener(olistener)
    next
End Sub


Sub modlistener_modified(oEvent)

'########################################################################
'# Diese Sub wird jedesmal automatisch gestartet wenn in Spalte A ein
'# Zellinhalt neu eingetragen wird.
'# Der Name der Sub wird zusammengesetzt aus dem frei Wählbaren Bezeichner
'# oben aus der Registrierung und dem für einen Modifylistener gültigen
'# Schlüsselwort "modified".

Doc = thisComponent
sheet = Doc.sheets(0)
with oEvent.source
   'Hier werden die -
   irow = .CellAddress.row      ' - Adressparameter der -
   icol = .CellAddress.Column   ' - auslösenden Zelle in Variablen gespeichert,
   ovalue = .value          ' und hier deren Wert
end with
erg = sheet.getcellbyposition(icol +2 ,irow).value 'Speichern des Saldos 2 Spalten weiter
sheet.getcellbyposition(icol +2 ,irow).value = erg + ovalue 'Neueintrag des Gesamtergebnisses
   
End Sub
die " Sub Listener_registrieren " solltest du dem Ereignis "Dokument öffnen" zuweisen ( → Extras → Anpassen → Ereignisse .. )

Hier noch das Beispielsdokument dazu:
modify.ods
(8.8 KiB) 191-mal heruntergeladen
Nach dem Herunterladen erstmal auf der eigenen Kiste abspeichern, schliessen und neu öffnen.
Gruß Karo

Re: Kumulieren, aufaddieren

Verfasst: Do, 21.10.2010 13:51
von Karlson65
Moin Karo,
Danke für die schnelle Antwort!
Ich muss die Lösung jedoch erst noch ausprobieren und mich damit beschäftigen. Denn von Basic und Makros schreiben habe ich wenig Ahnung. Deshalb kann es gut sein, dass ich noch einmal nachfragen muss.
Das Thema kann meinetwegen verschoben werden. Kannst Du das als Moderator erledigen?
Danke

Re: Kumulieren, aufaddieren

Verfasst: Do, 21.10.2010 14:05
von Karlson65
Hallo Karo,
wie ich befürchtet habe, habe ich nichts verstanden.
Deine angehängte Beispieldatei hat nicht funktioniert.
In A1 stand eine 5, in C1 eine 165. Bei B1, wo ein Anfangsbestand stehen sollte, stand nichts.
Ich habe also die 5 mit einer erneuten 5 überschrieben, so dass in C1 170 zu stehen kommen müßte. Tat es aber nicht. Es stand immer noch die 165 dort.
Oder hätte ich diese Datei noch irgendwie ändern müssen?
Gruß
Karlson

Re: Kumulieren, aufaddieren

Verfasst: Do, 21.10.2010 14:26
von Karolus
Hallo
Ich hab in der Datei keinen extra Anfangsbestand in Spalte B vorgesehen, weil du diesen auch gleich in A eingeben kannst.

a. Hast du die Datei nach dem Herunterladen zunächst mal auf deiner Umgebung abgespeichert und geschlossen ?
b. Evtl. musst du vor dem Wiederöffnen der Datei unter → Extras → Optionen → OO.org → Sicherheit → 'Makrosicherheit' die Einstllung auf [x]Mittel setzen oder den Ordner mit der gespeicherten Datei unter deine 'vertrauenswürdigen Quellen' aufnehmen.

Nach dem Öffnen der Datei sollten dann alle numerischen Eingaben im Bereich A1:A100 in Spalte C aufaddiert werden.

Gruß Karo

Re: Kumulieren, aufaddieren

Verfasst: Do, 21.10.2010 14:56
von Karlson65
Hallo Karo,
das alles hat ja super geklappt. Es funzt.
Doch was genau hast Du gemacht? Es handelt sich dabei um ein "normales" Makro?
Die gleiche Lösung hatte ich schon einmal für Excel. Doch da sah der Code völlig anders und auch viel kürzer aus.
So nach dem Motto: Beim überschreiben der Zellen soundso, merke Dir den vorherigen Wert und addiere.
Bei Deiner Lösung ist es doch etwas umfangreicher mit Schleife, oder? Kannst Du es mir erklären? Denn ich will es nicht nur lernen, sondern auch verstehen.
Die Lösung ist eigentlich für die Firma. Wir möchten einen aktuellen Bestand von Papiersorten - und mengen haben. Also keine großartige Lagerverwaltung, sondern nur den aktuellen Bestand. Und dazu genügt uns, wenn wir in A1 einen Abgang oder Zugang eintragen. Dann haben wir in C1 den aktuellen Bestand.
Wie kann ich nun Deine Lösung in die schon fertige Bestandstabelle einfügen. Kann ich aus Deiner Beispieldatei etwas kopieren und in meiner Liste einsetzen?

Re: Kumulieren, aufaddieren

Verfasst: Do, 21.10.2010 16:07
von Karolus
Karlson65 hat geschrieben:Hallo Karo,
das alles hat ja super geklappt. Es funzt.
Doch was genau hast Du gemacht? Es handelt sich dabei um ein "normales" Makro?
Die gleiche Lösung hatte ich schon einmal für Excel. Doch da sah der Code völlig anders und auch viel kürzer aus.
Glaub ich gar nicht das das in Excel-Vba soviel kürzer ist, ohne die Kommentare bleiben da gerade mal 17 Codezeilen über!
Karlson65 hat geschrieben:So nach dem Motto: Beim überschreiben der Zellen soundso, merke Dir den vorherigen Wert und addiere.
Bei Deiner Lösung ist es doch etwas umfangreicher mit Schleife, oder? Kannst Du es mir erklären? Denn ich will es nicht nur lernen, sondern auch verstehen.
Schau noch mal in den Quellcode meiner ersten Antwort, ich hab vieles nochmal ausführlich kommentiert.
Schau zusätzlich mal in diese Links hier rein
Karlson65 hat geschrieben: Die Lösung ist eigentlich für die Firma. Wir möchten einen aktuellen Bestand von Papiersorten - und mengen haben. Also keine großartige Lagerverwaltung, sondern nur den aktuellen Bestand. Und dazu genügt uns, wenn wir in A1 einen Abgang oder Zugang eintragen. Dann haben wir in C1 den aktuellen Bestand.
Wie kann ich nun Deine Lösung in die schon fertige Bestandstabelle einfügen. Kann ich aus Deiner Beispieldatei etwas kopieren und in meiner Liste einsetzen?
Das geht ganz einfach per Copy und Paste in ein neues Modul deiner Dokument-Standardbibliothek. siehe auch:
http://www.ooowiki.de/MakrosInstalliere ... -bernehmen
Zusätzlich musst du nur nach in → Extras → Anpassen → Ereignisse das Registrier Makro mit dem Ereignis "Dokument öffnen" verknüpfen.

Gruß Karo

Re: Kumulieren, aufaddieren

Verfasst: Do, 21.10.2010 18:18
von Karlson65
Hallo Karo,
vielen Dank für die Ausführlichkeiten.
Ich hatte im Internet für eine VBA-Lösung diesen Code gefunden, der auch funktionierte:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
If IsNumeric(Target) Then Range("A5") = Range("A5") + Target
End If
End Sub

Die Zellbezüge waren natürlich anders.
Diesen Code hatte ich einmal kopiert und auf der Site: business-spreadsheets.com
zu konvertieren versucht. Es scheiterte an einigen Syntaxfehlern. Hier mal die Konvertierung:

Private Sub Worksheet_Change(ByVal Target As Dim oSheet as Object
oSheet = ThisComponent.CurrentController.ActiveSheet
oSheet.getCellRangeByName($1))
If Target.Address = "$A$1" Then
If IsNumeric(Target) Then Dim oSheet as Object
oSheet = ThisComponent.CurrentController.ActiveSheet
oSheet.getCellRangeByName($1)("A5") = Dim oSheet as Object
oSheet = ThisComponent.CurrentController.ActiveSheet
oSheet.getCellRangeByName($1)("A5") + Target
End If
End Sub

Dabei kamen Fehlermeldungen. Z. B. kann Basic nichts mit dem Wörtchen "Dim" anfangen.
Ich schreibe Dir dieses, weil ich merke, dass Du Dich auskennst. Und vielleicht ist dieses hier für Dich wertvoll oder interessant.
Auf jeden Fall, Deine Lösung funktioniert. Und das ist gut so.
Danke!