Yves LOMBARDOT a écrit :
[...]
Bonjour,
Merci de cette première réponse, je cherche toujours mais si cela peut vous aider à comprendre d'où vient mon problème, voici la macro qui fonctionnait très bien sous Ooo 2.4. Je m'empresse de rappeler qu'elle m'a été gracieusement donnée et que, si je peux y modifier les différentes zones, j'aurais été bien incapable de la produire. Et sans la macro mais avec le filtre "Données/filtre/filtre spécial" je ne trouve pas l'option "utiliser expression régulière". Je peux adresser une version basique du fichier si besoin
Milles excuses pour mon inculture
Yves LOMBARDOT
----------------------------
En complément des explications donné sur la boite de dialogue de filtre,
Voici quelques explications pour que tu comprenne ce que fait ta macro.

Option Explicit

Sub monFiltreSpecial()

Dim oPlage        as Object
Dim optFiltre    as Object
Dim oFeuille    as Object
Dim oCellule    as Object
Dim oCriteres    as Object

oFeuille = thisComponent.Sheets.getByName("Extraction")
thisComponent.currentController.activeSheet = oFeuille
Ces deux lignes te permettent d'activer la feuille qui se nomme Extraction (là ou tu va mettre le résultat de ton filtre)

Effacement()
C'est un appel à la procédure nommé Effacement qui efface le contenu actuel de la feuille active.


    oCellule = thisComponent.Sheets(2).getCellRangeByName("A4")
Déclaration d'un objet du type Cellule (c'est la cellule ou le résultat de ton filtre se mettra)

    oPlage = thisComponent.Sheets(0).getCellRangeByName("A2:i5001")
    oCriteres = thisComponent.Sheets(1).getCellRangeByName("A11:i250")
Tu défini ici la base de données à filtre dans oplage et la zone qui te servira de critère pour filtrer dans ocriteres


    optFiltre = oCriteres.createFilterDescriptorByObject(oPlage)
Création de l'objet paramètre de filtre optfiltre

Les lignes qui commence par optfiltre sont celles ou tu paramètre ton filtre
    optFiltre.setPropertyValue("ContainsHeader",TRUE)
Cette ligne indique que ta base de données (et donc aussi ton filtre) possèdent une zone d'en-tête qui te permet d'identifier tes colonnes (champs).

    optFiltre.setPropertyValue("UseRegularExpressions",TRUE)
Cette ligne indique que ton filtre travaille avec des expressions régulières (voir comment écrire les expressions régulières dans l'aide)

    optFiltre.setPropertyValue("CopyOutputData",TRUE)
    optFiltre.setPropertyValue("OutputPosition",oCellule.CellAddress)
Et ces deux lignes te permettent de dire que tu veux extraire le résultat vers une autre cellule


    oPlage.filter(optFiltre)
Ça, c'est pour exécuter le filtre avec les options que tu as définie


End Sub



Ça c'est la procédure qui efface le contenu de la feuille active.
De la cellule A5 jusqu'à la cellule I5006

C'est généré avec l'enregistreur de Macro. Je pense que tu as peut être un pb ici

Sub Effacement()

Dim oDocument    as object
Dim oDispatcher    as object

oDocument   = thisComponent.CurrentController.Frame
thisComponent.currentController.activeSheet = thisComponent.Sheets(2)
Cette ligne peut poser pb si tu as inséré des feuilles devant celles existantes (car cela sélectionne la feuille N° de 2 de ton classeur).

Il faut mieux travailler avec les noms de feuille si jamais tu compte insérer des feuilles dans ton classeur devant la feuille N° 2 ou tu colles le résultat de tes extractions.

Donc tu devrais plutôt ajouter

thisComponent.currentController.activeSheet = oFeuille
 ou oDocument.Sheets.getByName("Extraction") pour remplacer ofeuille

Ou alors simplement supprimer la ligne précédente
(vu que dans la procédure appelante tu sélectionne déjà ofeuille)


oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$A$5:$I$5006"

oDispatcher.executeDispatch(oDocument, ".uno:GoToCell", "", 0, args1())

oDispatcher.executeDispatch(oDocument, ".uno:ClearContents", "", 0, Array())

dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "Sel"
args3(0).Value = false

oDispatcher.executeDispatch(oDocument, ".uno:GoToStart", "", 0, args3())

End Sub



Pour nettoyer une feuille, personnellement j'utilise ce code qui sélectionne toute la feuille et supprime vraiment tout.


sub netoiefeuilles
   dim document   as object
   dim dispatcher as object
   dim args1(0) as new com.sun.star.beans.PropertyValue

   args1(0).Name = "Flags"
   args1(0).Value = "A"
                
   dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

        
   oDocument.CurrentController.ActiveSheet = oFeuille

   document   = ThisComponent.CurrentController.Frame
        
   dispatcher.executeDispatch(document, ".uno:SelectAll", "", 0,Array())

   dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args1())
        
oDocument.CurrentController.ActiveSheet = oDocument.Sheets.getByName("Extraction")
        
   document   = ThisComponent.CurrentController.Frame
        
   dispatcher.executeDispatch(document, ".uno:SelectAll", "", 0, Array())

   dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args1())

end sub


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@fr.openoffice.org
For additional commands, e-mail: users-h...@fr.openoffice.org

Répondre à