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