[Résolu] [Calc] Autofiltre et impression filtrée

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
ddnet473
Fraîchement OOthentifié
Messages : 1
Inscription : 14 avr. 2008 10:23

[Résolu] [Calc] Autofiltre et impression filtrée

Message par ddnet473 »

Je suis en train d'essayer OpenOffice - Calc pour vérifier si nous ne pourrions pas l'utiliser dans notre petite PME. Les utilisateurs ont des connaissances très basiques de l'informatique et ne souhaitent/veulent pas rentrer dans la programmation (Ni VB sous Excel, ni Basic sous OOo).

Et moi je bute sur un ch'ti problème : dans un tableau Excel utilisé par tous le monde, il y a une macro qui filtre un champ et qui imprime le planning pour chaque ressource atelier :

| N° Affaire | Date de besoin | Ressource | Temps prévu |

La 1ere ligne de la feuille de calcul est filtrée par la commande :
"Données -> Filtrer -> Filtre Automatique" dans Excel

Que j'ai reproduit dans Calc par :
"Données -> Filtre -> Autofiltre"

La macro actuelle dans Excel filtre le champs ressource pour chaque ressource et imprime le planning :
  • Ressource = CN puis imprime
    Ressource = Plieuse puis imprime
    etc
J'ai essayé de faire la même chose dans Calc avec la fonction d'enregistrement de macro mais apparemment le filtrage ne se fait pas. J'ai regardé dans le l'éditeur, et en effet je ne vois pas les conditions de filtrage affichées.

J'ai alors cherché sur le forum et j'ai trouvé (par exemple) ce post :
http://user.services.openoffice.org/fr/ ... -asc-.html

Ma question est la suivante :

Faut-il éditer puis programmer "manuellement" la macro pour paramétrer les conditions ? Ou bien : Est-ce que je n'ai rien compris ?

Je ne recherche spécialement pas la solution à ce problème là (je pense l'avoir trouvé en fouinant sur le forum "Macros"). Ce que je cherche c'est simplement une réponse de principe. A savoir : faut-il mettre "les mains dans le cambouis" après avoir enregistré une série de commandes via l'enregistreur de macros ?

Merci de me faire partager vos avis et/ou suggestions

Cordialement.
Dernière modification par ddnet473 le 22 avr. 2008 09:04, modifié 1 fois.
OpenOffice 2.4.0 sous Windows XP
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

Re: [Calc] Macro avec Autofiltre - Question de principe

Message par Pierre-Yves Samyn »

Bonjour et bienvenue sur ce forum
ddnet473 a écrit :Je suis en train d'essayer OpenOffice - Calc pour vérifier si nous ne pourrions pas l'utiliser dans notre petite PME.
Très bonne idée :)
ddnet473 a écrit :Les utilisateurs ont des connaissances très basiques de l'informatique et ne souhaitent/veulent pas rentrer dans la programmation (Ni VB sous Excel, ni Basic sous OOo).
Et puis ce n'est pas leur travail effectivement...
ddnet473 a écrit :Et moi je bute sur un ch'ti problème
Bienvenue chez les... problèmes... et leurs solutions :)
ddnet473 a écrit :Ma question est la suivante :

Faut-il éditer puis programmer "manuellement" la macro pour paramétrer les conditions ?


