Calc: Range an Funktion übergeben - Leere Zellen erkennen

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

Moderator: Moderatoren

CalcWeiss
**
Beiträge: 32
Registriert: Sa, 17.08.2013 13:26

Calc: Range an Funktion übergeben - Leere Zellen erkennen

Beitrag von CalcWeiss »

Ich möchte per selbst geschriebener Funktion die letzte benutzte Zelle eines Bereiches in die aktuelle Zelle übernehmen. Beispiel: Ich habe in den Zellen G10-Gxx den jeweils aktuellen Kontostand und möchte den untersten Wert in G9 übernehmen. Also definiere ich in G9 die Funktion =LASTVALUEINCOLUMN(G10:G31), damit die Funktion aufgerufen wird, wenn sich in diesen Zellen etwas verändert. Durch Einfügen von Leerzellen vor der letzten Zeile lässt sich dieser Bereich beliebig vergrößern, ohne dass ich jedes Mal die Übergabeparameter nachziehen muss.

Mein Code sieht nun so aus (Fehlerprüfung entfernt, Range als Parameter erwartet):

Code: Alles auswählen

Function LastValueInColumn(x)
	For iRow = LBound(x,1) To UBound (x,1)
		For iCol = LBound(x,2) To UBound(x,2)
			If Trim(x(iRow,iCol)) <> "" Then
				LastValueInColumn = x(iRow,iCol)
			End If
		Next iCol
	Next iRow
End Function
Mein Problem ist nun, dass ich keine Leerzellen erkenne, die es ja in dem Range (z.B. am Ende) gibt. Beim Funktionsaufruf wird der Range ja nicht als Objekt, sondern als Array übergeben und da habe ich nun nur Werte vorliegen. In diesem Fall steht Null (dezimal 0) drin, wenn der Kontostand ausgeglichen ist und wenn die Zelle leer ist.

Kann ich irgendwie erkennen, ob in den Zellen im übergebenen Range eine Zahl (in diesem Fall eine Währung) oder nichts drin steht? Oder kann ich den Übergabeparameter irgendwie als String bekommen, um darauf Zell-Objekte aufzubauen und einen Vergleich auf EMPTY durchzuführen? Ich darf hier leider keinen reinen String übergeben, da sonst keine Aktualisierung bei Zelländerungen in diesem Bereich stattfinden würde.

Nachtrag: Ich habe mir jetzt erst einmal geholfen, indem ich in die Zelle einen Leerstring hineinschreibe. Damit ist der Standarwert "0" jetzt nicht mehr in den Leerzellen enthalten. Dennoch würde es mich interessieren, ob man irgendwie "Objekte" wie in Excel an eine Funktion übergeben kann und nicht nur ein Array mit Zellwerten. Schließlich wirbt OO Basic doch immer mit den Vorzügen der objektorientierten Programmierung.
Win-XP32, LO4.1.1.2 (en)
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Calc: Range an Funktion übergeben - Leere Zellen erkenne

Beitrag von F3K Total »

Hi,
dies sollte funktionieren:

Code: Alles auswählen

Sub S_analyse_column
   osheet = thiscomponent.sheets(0)
   x = osheet.getcellrangebyname("G10:G200")
   otargetcell = osheet.getcellrangebyname("G9")
   otargetcell.value = LastValueInColumn(x)
end sub

Function LastValueInColumn(x)
   for i = 0 to x.rows.count - 1
       ocell = x.getcellbyposition(0,i)
       if oCell.Type = com.sun.star.table.CellContentType.EMPTY then 
           olastcell = x.getcellbyposition(0,i-1)
           exit for
       endif
   next i
   LastValueInColumn = olastcell.value
End Function
Gruß R
CalcWeiss
**
Beiträge: 32
Registriert: Sa, 17.08.2013 13:26

Re: Calc: Range an Funktion übergeben - Leere Zellen erkenne

Beitrag von CalcWeiss »

Die vorherige Antwort war von CalcWeiss. Irgendwie hat das Forum mich wieder als Gast behandelt.
Win-XP32, LO4.1.1.2 (en)
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc: Range an Funktion übergeben - Leere Zellen erkenne

Beitrag von Stephan »

