Date: prev next · Thread: first prev next last
2014 Archives by date, by thread · List index


Je retransfère la réponse d'André à sa demande

Message du 30/05/14 23:08
Merci de votre réponse, et désolé pour ma réponse tardive.


Message du 28/04/14 21:52
Je veux accéder une plage d'un tableur avec un macro en basic (ou autre langage)
...
La plage doit s'ajuster automatiquement si des lignes/colonnes sont insérées
ou supprimées. J'ai trouvé une façon de s'ajuster en envoyant les numéros de
colonnes et lignes, mais pas la plage directement.

Calc ne transmet que les *valeurs* de la plage et non *l'objet* plage
(ni les *objets* cellule composant la plage).

Bien, j'ai pas tout vérifié, mais après poster mon msg, je me suis rendu
compte que un "objet" n'est pas un type spécifique. J'ai trouvé la
solution avant voir votre réponse.
En ce cas-ci, l'objet était un tableau, et non une plage de tableur.

Par exemple avec un appel de fonction du type: =MAFONCTION(B6:D7)
le programme ne reçoit que les valeurs contenues dans cette plage
sous la forme d'un tableau de variant. Chaque élément du tableau
sera du type STRING ou DOUBLE selon que la cellule contient du
texte ou autre chose.

Conséquence implicite : si B6 contient par exemple 23/07/2011
la macro ne récupère *que* 40747.

Concernant la mise à jour des références lors de l'ajout ou
suppression de lignes/colonnes, il sera répercuté sur un appel
du type =MAFONCTION(B6:D7). Il n'y a rien de spécial à faire.

Autre point important : une fonction "utilisateur" ne peut que
renvoyer une valeur (DOUBLE ou STRING, voire un tableau) à la
cellule appelante (celle qui contient l'appel de la fonction).

Il n'est pas possible, là encore, de modifier *l'objet* (ni
aucun autre, par exemple la couleur de la cellule d'à côté).

Si tu veux accéder à des objets, il faut en effet passer les
références à la fonction. Par exemple avec un appel du type:
=MAFONCTION(FEUILLE();A1:C7;CELLULE("adresse";A1);CELLULE("adresse";C7))

Autrement dit, on passe le numéro de feuille, la plage sous forme
de valeur (ce qui permettra l'actualisation de la fonction si la
plage est modifiée), l'adresse de la cellule de début, celle de fin.

Il y a des autres façons de le faire plus compliqué. Dans le passé j'ai
écrit des fonctions assez complexe, pour insérer/supprimer des lignes,
trier une plage, calculer le contenu certaines cellules (numérique ou
autre), avec des boutons pour déclencher les divers macros.
Malheureusement j'ai tout perdu quand mon disque a planté, car je
n'avait pas sauvegardé la partition de développement où se trouver tout
ça. Malheureusement la documentation est moins que complète.

Ce type d'appel sera mis à jour automatiquement en cas d'insertion
ou suppression de ligne/colonnes.

Nota: comme déjà indiqué la fonction ne pourra modifier que la
valeur de la cellule appelante. Il existe une possibilité de
traitement asynchrone que je n'évoque que pour mémoire.

j'ai défini la feuille par son nom, utilisant
oFeuille = thisComponent.Sheets.getByName("nom-de-feuille").
Mais print oFeuille.getCellByPosition(col,ligne) donne l'erreur
«valeur de propriété incorrect»

Avec cette syntaxe tu demandes d'afficher (print) un objet complexe
ce qui est impossible. Tu pourrais faire par exemple :

print oFeuille.getCellByPosition(col,ligne).string

Oui, j'avais oublié ça quand j'ai posté mon message.

Nota: ceci pourrait s'envisager lors de la mise au point de la
formule mais pas en fonctionnement "réel"...

Pour terminer, si des traitements sur les objets (ajouts de
données, modification de format, etc.) doivent être effectués
lors de mise à jour de cellules, il est souvent préférable
de recourir à des macros "sur événement" qu'à des fonctions.

Bien sûr, la plupart du temps. Il y a des boques dans LibO (et OOo
avant) où les champs ne sont pas bien calculé au chargement du tableur.

Si tu réponds, merci de penser à utiliser la fonction "répondre à tous"
du logiciel de courrier électronique ou du webmail de façon que la liste
reçoive la réponse.

J'aurais dû aimer le faire, mais je n'ai plus l'adresse.
Si vous pouvez transférer ma réponse à la liste, ce serait bien apprécié.

Cordialement
--
André

-- 
Envoyez un mail à users+unsubscribe@fr.libreoffice.org pour savoir comment vous désinscrire
Les archives de la liste sont disponibles à http://listarchives.libreoffice.org/fr/users/
Tous les messages envoyés sur cette liste seront archivés publiquement et ne pourront pas être 
supprimés

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.