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


Bonjour

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).

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.

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

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.

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.

Cordialement
Pierre-Yves
-- 
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.