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 à [email protected] 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