da es ja keine Makrobindung auf "Änderung auf der Seite" gibt
klar gibt es die, per Listener schon immer (spätestens seit OOo 2.0) und per Direktzugriff, über das Kontextmenü des jeweiligen Tabellenreiters, mindestens seit OOo 3.3.0
Mit diesem Event gab es allerdings auch bei Excel enorme Probleme, denn dadurch gab es keinen Undo-Buffer mehr.
etwas schwer vorstellbar für mich. Für OOo 3.3.0 hab ichs gerade geprüft, dort geht es.
Was mir hier wirklich fehlt, ist die Übergabe des "überwachten" Bereiches als Objekt und nicht nur als Array.
Wieso reicht es nicht den Objektzugriff im Makro zu erzeugen und an das Makro nur die Adresse des Zellobjekts zu übergeben?


Gruß
Stephan
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc: Range an Funktion übergeben - Leere Zellen erkenne

Beitrag von Stephan »

Ich möchte ja in einer Zelle eine Funktion benutzen, die immer dann ausgeführt wird, wenn sich in bestimmten anderen Zellen etwas ändert. Daher muss ich diese anderen Zellen in dem Funktionsaufruf referenzieren, damit CALC weiß, wann die Funktion aufgerufen werden muss. Als z.B. A10=TueEtwas("A11:A20"). Ändere ich etwas außerhalb dieses Bereichs, dann wird die Funktion nicht aufgerufen,
Die technisch formal richtige Möglichkeit um das zu tun was Du willst wäre einen ModifyListener (http://www.openoffice.org/api/docs/comm ... tener.html) nur für den relevanten Zellbereich zu registrieren, da nur so sichergestellt ist das nur dann etwas geschieht wenn ich in einem bestimmten Bereich etwas ändert.

z.B. so:

Code: Alles auswählen

Sub addlistener
  ocell=thiscomponent.sheets(1).getcellrangebyname("A11:A20")
  oListener = CreateUnoListener( "MyApp_", "com.sun.star.util.XModifyListener" )
  ocell.addmodifylistener(olistener)
End Sub

Sub MyApp_Modified(oEvent)
  'tue irgendwas
End Sub

Robuster ist, meiner Ansicht nach, jedoch das komplett Blatt zu überwachen und bei jedem auftretenden Ereignis kurz zu prüfen ob es in den relevanten Zellbereich ausgelöst wurde.
Dazu reicht es, über das KOntextmenü des Tabellenreiters, eine Funktion der Form:

Code: Alles auswählen

Function aenderung(tmp)
	Msgbox tmp.RangeAddress.dbg_properties
End Function
zu registieren und zu prüfen die Zelle oder der Bereich innerhalb des Bereiches liegt auf welchen zu reagieren ist (im Beispiel zeigt die MsgBox die relevanten Eigenschaften an die geprüft werden müssten.
Schiebe ich ein paar Zeilen ein, dann wird diese Funktion automatisch angepasst
Ich weiß aber nicht wie das gehen soll oder verstehe das Anliegen nicht richtig.


Gruß
Stephan
CalcWeiss
**
Beiträge: 32
Registriert: Sa, 17.08.2013 13:26

Re: Calc: Range an Funktion übergeben - Leere Zellen erkenne

Beitrag von CalcWeiss »

Stephan hat geschrieben:Robuster ist, meiner Ansicht nach, jedoch das komplett Blatt zu überwachen und bei jedem auftretenden Ereignis kurz zu prüfen ob es in den relevanten Zellbereich ausgelöst wurde.
Das ist auch das, was ich bisher bei Excel verwendet hatte. Damit werde ich auf jeden Fall anfangen und die Funktionen nur dort verwenden, wo eine Array-Übergabe sinnvoll ist. Danke für den Hinweis auf den Listener, den kannte ich bisher nur in Zusammenhang mit anderen Ereignissen, nicht mit Blättern.
Win-XP32, LO4.1.1.2 (en)
CalcWeiss
**
Beiträge: 32
Registriert: Sa, 17.08.2013 13:26

Re: Calc: Range an Funktion übergeben - Leere Zellen erkenne

Beitrag von CalcWeiss »

Stephan hat geschrieben: Dazu reicht es, über das KOntextmenü des Tabellenreiters, eine Funktion der Form:

Code: Alles auswählen

Function aenderung(tmp)
	Msgbox tmp.RangeAddress.dbg_properties
End Function
zu registieren
Super Funktion. Ich denke, damit komme ich weiter.
Win-XP32, LO4.1.1.2 (en)
Antworten