Résolu [Excel 2007] utiliser variable dans expression entre guillemets

  • Auteur de la discussion antoine_16
  • Date de début

antoine_16

Nouveau membre
Bonjour,

Je n'arrive pas à intégrer une variable dans une expression entre guillemets.
Par exemple, dans le code suivant, je souhaite remplacer le A de A1 par la variable i :
[cpp]Range("A1").Select[/cpp]Bien sûr on peut le faire ainsi :
[cpp]Range(Chr(65+i) & 1).Select[/cpp]Mais il y a des cas où j'aimerais pouvoir utiliser des variables, des fonctions, des propriétés ou n'importe quoi d'autre dans une expression entre guillemets. Par exemple pour obtenir l'expression "=Feuil1!$A$1" (utilisée dans les graphiques) en remplaçant "Feuil1" par ma feuille courante et la lettre "A" par une variable, pour l'instant ma solution c'est d'écrire :
[cpp]"=" & ActiveSheet.Name & "!$" & Chr(64 + i) & "$1"[/cpp]Quelqu'un sait-il introduire une variable dans un texte ou bien comment simplifier l'écriture de ce dernier code ? Merci à vous.

Question subsidiaire :
- Range(Chr(65+i) & 1) ne nécessite pas de guillemets autour du 1.
- Range("A" & i) nécessite des guillemets autour du A.
Savez-vous pourquoi ?
 

zeb

Modérateur
Salut,

Soit V une variable de type texte. Mettons "A" dedans.
Code:
Dim V As String
V = "A"
Maintenant, il suffit de l'utiliser, cette variable :
Code:
"=" & ActiveSheet.Name & "!" & V & "1"
Je ne vois pas où est le problème concernant les variables :spamafote:

Code:
Range(Chr(65+i) & "1")
Ce code nécessite des guillemets autour du 1. Cependant, VB est capable de faire un transtypage implicite des entiers vers le texte. C'est pourquoi il te semble que ce ne soit pas nécessaire.

Code:
Range(A & i)
Si tu écris A sans guillemet, ce A n'étant ni un mot-clef du langage, ni une fonction, VB le considère par défaut comme une variable. Ce langage en effet ne nécessite pas qu'on déclare ses variables. Ainsi c'est la valeur de A qui va être concaténé à i. Or si c'est la première fois que la variable A est rencontrée, elle est initialisée à vide. Pour éviter ce comportement désagréable, et pourvu qu'on accepte de déclarer ses variables - ce qui est une bonne façon de faire, il suffit d'ajouter la ligne Option Explicit en début de module.

Plutôt que de créer des adresses de type texte, utilise la méthode Cells.
 

beru

Habitué
Lorsqu'il faut utiliser des variables dans nos range, je suis comme Zeb, je passe toujours par la méthode Cells

Par exemple :

Prenons une plage

Code:
Range(Cells(1, 1), Cells(4, 5))

si on a une variable i = 1, on peut écrire de manières différente notre sélection

Code:
Range(Cells(i, i), Cells(4, 5))

Et on peut même s'amuser à l'écrire ainsi :

Code:
Range(Cells(i, i), Cells(i+3, i+4))

Sinon, surpris que Zeb n'a pas fait de remarques sur tes "ActiveSheet" et ".select" ;-)
 

zeb

Modérateur
Ah il est parfois légitime de sélectionner une cellule ou une feuille, ou de considérer l'objet actif.

Je fulmine contre ceux qui sélectionnent un objet pour ensuite agir sur cette sélection ainsi faite, et non pas directement sur l'objet.

Antoine donne la méthode Select comme exemple. Grand bien lui fasse. J'espère simplement qu'il n'a pas l'intention d'utiliser l'objet Selection pour agir sur son Range. :o

:)
 

beru

Habitué
Ah sacré Zeb, démarre toujours au quart de tour lorsqu'on parle d'activesheet ou de select.

