Ecriture d'une formule qui va chercher un onglet X - VB/VBA/VBS - Programmation
Marsh Posté le 25-01-2009 à 23:39:52
essaie avec si au lieu de if (suivant les versions de excel) et avec des ";" au lieu des " ' "
ex d'un contenu de cell sous excel2007 : =SI(N8+stats!H28=1;1;2)
stats etant une feuille
Marsh Posté le 26-01-2009 à 09:41:01
En fait j'utilise Excel 2003, ça ne fonctionne pas avec si...Il doit forcément y avoir un moyen d'intégrer dans une formule une valeur se référant au nom d'un onglet...
Je continue de chercher...
Marsh Posté le 27-01-2009 à 08:19:43
Bonjour,
Et oui, on est souvant confronté au problème que les utilisateurs change le nom des onglets. Et là plus rien ne fonctionne.
La solution est de ne pas utiliser le nom apparent de l'onglet.
Comment faire :
Dans l'éditeur visual basic, on voit les forms, les modules et aussi les feuilles exel
Si tu cliques sur une feuille et tu fais F4
Dans la boite de dialogue tu vois 2 fois name ( avec et sans parenthèse) qui ont comme valeur "Feuil1"
l'élément Name est le nom qui apparaît dans l'onglet et c'est celui qui est utlisé dans sheets("feuil1" ).select.
L'élément (Name) est en fait le code name que tu peux changer. Pour exemple met ma_feuille.
Maintenant en vbA on peut écrire ma_feuille.select
Par ce système les macros sont indépendantes du nom apparent des onglets.
Voir la fonction Codename de vba
Marsh Posté le 27-01-2009 à 10:07:50
Merci mais je ne comprend pas bien ce que tu veux dire.
Aurais-tu un exemple à proposer car de mon côté, dans la formule dès que je met autre chose que le nom exact de l'onglet concerné, la macro ne trouve pas l'onglet et ne veux pas aller chercher, ce qui parait normal, mais dans toutes les macro que j'ai faites jusqu'à présent, il était toujours possible de renommer une feuille, un cellule, un valeur dans une cellule, etc... pour s'en servir dans la suite de la macro. Mais apparement ça ne fonctionne pas dans les formules...
Marsh Posté le 27-01-2009 à 13:46:22
Re
suivant ce code :
Sub toto() |
ta feuille qui se nommait "Feuil" de vient "ABCD"
si tu lance une seconde fois cette macro, tu auras un message d'erreur comme quoi la feuil1 n'existe pas
Sous editeur VBA
selection feuil1 et la fouche F4
La première ligne tu as (Name) Feuil1
Change Feuil1 en ma_feuille
et ecrit le code suivant
Sub toto() |
exécute à nouveau ta macro,
change manuellement le nom
exécute à nouveau ta macro
Plus aucun problème
Marsh Posté le 28-01-2009 à 01:58:21
Re
En fait j'aimerai ne pas avoir à changer manuellement le nom de la feuille.
Pour tout expliquer, dans la macro j'ai une imput box qui me demande le nom d'un onglet à créer (qui peut donc varier à chaque fois que je lance la macro). La valeur rentrée dans cette box est appelée "ABCD" ainsi je n'ai pas à reporter dans ma macro le nom exact de l'onglet puisqu'il aura toujours la meme valeur (ABCD) a chaque lancement de macro.
Vient ensuite la formule cité ci-dessus qui fait référence à l'onglet qui vient d'être créé qui s'apelle par exemple "Bonjour" mais qui a toujours comme valeur "ABCD". C'est là que je bloque sur la façon de faire comprendre à ma formule qu'il doit chercher ABCD, non pas la feuille qui se nomme ABCD mais l'onglet qui fait référence, c'est à dire "Bonjour".
Je ne sais pas si je suis clair ! Mais je ne suis pas sur que la réponse précédente corresponde à ce que je cherche à faire...
Marsh Posté le 28-01-2009 à 08:36:21
Bonjour,
Je commence a comprendre
si tu écrits :
Activecell.FormulaR1C1 = "=IF(R3C10=RC[-1],'" & ABCD & "'!R[25]C[12]=5,0)"
Marsh Posté le 28-01-2009 à 17:10:26
Bonjour, oui c'est exactement ça. Je cherche la syntaxe pour ma formule.
J'ai essayé avec ta formule mais ça ne marche pas. J'ai essayé toutes les combinaisons avec les ' les " et les & mais ça ne marche pas...
Je suis sur que c'est possible !
Marsh Posté le 30-01-2009 à 10:38:41
Bonjour
Ca fonctionne ce que te dit pyrof.
Sauf, que ta formule est bizare... Tu veux a partir d'une formule excel donner la valeur 5 à une cellule... Ca, ca ne fait pas avec des formules.*
C'est comme si tu ecrivais dans une cellule : =Si(A1=5;A2=12;0)
Tu ne peux pas avec des formules dire que A2=12
De plus tu te positionnes sur A1 et tu testes sur RC[-1] il n'y a pas de cellule avant A1... Enfin si, IV1... Mais je ne pense pas que tu veuilles tester sur la 255ème colonne de ta feuille... si ?
Ex : si tu te mets en C1, RC[-1] te donnerais B1. Si tu te mets en B1, RC[-1] te donnerais A1. Donc la tu te positionnes en A1 (avec ton Range("A1" ).Select ) et tu veux avec RC[-1] la colonne avant A1.
Je pense qu'il vaudrait mieux que tu nous expliques ce que tu souhaites faire, avec des mots. On pourra t'aider, la tu as des tests illogiques, et de references illogiques.
Marsh Posté le 30-01-2009 à 13:38:19
Pour A1 c t juste un exemple et la formule est un exemple aussi. C'était pour simplifier ce que j'ai réellement dans ma macro.
Je ne sais pas comment être plus clair dans mes explications...Je ne peux pas non plus vous mettre ma macro qui est super longue.
Ca ne me semblait pourtant pas compliqué à faire étant donné qu'avec les macro et avec Excel tout est possible ou presque !!
En gros voici les étapes pour résumer :
1. Je demande avec une Imput box à la personne qui va utiliser excel et qui va appliquer la macro d'entrer un nom
2. Ce nom est réutilisé de façon identique renommer un nouvel onglet créé
3. Pour ce faire je suis obligé de donner une valeur au nom donné par la personne et donc à l'onglet qui va être créé :
Dim Grille As String
Grille = Application.InputBox(prompt:="Entrez le nom de la grille (31 caractères max)", Type:=2)
Sheets.Add
ActiveSheet.Name = Grille
3. Je fais tout un tas de manip sur cet onglet et sur l'onglet de départ
4. Ensuite sur le nouvel onglet je rentre une formule dans une cellule (la formule citée plus haut)
5. Cette formule va chercher une valeur dans l'onglet X qui a été créé et qui s'apelle dans ma macro "GRILLE"
Sauf que la formule demande à ce que le nom réel de l'onglet soit écris et non pas le nom "GRILLE". Et pourtant je ne peux pas faire autrement puisque je ne connais pas au moment ou je créé la macro le nom que va prendre l'onglet...je sais pas si vous me suivez.
Bref je cherche donc une façon d'intégrer ce nom d'onglet dans ma formule.
J'ai pensé également à recopier dans une cellule le nom de l'onglet puis que la formule se réfère à la valeur de la cellule pour chopper le bon onglet mais ça revient au meme ça ne fonctionne pas...
Voilà
Marsh Posté le 30-01-2009 à 14:27:08
Bah ce que t'a mis pyrof marche tres bien...
Activecell.FormulaR1C1 = "=IF(R3C10=RC[-1],'" & ABCD & "'!R[25]C[12]=5,0)"
Je me repete peut etre, mais cette formule ne peut pas marche dans excel, justement a cause du ABCD & "'!R[25]C[12]=5 car tu ne peux pas donner une valeur a une cellule par le biais d'une formule.
Si maintenant je garde ton exemple, essaie avec ca :
Code :
|
Si tu tapes 15 dans A1 de ta nouvelle feuille qui est créée (moi en l'occurence je l'ai appelé Toto), tu verras que dans A1 de Feuil1 il y a bien 15. Car je me retrouve avec ca en A1 de la Feuil1 : =Toto!$A$1
Donne nous plutot la vrai formule que tu veux utiliser plutot qu'un exemple qui ne peut pas marcher pour plusieurs raisons...
Marsh Posté le 31-01-2009 à 16:59:39
Ok je commence à comprendre. Voici donc ma formule :
ActiveCell.FormulaR1C1 = "=IF(R3C10=RC[-1],INDEX('Grille'!R[-29]C[-27]:R[-13]C[1],MATCH(R5C4,'Grille'!R[-29]C[-28]:R[-13]C[-28],0),MATCH(R6C4,'Grille'!R[-30]C[-27]:R[-30]C[1],0)),R[20]C[-2])"
Une formule qui va chercher dans une valeur dans un tableau à double entrée(formule index, equiv).
J'ai donc modifié ma formule suite à l'exemple de dje69r et ça marche ! C'était donc bien un pb de syntaxe ! il fallait gérer entre les guillemets, les apostrophes et les &.
Merci à vous tous !
Pour info la formule modifiée : ActiveCell.FormulaR1C1 = "=IF(R3C10=RC[-1],INDEX(' " & Grille & " '!R[-29]C[-27]:R[-13]C[1],MATCH(R5C4,' " & Grille &" '!R[-29]C[-28]:R[-13]C[-28],0),MATCH(R6C4,' " & Grille & " '!R[-30]C[-27]:R[-30]C[1],0)),R[20]C[-2])"
A bientôt !
Marsh Posté le 25-01-2009 à 18:31:29
Bonjour,
Bon le titre n'est pas très explicite. En fait, je cherche tout simplement à rapatrier dans la formule suivante un nom d'onglet qui a été renommé précédemment :
Exemple : Nom de l'onglet (ou de la feuille) = Feuil4
Sheets("Feuil4" ).Name = ABCD 'je donne donc une valeur à mon anglet car le nom de la feuille peut changer
Sheets("Feuil1" ).Select
Range("A1" ).Select
Activecell.FormulaR1C1 = "=IF(R3C10=RC[-1],'ABCD'!R[25]C[12]=5,0)"
Sauf que ça ne fonctionne pas, il cherche une feuille qui s'appelle ABCD au lieu d'aller chercher la "feuil4"...J'ai essayé avec et sans les apostrophes, mais ça ne change rien...
Quelqu'un à une idée ?
Merci d'avance.