ein Listener mehrere CellRanges

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

Moderator: Moderatoren

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

ein Listener mehrere CellRanges

Beitrag 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?
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: ein Listener mehrere CellRanges

Beitrag 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.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: ein Listener mehrere CellRanges

Beitrag von clag »

Hallo,
Entwarnung, so im Groben läuft es jetzt mit dem Array und CellRanges.
Werde das Ergebnis dann noch hochladen.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: ein Listener mehrere CellRanges

Beitrag von clag »

Hallo
so nun tut das Makro in etwa was ich erreichen wollte, drei CellRanges in drei Tabellen überwachen.
listener_C1-C50_r3.ods
(12.98 KiB) 173-mal heruntergeladen
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
  
'------------------------------------------------------------------------------
  
  
LG
clag

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

Re: ein Listener mehrere CellRanges

Beitrag 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
Antworten