Seite 1 von 1
ein Listener mehrere CellRanges
Verfasst: Fr, 19.08.2016 09:29
von clag
Hallo Kenner und Könner,
in bezug auf diese
Fragestellung war ich neugierig wie man das machen könnte, bin aber nicht wirklich erfolgreich dabei, nun frage ich mich, kann man überhaupt mit einem Listener mehrere Bereiche überwachen?
Ich habe es mit mehreren benannten Bereichen versucht bin aber grandios gescheitert
z.B. so
Code: Alles auswählen
CellRng = oCalc.NamedRanges.getByName("BereichTab1").ReferredCells, _
oCalc.NamedRanges.getByName("BereichTab2").ReferredCells, _
oCalc.NamedRanges.getByName("BereichTab3").ReferredCells
wobei der erste Bereich noch überwacht wird, die beiden anderen aber nicht, zumindest gibt es keinen Trigger.
Jeweils als eigener Listener tut es problemlos, nur das produziert ggf. auch drei Events was eher stört,
Code: Alles auswählen
CellRng1 = oCalc.NamedRanges.getByName("BereichTab1").ReferredCells
CellRng2 = oCalc.NamedRanges.getByName("BereichTab2").ReferredCells
CellRng3 = oCalc.NamedRanges.getByName("BereichTab3").ReferredCells
oListener = createUnoListener("Modify_","com.sun.star.util.XModifyListener")
CellRng1.addModifyListener(oListener)
CellRng2.addModifyListener(oListener)
CellRng3.addModifyListener(oListener)
geht das besser zu machen, wenn ja wie?
Re: ein Listener mehrere CellRanges
Verfasst: Fr, 19.08.2016 13:51
von clag
Hallo,
habe einen etwas
älteren Beitrag gefunden, der meine eigentliche Frage "ein Listener mehrere CellRanges" mit einem klaren Ja beantwortet,
DPunch hat geschrieben:Es reicht ein einziger Listener, der auf mehrere Zellbereiche angesetzt wird.
...
-Du musst die Zellbereiche global hinterlegen, vornehmlich in einem Array
Allerdingst habe ich noch nicht aus dem Beispielcode extrahieren können, wie ich nun genau die verschiedenen CellRanges in ein Array schreiben kann. Vielleicht kann da nochmal jemand mit der Zaunlatte oder besser mit einem Code-Beispiel winken.
Re: ein Listener mehrere CellRanges
Verfasst: Fr, 19.08.2016 16:29
von clag
Hallo,
Entwarnung, so im Groben läuft es jetzt mit dem Array und CellRanges.
Werde das Ergebnis dann noch hochladen.
Re: ein Listener mehrere CellRanges
Verfasst: Fr, 19.08.2016 20:45
von clag
Hallo
so nun tut das Makro in etwa was ich erreichen wollte, drei CellRanges in drei Tabellen überwachen.
Die Benannten Bereichen konnte ich nicht ins Array laden aber mit "getbyPosition" tut es auch !?
Code: Alles auswählen
REM ***** BASIC *****
Global oListener as Object
Global CellRng as Object
Global myCellArray(2) as Object
Global ListenerRunCheck as Boolean
Sub AddListener
if ListenerRunCheck then exit sub
Dim oCalc, oSheet, oCell as Object
oCalc = ThisComponent
oListener = createUnoListener("Modify_","com.sun.star.util.XModifyListener") 'create a listener
For ix=0 To 2 'nSheetCount
oSheet = oCalc.Sheets(ix)
myCellArray(ix) = oSheet.getCellRangeByPosition(2,0,2,49)
myCellArray(ix).addModifyListener(oListener)
Next ix
ListenerRunCheck =true
End Sub
'------------------------------------------------------------------------------
Sub Modify_modified(oEv) 'macro jumps here when oListener detects modification of Sheet
CalledRoutine()
End Sub
'------------------------------------------------------------------------------
Sub Modify_disposing(oEv)
End Sub
'------------------------------------------------------------------------------
Sub RmvListener
If isNull(oListener) Then Exit Sub
For iy = 0 To 2
myCellArray(iy).removeModifyListener(oListener)
Next iy
ListenerRunCheck = False
MsgBox "ModifyListener aus allen Tabellen entfernt"
End Sub
'------------------------------------------------------------------------------
Sub CalledRoutine
oCalc = ThisComponent
for r=0 to uBound(myCellArray())
aData = myCellArray(r).getdata
for i=0 to uBound(aData())
aTab = Split(myCellArray(r).absolutename,"$")
aCols= aData(i)
for ic=0 to uBound(aCols)
V= aCols(ic)
if V < 0 then liste = liste & aTab(1) & aTab(2) & i+1 & " = " & V & chr(13)
next
next
next
if len(liste) > 2 then
msgbox liste
endif
End Sub
'------------------------------------------------------------------------------
Re: ein Listener mehrere CellRanges
Verfasst: Mo, 03.10.2016 22:54
von Andromeda_104
Hallo clag,
ich hatte mit deinem Listener aus der letzten Problematik ([gelöst]Makro soll gestartet werden, wenn Zelle den Wert 1 hat) noch etwas probiert und bin auch über Mehrfachauslösungen gestolpert. Habe dann einzelne Überwachungsbereiche als Variablen gesetzt und in der Routine als separate if-Bedingungen abgerufen. Ist zwar etwas umständlich, funktioniert aber ohne Hakelei. Allerdings habe ich ganze Zellbereiche noch nicht probiert; nur einzelne Zellen. Ich stelle mal noch die veränderte Listener-Datei für zwei Felder unter dem alten Faden ein. Vielleicht hilft das dem einen oder anderen hier auch weiter.
Grüße von Andromeda_104