Pagina 1 di 1

[Risolto] Macro per modifica filtro automatico

Inviato: mercoledì 1 maggio 2019, 12:05
da chris1971
Salve, ho un problema con la modifica di un filtro automatico.
Il problema è che il filtro non è posizionato sulla prima riga del foglio ma sulla n.4 e quando applico il filtro con la macro, funziona ma mi cancella le prime righe.

Ho provato ad utilizzare i comandi CopyOutputData e OutputPosition per cambiare la posizione del risultato, ma c'è qualcosa che sbaglio nel listato.

Per comodità inserisco il codice ed un esempio.
Prima di premere il pulsante utilizzate il filtro automatico e cambiate le spese selezionando "CASA" ed il filtro funziona.
Vorrei fare lo stesso con la macro associata ad un pulsante, ma non funziona e dopo che è stata avviata il filtro automatico elimina le intestazioni.

Grazie anticipatamente a chi vorrà aiutarmi.

Codice: Seleziona tutto

sub filtro ()

Dim oSheet ' Sheet to filter.
Dim oRange ' Range to be filtered.
Dim oFilterDesc as object' Filter descriptor.
dim oCelDest as object
Dim oFields(0) As New com.sun.star.sheet.TableFilterField
oSheet = ThisComponent.Sheets.getByName("SPESE")
oRange = oSheet.getCellRangeByPosition(0,4,9,1500)
'oSheet.setDataArea( oRange )
oFilterDesc = oRange.createFilterDescriptor(true)

oSheet.filter(oFilterDesc)'NEW

With oFields(0)
 .Field = 1
 .IsNumeric = False ' Use a string, not a number.
 .StringValue = "CASA" 
 .Operator = com.sun.star.sheet.FilterOperator.EQUAL			
End With

oCelDest = oSheet.getCellRangeByName("A5")

With oFilterDesc
 .ContainsHeader = TRUE
 .CopyOutputData = TRUE
 .OutputPosition = oCelDest.CellAddress
 .UseRegularExpressions = TRUE
 .setFilterFields(oFields())
End With

oSheet.filter(oFilterDesc)

End Sub


Re: Macro per modifica filtro automatico

Inviato: mercoledì 1 maggio 2019, 12:58
da hubert lambert
Ciao Chris,

Ecco una version che la fa:

Codice: Seleziona tutto

Sub filtro()
    Dim oFields(0) As New com.sun.star.sheet.TableFilterField
    oSheet = ThisComponent.Sheets.getByName("SPESE")
    oRange = oSheet.getCellRangeByPosition(0,3,9,1500)
    oFilterDesc = oRange.createFilterDescriptor(true)
    With oFields(0)
         .Field = 1
         .IsNumeric = False ' Use a string, not a number.
         .StringValue = "CASA" 
         .Operator = com.sun.star.sheet.FilterOperator.EQUAL            
    End With
    With oFilterDesc
         .ContainsHeader = TRUE
    '     .UseRegularExpressions = TRUE
         .setFilterFields(oFields())
    End With
    oRange.filter(oFilterDesc)
End Sub
Le due correzioni:
1. il "range" deve contenere la riga di intestazione:

Codice: Seleziona tutto

    oRange = oSheet.getCellRangeByPosition(0,3,9,1500)
2. il filtro va applicato al "range", non al foglio:

Codice: Seleziona tutto

    oRange.filter(oFilterDesc)
Cordiali saluti.

Re: Macro per modifica filtro automatico

Inviato: mercoledì 1 maggio 2019, 13:21
da chris1971
Grazie mille, funziona perfettamente.

Purtroppo però forse ho sbagliato il quesito, nel senso che in questo modo non è esattamente come modificare il filtro automatico ed in questo modo cambia i dati della celle perdendo il filtro automatico.

C'è un modo per modificare via macro il filtro automatico come se stessimo lavorando senza macro e non perdere la relativa formattazione.
In questo modo potrei quindi usare sia la macro che la freccia con le opzioni automatiche.

Grazie

Re: Macro per modifica filtro automatico

Inviato: mercoledì 1 maggio 2019, 18:14
da hubert lambert
Puoi provare il file allegato, che da me funziona senza perdere nulla del filtro automatico o della formattazione ? Anche la freccia del filtro automatico diventa blu dopo l'esecuzione della macro.

Re: Macro per modifica filtro automatico

Inviato: mercoledì 1 maggio 2019, 23:05
da chris1971
Hai ragione.
Grazie ancora tantissimo.