2017-03-22 3 views
0

J'ai besoin de dev Listener pour détecter les changements du paramètre isVisible pour une ligne dans calc.Hide Rows/Autofilter Listener - OpenOffice Basic

Encore mieux, ce serait pour moi d'avoir un écouteur de changements de filtre automatique - c'est aussi au-delà de mes compétences. Je serais reconnaissant pour l'aide ou les deux solutions.

XEventListener ni XModifyListener ne détecte pas ces changements. Peut-être essayer d'utiliser XChangesListenerXChangesNotifier? < - de toute façon, j'avais problème à mettre en œuvre pour les tests trop

Sub add_eventsListener 
    Dim ePrefix As String, eService As String 

    ePrefix = "event_" 
    eService = "com.sun.star.document.XEventListener" 

    If IsNull(mEventHandler) Then 
     mEventHandler = CreateUnoListener(ePrefix, eService) 
     ThisComponent.addEventListener(mEventHandler) 
    EndIf 
End Sub 

Sub event_notifyEvent(oEvent) 
    msgbox "event: " & oEvent.EventName 
End Sub 


Sub add_modifyListener(ByRef Sheet) 
    Dim ePrefix As String : Dim eService As String 
    Dim cell as Object 

    ePrefix = "event_" 
    eService = "com.sun.star.util.XModifyListener" 

    cell = Sheet.getCellrangeByName("A2:A9") 

    If IsNull(mModifyHandler) Then 
     mModifyHandler = CreateUnoListener(ePrefix, eService) 
     cell.AddModifyListener(mModifyHandler) 
    EndIf 
End Sub 

Sub event_modified(oEvent) 
    'If oEvent.Source.CellAddress.Column <> 0 Then Exit Sub 
    Msgbox "changes made" 
End Sub 

mEventHandler et mModifyHandler sont globaux

Sub add_autofilter(ByRef Sheet) 
On Error GoTo Err 
    Dim Range As New com.sun.star.table.CellRangeAddress 
    Dim FilterOn As Boolean, dRange As Object, cell As Object, row% 
    FilterOn = False 

    cell = Sheet.getCellRangeByName("A1") 
    row = getLastRow(Sheet) 

On Error Resume Next 
    dRange = ThisComponent.DatabaseRanges.getByName("Symbols") 
    FilterOn = dRange.AutoFilter 
On Error GoTo 0 : On Error GoTo Err 

    If FilterOn Then Exit Sub 

    With Range 
     .Sheet = 0 
     .StartColumn = 0 
     .StartRow = 0 
     .EndColumn = 0 
     .EndRow = row 
    End With 

    'Range = Sheet.getCellRangeByPosition(0, 0, 0, row) 
    ThisComponent.DatabaseRanges.addNewByName("Symbols", Range) 
    ThisComponent.DatabaseRanges.getByName("Symbols").AutoFilter = True 
Exit Sub 
Err: 
End Sub 


Function getLastRow(ByRef Sheet) As Integer 
    Dim cursor 
    cursor = Sheet.createCursor() 
    cursor.gotoEndOfUsedArea(false) 
    getLastRow = cursor.getRangeAddress().EndRow 
End Function 

Répondre

0

Alors que je suis en attente de solution rationnelle, je trouve une solution de contournement - Si aucun écouteur autofilter sera possible, Ill doivent rester avec cette:

formule dans une cellule ajouter: (ancienne solution, vérifier EDIT ci-dessous)

"= SI (NOW()> 0; ROWS_FILTERED(); 0)"

Function ROWS_FILTERED() As Integer 
    If Freezed Then Exit Function 
    Dim i%, rows%, Sheet As Object : Sheet = ThisComponent.Sheets(0) 
    rows = getLastRow(Sheet) 
    For i = 1 to getLastRow(Sheet) 'row 0 is for labels 
     If Sheet.Rows(i).IsVisible = True Then 
      rows = rows - 1 
     End If 
    Next i 
    ROWS_FILTERED = rows 
End Function 

Et si vous apportez des modifications où les calculs ne sont pas attendus, juste assigner True-Global Freezed pour ce moment-là


EDIT: eureka! J'ai trouvé cette formule brillante qui fonctionne et mise à jour sans contournement:

Eureka! Mimo że nie osiągnąłem rezultatu z czystego BASIC'a, znalazłem genialną formułę, która się odnosi bezpośrednio do autofiltra !! i updateuje bez obejścia:

"= SUBTOTAL (3; A2: A" & getLastRow (feuille) + 1 & ")"

ne pas oublier d'inclure la fonctiongetLastRow(ByRef Sheet)au code de votre