Un peu comme sur les forum parlant de firefox ... et qu'on lache le ... panda ou renard :)
 

antoine_16

Nouveau membre
Merci pour tes explications Zeb.
Ma formation vba réside dans le tuto du siteduzero et il n'y avait pas tous ces détails ! (même s'il est très bien)
Tu m'as même appris le mot "transtypage". Ca sonne bien ! J'essaierai de le ressortir dans la conversation ;).

Mais revenons à nos boutons !

En fait, dans ce cas particulier, j'ai une bonne raison de créer des adresses de type texte.

Lorsqu'on crée un graphique manuellement, les données sont liées.
Ainsi quand on modifie les données dans la feuille, le graphique est modifié en conséquence.

Mais lorsqu'on crée un graphique par macro, si on appelle une donnée de la feuille ainsi...
[cpp]SerieCollection(1).Name = Feuil1.Cells(1,1).Value
SerieCollection(1).Name = Feuil1.Cells(1,1)
SerieCollection(1).Name = Range(Feuil1.Cells(1,1), Feuil1.Cells(1,1))[/cpp]... la cellule ciblée n'est plus liée au graphique (le comble c'est que si on cible une plage de cellules la liaison fonctionne). Pour conserver la liaison, une solution est de reproduire l'écriture de l'adresse des données d'un graph, comme s'il avait été fait manuellement :
[cpp]SerieCollection(1).Name = "=Feuil1!$A$1"[/cpp]On peut enlever les "$" parce qu'ils seront remis automatiquement.

Voici donc au moins un cas dans lequel l'adresse de type texte est utile.

Mais peut-être y a-t-il dans chaque cas un moyen de s'en passer. Quelqu'un sait-il comment conserver les liaisons entre un graphique créé par macro et une cellule ciblée autrement qu'avec une adresse de type texte ?

Question subsidiaire :
Je n'ai pas trouvé comment éditer le titre d'un sujet, ni de FAQ pour me renseigner, ni dans les règlements.
Est-il possible d'éditer le titre du sujet ?

Merci !

PS : Ne t'inquiète pas Beru pour les ActiveSheet et les Select, c'est juste pour faire des exemples simples ;).
 

beru

Habitué
Salut antoine_16