Oui, comme tu l'as justement observé l'enregistreur de macros a de nombreuses limites. Le lancement de commandes ouvrant des dialogues et demandant des paramètres en est une en effet... :(

Et donc la réponse est oui, il faut généralement passer à la programmation "classique" dès que les besoins sont un peu évolués...

Je te propose un exemple proche de ce que tu signales : le clic sur le bouton crée un filtre sur la plage de données, sélectionnant uniquement les lignes pour lesquelles la colonne Qté est non nulle, puis crée une feuille nommée Fax ne contenant que ces lignes, en vue d'une impression (non réalisée par la macro).

Le programme teste l'existence de la feuille Fax et gère le remplacement de celle-ci lors des éditions suivantes.

Le code étant assez complexe est commenté :

Code : Tout sélectionner

option explicit

sub PysFilter

Const PysNomFeuille = "Commandes"			'Nom de la feuille concernée
Const PysNomFeuilleDest = "Fax"
Const PysColDeb = 0							'Numérotation commence à zéro => 1ère colonne
Const PysColFin = 2							'Ibid.
Const PysLigDeb = 2
Const PysLigFin = 10

dim PysFeuille as object, PysFeuilleDest as object, PysPlage as object, PysFiltre as object, PysDataRange as object
dim i as integer, PysNumFeuille as integer, PysRep as integer
dim PysChampFiltre(0) As New com.sun.star.sheet.TableFilterField   


PysRep = msgbox("La feuille Fax sera réinitialisée, continuer", 36, "Création du fax")

if PysRep = 6 then			'Si on répond Oui on continue le traitement
	if thiscomponent.sheets.hasByName("Fax") then		'Suppression du fax précédent
		thiscomponent.sheets.RemoveByName("Fax") 
	end if	
	thiscomponent.sheets.insertNewByName("Fax", thiscomponent.sheets.count) 
	
	PysFeuille = thisComponent.Sheets.getByName(PysNomFeuille)          'Accès à la feuille dont le nom est en constante
	PysNumFeuille = PysFeuille.RangeAddress.Sheet						'Trouve le n° d'ordre de la feuille
	PysPlage = PysFeuille.getCellRangeByPosition(PysColDeb,PysLigDeb,PysColFin,PysLigFin)   'Accès à la plage concernée
	
	PysFeuilleDest = thisComponent.Sheets.getByName(PysNomFeuilleDest)          
	
	'Ci-dessous réinitialise le filtre éventuellement déjà posé sur la plage
	PysFiltre= PysPlage.createFilterDescriptor(true)
	PysPlage.filter(PysFiltre) 
	
	for each PysDataRange in thiscomponent.DatabaseRanges            'Boucle sur toutes les plages de données
	
	                                                   'Si porte sur la même plage
	   if PysDataRange.DataArea.Sheet = PysNumFeuille and _
	      PysDataRange.DataArea.StartColumn = PysColDeb and _
	      PysDataRange.DataArea.EndColumn = PysColFin and _
	      PysDataRange.DataArea.StartRow = PysLigDeb and _
	      PysDataRange.DataArea.EndRow = PysLigFin then
				PysFiltre = PysDataRange.FilterDescriptor		'Accès aux paramètres du filtre
				with PysFiltre									'Les paramètres généraux
					.ContainsHeader = true						'La première ligne = en-tête de colonnes
					.CopyOutputData = true						'Copie le résultat ailleurs
																'Où veut-on le résultat
					.OutputPosition = PysFeuilleDest.getCellRangeByName("A3").CellAddress
					.UseRegularExpressions = false				'N'utilise pas d'expressions régulières
				end with
	
	'Ci-dessous les paramètres par colonne (ici une seule colonne de filtre)		
				PysChampFiltre(0).Field = 2 					'La quantité est en colonne C
				PysChampFiltre(0).IsNumeric = true
				PysChampFiltre(0).Operator = com.sun.star.sheet.FilterOperator.GREATER
				PysChampFiltre(0).NumericValue = 0
				PysFiltre.setFilterFields(PysChampFiltre())		'Passe les param. "colonnes" au filtre
				PysPlage.filter(PysFiltre)						'Applique le filtre
	   end if
	next PysDataRange
	
	PysFeuilleDest.copyrange(PysFeuilleDest.getCellRangeByName("A1").cellAddress, PysFeuille.getCellRangeByName("A1").rangeAddress)
	
	for i = 0 to 3												'Applique la même présentation pour le fax
																'que la feuille de données
		PysFeuilleDest.columns(i).width = PysFeuille.columns(i).width
		PysFeuilleDest.rows(i).height = PysFeuille.rows(i).height
	next i
																'Active la feuille Fax
	thiscomponent.currentcontroller.activeSheet = PysFeuilleDest	
end if
msgbox "Terminé", , "Création de fax"	
end sub 

Exemple : http://user.services.openoffice.org/fr/ ... 080210.ods
Surb
Fraîchement OOthentifié
Messages : 2
Inscription : 08 avr. 2013 22:12

Re: [Resolu] [Calc] Autofiltre et impression filtrée

Message par Surb »

Bonjour,

Je me suis inscrit juste pour féliciter la qualité de cet exemple :bravo:.

MERCI :super:
OOo 3.3.0 / Mac OS X 10.6.8