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