Bouton de tri : comment récupérer le n° de colonne dans le code basic ?

Bonsoir,

J'essaie d'améliorer une feuille sous calc qui nous permet de former des groupes d'élèves.

J'ai défini une plage de donnée qui contient les élèves de 3 classes.

Les 1eres colonnes contiennent les noms, prénoms, classes des élèves. Ensuite, chaque colonne contient des informations liés à des groupes.

Je voudrais ajouter un bouton en haut de chaque colonne avec une macro associée pour effectuer un tri selon cette colonne (en 1er critère, puis selon nom+prénom) en 2ème+3ème critère.
Mais je voudrais que ce soit la même macro associée à chaque bouton qui fasse le tri (pour éviter d'enregistrer 15 macros quasi-identiques).
Il faut donc récupérer le n° de colonne où est placé le bouton dans la macro. Et c'est là que je ne sais pas faire.

Voici un exemple de ce que ça donne pour la colonne 5 (qui contient la classe de l'élève) (au début, la macro sélectionne la plage ad hoc).

dim args2(11) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ByRows"
args2(0).Value = true
args2(1).Name = "HasHeader"
args2(1).Value = false
args2(2).Name = "CaseSensitive"
args2(2).Value = false
args2(3).Name = "NaturalSort"
args2(3).Value = false
args2(4).Name = "IncludeAttribs"
args2(4).Value = true
args2(5).Name = "UserDefIndex"
args2(5).Value = 0
args2(6).Name = "Col1"
args2(6).Value = 5
args2(7).Name = "Ascending1"
args2(7).Value = true
args2(8).Name = "Col2"
args2(8).Value = 2
args2(9).Name = "Ascending2"
args2(9).Value = true
args2(10).Name = "Col3"
args2(10).Value = 3
args2(11).Name = "Ascending3"
args2(11).Value = true

dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args2())

A la place de
args2(6).Value = 5

je voudrais affecter le n° de la colonne du bouton.

Comment faire ?

Christophe

Bonjour

Une possibilité parmi d'autres... utiliser la propriété "Complément
d'information" disponible en bas dans l'onglet Général des propriétés du
bouton. Dans cette zone tu mets le numéro de colonne devant
être triée quand on clique sur le bouton.

Dans la copie d'écran ci-dessous on associe par exemple la colonne 2
au bouton sélectionné :

<http://nabble.documentfoundation.org/file/n4018724/PropriétéTag.png>

Ensuite, pour récupérer cette information dans le programme :

1. Ajouter au nom de la macro et entre parenthèse un nom de
variable qui permettra de "remonter" à l'événement appelant
(autrement dit remonter du clic au bouton).

Exemple :

sub tri(PysEvent)

Nota : PysEvent est un exemple, tu peux mettre ce que tu veux. Si tu
modifies, il faut aussi modifier dans la ligne donnée ci-dessous.

2. Remplacer la ligne

args2(6).Value = 5

par :

args2(6).Value = cint(PysEvent.source.model.Tag)

Cf. l'explication ci-dessus, on part de l'événement pour remonter
au bouton et accéder à la propriété (Tag = complément d'info.)

La propriété est un texte, et on veut un numéro de colonne : la
fonction cint convertit le texte en entier.

Pour terminer, on voit que désormais la procédure "attend" un
paramètre pour fonctionner. Autrement dit, tu ne pourras plus
tester la procédure depuis l'environnement de programmation
(l'éditeur dans lequel tu écris les macros). Le message d'erreur
associé serait "l'argument n'est pas facultatif".

Cordialement
Pierre-Yves

Bonjour

La propriété est un texte, et on veut un numéro de colonne : la
fonction cint convertit le texte en entier.

je conseillerai l'utilisation systematique de cLng plutot que cInt don l'argument est limité à 32000

maintenant dans notre cas, comme on cherche une colonne (max 1024) c'est pas un souci

Laurent

Suite ...

Tout d'abord une remarque d'usage de la liste. Dans ton courielleur
ou ton webmail il faut utiliser "Répondre à tous" ou "Répondre à la liste"
sinon ta réponse n'est envoyée qu'au destinataire et non à la liste...
avec le risque qu'elle se perde.

Christophe wrote

Ça fonctionne bien. J'ai quand même une question et une remarque :

- n'y a-t-il pas moyen de récupérer par l'API le numéro de colonne dans
laquelle est ancrée le bouton (dans le cas où le bouton est ancré à la
cellule et non au bouton) ? Cela éviterait de modifier le champ
"complément d'info" de chaque bouton.

J'avais préféré te donner une réponse simple puisque tu sembles
débuter (comme je l'indiquais il y aurait d'autres possibilités, y
compris d'ailleurs sans passer par l'enregistreur de macros).

Ce point (récupérer la cellule d'ancrage) est un peu complexe. Le
principe est de parcourir la "couche" dans laquelle sont dessinés
les boutons. Dans celle-ci on compare le nom de chaque objet avec celui
du bouton ayant déclenché la procédure. En cas d'égalité on accède
à l'ancre qui donne... enfin... la colonne. Je joins un fichier exemple.

RecupColBouton.ods
<http://nabble.documentfoundation.org/file/n4018813/RecupColBouton.ods>

Nota : il s'agit d'un exemple "minimum" ; un certain nombre de vérifications
pourraient être ajoutées. J'attire ton attention sur le fait que les boutons
doivent avoir un nom unique dans la feuille pour que cela fonctionne.

Christophe wrote

- lorsque je recharge ma feuille, je ne vois qu'un bouton en haut à
gauche. Une fois que j'ai cliqué dessus, tous les boutons que j'ai créés
se mettent en place en haut des colonnes... Je ne comprends pas trop
(j'ai ancré les boutons à la cellule, peut-être que c'est une
fonctionnalité non stabilisée).

L'ancrage à la cellule ne provoque pas, en principe ces dysfonctionnements.
Vérifie avec l'exemple joint à ce message. Si tu reproduis le problème cela
vient sans doute de ta configuration.

Cordialement

Suite ...

Tout d'abord une remarque d'usage de la liste. Dans ton courielleur
ou ton webmail il faut utiliser "Répondre à tous" ou "Répondre à la liste"
sinon ta réponse n'est envoyée qu'au destinataire et non à la liste...
avec le risque qu'elle se perde.

Désolé, je n'avais pas remarqué ce fonctionnement.

J'avais préféré te donner une réponse simple puisque tu sembles
débuter (comme je l'indiquais il y aurait d'autres possibilités, y
compris d'ailleurs sans passer par l'enregistreur de macros).

J'ai une bonne expérience de programmation (en C) mais je connais très mal l'API LO-OOo. Je bidouille de temps en temps.
J'ai la velléité de me plonger plus dedans, mais ça demande du temps et des ressources documentaires à mon niveau.

Bref, j'ai transposé ton exemple dans ma macro. Ça marche très bien.

Pour le pb des boutons pas au bon endroit au départ, je vais voir sur les postes du boulot si c'est reproductible.

Dernière remarque : le nom que l'on renseigne dans la fenêtre "propriété du bouton", onglet "Général" n'est pas le même que celui que l'on renseigne dans la fenêtre "nom" (clic droit en mode ébauche et choisir "nom"). Curieux non ?

Merci bcp pour ton aide précieuse et bon week end,
Christophe

Suite...

Christophe Daudin wrote

Dernière remarque : le nom que l'on renseigne dans la fenêtre "propriété
du bouton", onglet "Général" n'est pas le même que celui que l'on
renseigne dans la fenêtre "nom" (clic droit en mode ébauche et choisir
"nom"). Curieux non ?

En effet, il ne s'agit pas du "même" nom mais de celui que tu retrouveras
dans le navigateur dans les "objets de dessin".

Bon week-end
Pierre-Yves