Je suis surpris par ce que tu racontes. Ou alors, j'ai peut-être du mal comprendre.
Pour ma part, je crée pas mal de graphes via mes macros.
Il est vrai que je n'ai jamais testé de modifier le contenu des données du graphes une fois celui-ci fait.
Je me suis donc empressé de tester (sous Excel 2010, j'essayerai sous 2003 demain), et si je modifie les données du graphes après que celui-ci ai été créé avec ma macro, mon graphe s'ajuste automatiquement.
Et pas de secret pour générer mes courbes du graphes via ma macro je procède comme tu fais


En gros et en résumé voilà ce que j'ai (pour un simple graphe (X,Y))

Code:
Set XValues = Range (Cells(13, "C"), Cells(83, "C")
Set YValues = Range (Cells(13, "A"), Cells(83, "A")
   With Sheets("Graphes").ChartObjects(NameGraph).Chart.SeriesCollection.NewSeries
        .Values = YValues
        .Xvalues = XValues
        .Name = Pixel
   End With

'NameGraph et Pixel étant des variables de type string


Pour les activesheet et les .select t'inquiète ma remarque c'était juste pour faire mousser Zeb :)


 

antoine_16

Nouveau membre
Oui mais dans ton graphique, j'imagine que le nom de ta série n'est pas lié à la feuille de donnée, si tu l'as mis dans une variable string.
Pourtant il est possible de lier ce nom à une cellule comme je l'ai fait dans mon exemple, de telle façon qu'en modifiant le contenu de la cellule, le nom de la série dans le graphique soit aussi modifié.
 

beru

Habitué
Effectivement, chez moi, la seule chose qui n'est pas lié, c'est le nom. Du coup je peux pas tester si le nom change en le modifiant dans une cellule ... vu qu'elle n'existe pas :)

Donc, chez toi, si tu modifies le nom ... cela ne s'ajuste pas automatique (du moins en utilisant le code classique de programmation).

Mais si tu modifies des données ... le graphe s'ajuste-t-il automatiquement?
 

zeb

Modérateur
La propriété Name d'un objet Series accepte deux types de contenu. Soit du texte simple, et c'est ce qui se passe quand tu fais Name = "text", soit une formule, et c'est ce qui se passe quand tu fais Name = "=formule".

Je viens de regarder. Impossible de trouver où se cache la formule. :(
L'utilisation en lecture de la propriété Name renvoie toujours le résultat, et pas la formule :(
 

antoine_16

Nouveau membre
à beru
Oui, mon graphe s'ajuste automatiquement en modifiant les données.
Il n'y a que le nom pour lequel je suis obligé d'utiliser une adresse de type texte.

à zeb
Décidément, j'ai le chic pour vouloir faire des trucs infaisables.
Je n'ai plus qu'à reprogrammer excel à ma convenance :)

En tout cas merci à vous deux de vous intéresser à mon cas.

à tous

Question 1 : Connaissez-vous la formule qui peut être renseignée comme contenu de la propriété Name ?

Dans la plupart des cas, on peut se passer des adresses de type texte.
Mais on a toujours besoin d'expressions entre guillemets.
Dans ce cas, on doit écrire ce genre de ligne de code :
[cpp]"Texte " & ma_variable & " texte " & ma_fonction_qui_renvoie_du_texte & " texte."[/cpp]On peut simplifier l'expression en rajoutant des variables préalables :
[cpp]Dim Bla as string
Dim Bli as string

Bla = ma_variable_string
Bli = ma_fonction_qui_renvoie_du_texte

MsgBox "Texte " & Bla & " texte " & Bli & " texte."[/cpp] Mais perso je trouve que ça rallonge le code et ce n'est pas beaucoup mieux (sauf si on a une variable non string qu'on veut faire passer en string avant de l'utiliser).

J'espérais qu'il existe une solution du genre :
[cpp]MsgBox "Texte [ma_variable_string] texte [ma_fonction_qui_renvoie_du_texte] texte."[/cpp] Avec une notation qui permette de résoudre les variables et fonctions avant de les inclure dans le texte.
Mais apparemment ce genre de notation n'existe pas en vba. Question 2 : Quelqu'un en connaît une ?

Question 3 : Au fait savez-vous si on peut modifier le titre d'un sujet du forum et comment ?

Merci à tous pour vos infos !
 

zeb

Modérateur
Meilleure réponse
Salut,

Et non, le Basic - et donc le VB - obéit à la syntaxe "Texte " & Bla & " texte " & Bli & " texte.". Et les langages de programmation sont légion à obéir à ce type de syntaxe. Il faut vraiment aller chercher les interpréteurs UNIX pour trouver ce que tu évoques.

Pour modifier le titre d'un topic, il faut "editer" le tout premier message.
 

beru

Habitué
Maintenant et c'est un peut-être un peu moins catholique, une autre manière de procéder c'est de relancer automatiquement ta macro qui génère le graphe si le contenu de la cellule où se trouve le nom du graphe est modifié.
Du style sur une action "désactiver la cellule du worksheet" vérifier si le contenu est égale titre si oui, ne rien faire, sinon, effacer le graphe et le recréer.
 

antoine_16

Nouveau membre
Merci à vous deux pour vos réponses.nberu, dans mon cas précis je vais garder ma solution qui consiste à reconstituer l'adresse de type texte que requiert la propriété Name.nMais je garde ton idée sous le coude parce qu'il y a d'autres choses que j'aimerais voir se modifier automatiquement dans un graphique (genre les échelles).nMeilleure réponse sélectionnée par antoine_16.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 064
Membres
1 586 286
Dernier membre
petitangebleu1977
Partager cette page
Haut