Problème pour créer le code des ToggleButton par vba
14 réponses
Fabrice N.
Bonjour à tous,
Tout d'abord, merci à tous ceux qui contribuent à ce NG car c'est grâce à
eux que j'ai pu avancer dans mon problème.
Par contre, je suis bloqué et ne trouve pas les infos dont j'ai besoin (
sauf erreur de ma part )
Voici l'idée :
Je travail sous Excel 2003.
Je souhaite par macro pouvoir créer des TogglesButtons et ajouter le code
_click par macro dans la feuille concernée.
Au stade ou j'en suis, j'arrive à créer les boutons, mais Excel plante
complètement dès qu'il s'agit de créer le code dans la feuille.
Voici ce que j'ai fait :
J'ai créé les 2 fonctions suivantes qui fonctionne très bien utilisées
séparéments
*************************************************************************
Function CreerLeToggle(cellule As String)
Et c'est cette macro qui cloche. La création des toggle marche parfaitement,
mais dès la première exécution de la fonction AjoutCode, j'ai le beau
message "Excel a rencontré une erreur... blablabla..." et il se ferme.
Je n'ai même pas de message de déboguage.
Par contre, si manuellement, je lance la macro suivante, ça marche sans
problème alors que c'est le même code que j'essai d'ajouter.
***************************************************************
Sub CopierCode()
Dim CodeToggle As String
Dim Lig As Integer
Lig = 8
CodeToggle = "Private Sub ToggleH" & Lig & "_Click()" & vbCrLf & vbCrLf
_
& " If ToggleH" & Lig & " = False Then" & vbCrLf _
& " If ToggleI" & Lig & " = True Then Exit Sub" & vbCrLf _
& " ToggleI" & Lig & " = True" & vbCrLf _
& " Exit Sub" & vbCrLf _
& " End If" & vbCrLf _
& " If ToggleI" & Lig & " = True Then ToggleI" & Lig & " = False"
& vbCrLf _
& " Range(""I" & Lig & """) = 1" & vbCrLf & vbCrLf _
& "End Sub" & vbCrLf
Call AjoutCode(CodeToggle, ActiveSheet.Index)
End Sub
***************************************************************
J'ai exclu la possibilité que ce soit une trop grande quantité de code
puisque, déjà c'est pas le cas, et qu'en plus, la macro plante à la première
insertion de code...
J'ai essayé ma macro depuis un autre PC avec Excel 2003, même punition...
:o(
Je vous en prie, dites moi que quelqu'un sait quel connerie j'ai bien pu
faire dans ce foutu code ....
A moins que vous ayez un autre méthode que me permette par macro d'insérer
du code dans le module d'une feuille...
| - Je reste étonné que l'on ne puisse 'boucler' sur ce genre de création. | Mais je n'ai ni le temps, ni l'envie de vérifier.
J'ai posé la question sur le forum anglais, et je n'ai reçu aucun commentaire ! Je suppose que les questions trop faciles n'intéressent pas personne !!! Dommage que toi aussi n'ayez point envie de tenter le coup.... ;-)
C'est bien parce que c'est toi :o)
J'ai essayé ce qui suit : Sub test() lafeuille = "feuil1" Code = "toto" & vbCrLf For a = 0 To 2 With ThisWorkbook.VBProject.VBComponents(worksheets(lafeuille).CodeName).CodeModule .AddFromString Code End With Next a End Sub ---> Plantage sur la ligne ThisWorkbook.(etc) que ce soit avec worksheets(...) ou sheets(...)
Par contre, en mettant le nom de feuille directement dans le code, ca semble aller : Sub test() Code = "toto" & vbCrLf For a = 0 To 2 With ThisWorkbook.VBProject.VBComponents(Sheets("Feuil1").CodeName).CodeModule .AddFromString Code End With Next a End Sub
Pour savoir si c'est du à la boucle, il suffit de sortir la ligne et de virer la boucle : Sub test() LaFeuille = "feuil1" Code = "toto" & vbCrLf with Set sht = ThisWorkbook.VBProject.VBComponents(Sheets(LaFeuille).CodeName).CodeModule .AddFromString Code End With End Sub même plantage. C'est donc la ligne et pas la boucle qui coince (et plus particulièrement le passage du nom de feuille comme variable).
C'était mes 0,02 :o)
@+ FxM
| - Je reste étonné que l'on ne puisse 'boucler' sur ce genre de création.
| Mais je n'ai ni le temps, ni l'envie de vérifier.
J'ai posé la question sur le forum anglais, et je n'ai reçu aucun commentaire !
Je suppose que les questions trop faciles n'intéressent pas personne !!!
Dommage que toi aussi n'ayez point envie de tenter le coup....
;-)
C'est bien parce que c'est toi :o)
J'ai essayé ce qui suit :
Sub test()
lafeuille = "feuil1"
Code = "toto" & vbCrLf
For a = 0 To 2
With
ThisWorkbook.VBProject.VBComponents(worksheets(lafeuille).CodeName).CodeModule
.AddFromString Code
End With
Next a
End Sub
---> Plantage sur la ligne ThisWorkbook.(etc) que ce soit avec
worksheets(...) ou sheets(...)
Par contre, en mettant le nom de feuille directement dans le code, ca
semble aller :
Sub test()
Code = "toto" & vbCrLf
For a = 0 To 2
With
ThisWorkbook.VBProject.VBComponents(Sheets("Feuil1").CodeName).CodeModule
.AddFromString Code
End With
Next a
End Sub
Pour savoir si c'est du à la boucle, il suffit de sortir la ligne et de
virer la boucle :
Sub test()
LaFeuille = "feuil1"
Code = "toto" & vbCrLf
with Set sht =
ThisWorkbook.VBProject.VBComponents(Sheets(LaFeuille).CodeName).CodeModule
.AddFromString Code
End With
End Sub
même plantage. C'est donc la ligne et pas la boucle qui coince (et plus
particulièrement le passage du nom de feuille comme variable).
| - Je reste étonné que l'on ne puisse 'boucler' sur ce genre de création. | Mais je n'ai ni le temps, ni l'envie de vérifier.
J'ai posé la question sur le forum anglais, et je n'ai reçu aucun commentaire ! Je suppose que les questions trop faciles n'intéressent pas personne !!! Dommage que toi aussi n'ayez point envie de tenter le coup.... ;-)
C'est bien parce que c'est toi :o)
J'ai essayé ce qui suit : Sub test() lafeuille = "feuil1" Code = "toto" & vbCrLf For a = 0 To 2 With ThisWorkbook.VBProject.VBComponents(worksheets(lafeuille).CodeName).CodeModule .AddFromString Code End With Next a End Sub ---> Plantage sur la ligne ThisWorkbook.(etc) que ce soit avec worksheets(...) ou sheets(...)
Par contre, en mettant le nom de feuille directement dans le code, ca semble aller : Sub test() Code = "toto" & vbCrLf For a = 0 To 2 With ThisWorkbook.VBProject.VBComponents(Sheets("Feuil1").CodeName).CodeModule .AddFromString Code End With Next a End Sub
Pour savoir si c'est du à la boucle, il suffit de sortir la ligne et de virer la boucle : Sub test() LaFeuille = "feuil1" Code = "toto" & vbCrLf with Set sht = ThisWorkbook.VBProject.VBComponents(Sheets(LaFeuille).CodeName).CodeModule .AddFromString Code End With End Sub même plantage. C'est donc la ligne et pas la boucle qui coince (et plus particulièrement le passage du nom de feuille comme variable).
C'était mes 0,02 :o)
@+ FxM
FxM
with Set sht N'importe quoi, le François !
Lire : With thisworkbook.blabla.machin.truc :o)
@+ FxM
| - Je reste étonné que l'on ne puisse 'boucler' sur ce genre de création. | Mais je n'ai ni le temps, ni l'envie de vérifier.
J'ai posé la question sur le forum anglais, et je n'ai reçu aucun commentaire ! Je suppose que les questions trop faciles n'intéressent pas personne !!! Dommage que toi aussi n'ayez point envie de tenter le coup.... ;-)
C'est bien parce que c'est toi :o)
J'ai essayé ce qui suit : Sub test() lafeuille = "feuil1" Code = "toto" & vbCrLf For a = 0 To 2 With ThisWorkbook.VBProject.VBComponents(worksheets(lafeuille).CodeName).CodeModule
.AddFromString Code End With Next a End Sub ---> Plantage sur la ligne ThisWorkbook.(etc) que ce soit avec worksheets(...) ou sheets(...)
Par contre, en mettant le nom de feuille directement dans le code, ca semble aller : Sub test() Code = "toto" & vbCrLf For a = 0 To 2 With ThisWorkbook.VBProject.VBComponents(Sheets("Feuil1").CodeName).CodeModule .AddFromString Code End With Next a End Sub
Pour savoir si c'est du à la boucle, il suffit de sortir la ligne et de virer la boucle : Sub test() LaFeuille = "feuil1" Code = "toto" & vbCrLf with Set sht = ThisWorkbook.VBProject.VBComponents(Sheets(LaFeuille).CodeName).CodeModule .AddFromString Code End With End Sub même plantage. C'est donc la ligne et pas la boucle qui coince (et plus particulièrement le passage du nom de feuille comme variable).
C'était mes 0,02 :o)
@+ FxM
with Set sht N'importe quoi, le François !
Lire : With thisworkbook.blabla.machin.truc :o)
@+
FxM
| - Je reste étonné que l'on ne puisse 'boucler' sur ce genre de
création.
| Mais je n'ai ni le temps, ni l'envie de vérifier.
J'ai posé la question sur le forum anglais, et je n'ai reçu aucun
commentaire !
Je suppose que les questions trop faciles n'intéressent pas personne !!!
Dommage que toi aussi n'ayez point envie de tenter le coup....
;-)
C'est bien parce que c'est toi :o)
J'ai essayé ce qui suit :
Sub test()
lafeuille = "feuil1"
Code = "toto" & vbCrLf
For a = 0 To 2
With
ThisWorkbook.VBProject.VBComponents(worksheets(lafeuille).CodeName).CodeModule
.AddFromString Code
End With
Next a
End Sub
---> Plantage sur la ligne ThisWorkbook.(etc) que ce soit avec
worksheets(...) ou sheets(...)
Par contre, en mettant le nom de feuille directement dans le code, ca
semble aller :
Sub test()
Code = "toto" & vbCrLf
For a = 0 To 2
With
ThisWorkbook.VBProject.VBComponents(Sheets("Feuil1").CodeName).CodeModule
.AddFromString Code
End With
Next a
End Sub
Pour savoir si c'est du à la boucle, il suffit de sortir la ligne et de
virer la boucle :
Sub test()
LaFeuille = "feuil1"
Code = "toto" & vbCrLf
with Set sht =
ThisWorkbook.VBProject.VBComponents(Sheets(LaFeuille).CodeName).CodeModule
.AddFromString Code
End With
End Sub
même plantage. C'est donc la ligne et pas la boucle qui coince (et plus
particulièrement le passage du nom de feuille comme variable).
| - Je reste étonné que l'on ne puisse 'boucler' sur ce genre de création. | Mais je n'ai ni le temps, ni l'envie de vérifier.
J'ai posé la question sur le forum anglais, et je n'ai reçu aucun commentaire ! Je suppose que les questions trop faciles n'intéressent pas personne !!! Dommage que toi aussi n'ayez point envie de tenter le coup.... ;-)
C'est bien parce que c'est toi :o)
J'ai essayé ce qui suit : Sub test() lafeuille = "feuil1" Code = "toto" & vbCrLf For a = 0 To 2 With ThisWorkbook.VBProject.VBComponents(worksheets(lafeuille).CodeName).CodeModule
.AddFromString Code End With Next a End Sub ---> Plantage sur la ligne ThisWorkbook.(etc) que ce soit avec worksheets(...) ou sheets(...)
Par contre, en mettant le nom de feuille directement dans le code, ca semble aller : Sub test() Code = "toto" & vbCrLf For a = 0 To 2 With ThisWorkbook.VBProject.VBComponents(Sheets("Feuil1").CodeName).CodeModule .AddFromString Code End With Next a End Sub
Pour savoir si c'est du à la boucle, il suffit de sortir la ligne et de virer la boucle : Sub test() LaFeuille = "feuil1" Code = "toto" & vbCrLf with Set sht = ThisWorkbook.VBProject.VBComponents(Sheets(LaFeuille).CodeName).CodeModule .AddFromString Code End With End Sub même plantage. C'est donc la ligne et pas la boucle qui coince (et plus particulièrement le passage du nom de feuille comme variable).
C'était mes 0,02 :o)
@+ FxM
MichDenis
Bonjour François,
| with Set sht Si tu connais des trucs non publiés par les grands de ce monde, tu pourras certainement soulutionner ce qui suit...;-)
Voici le fameux fichier : http://cjoint.com/?bqpd1TtLCf
Dans le module 1 de ce fichier, sous la procédure : CreerToggleButton on y retrouve 2 lignes de code qui génèrent le code associé au bouton, la premère pour les boutons de la colonne H et la deuxième pour les boutons de la colonne I. Mon observation est à l'effet que je n'ai jamais réussi à faire enchaîné les 2 procédures, '------------------------ AjouterLeCodeH 7, 20 AjouterLeCodeI 7, 20 '------------------------ Excel se plante à l'exécution de la deuxième procédure lorsque vient le temps d'ajouter le code même en mettant en dur le nom de la feuille dans la ligne de code : '------------------------ With ThisWorkbook.VBProject.VBComponents("Feuil1").CodeModule .AddFromString Code End With '------------------------
La solutions que j'ai trouvée se retrouve dans le fichier que j'ai publié sur ce fil dans un message précédent. http://cjoint.com/?bpq5US66EI
Voilà ! Si tu as une explication, elle est bienvenue.
Salutations.
Bonjour François,
| with Set sht
Si tu connais des trucs non publiés par les grands de ce monde,
tu pourras certainement soulutionner ce qui suit...;-)
Voici le fameux fichier : http://cjoint.com/?bqpd1TtLCf
Dans le module 1 de ce fichier, sous la procédure : CreerToggleButton
on y retrouve 2 lignes de code qui génèrent le code associé au
bouton, la premère pour les boutons de la colonne H et la deuxième
pour les boutons de la colonne I. Mon observation est à l'effet que je
n'ai jamais réussi à faire enchaîné les 2 procédures,
'------------------------
AjouterLeCodeH 7, 20
AjouterLeCodeI 7, 20
'------------------------
Excel se plante à l'exécution de la deuxième procédure lorsque vient le temps d'ajouter
le code même en mettant en dur le nom de la feuille dans la ligne de code :
'------------------------
With ThisWorkbook.VBProject.VBComponents("Feuil1").CodeModule
.AddFromString Code
End With
'------------------------
La solutions que j'ai trouvée se retrouve dans le fichier que j'ai publié sur ce fil
dans un message précédent. http://cjoint.com/?bpq5US66EI
Voilà ! Si tu as une explication, elle est bienvenue.
| with Set sht Si tu connais des trucs non publiés par les grands de ce monde, tu pourras certainement soulutionner ce qui suit...;-)
Voici le fameux fichier : http://cjoint.com/?bqpd1TtLCf
Dans le module 1 de ce fichier, sous la procédure : CreerToggleButton on y retrouve 2 lignes de code qui génèrent le code associé au bouton, la premère pour les boutons de la colonne H et la deuxième pour les boutons de la colonne I. Mon observation est à l'effet que je n'ai jamais réussi à faire enchaîné les 2 procédures, '------------------------ AjouterLeCodeH 7, 20 AjouterLeCodeI 7, 20 '------------------------ Excel se plante à l'exécution de la deuxième procédure lorsque vient le temps d'ajouter le code même en mettant en dur le nom de la feuille dans la ligne de code : '------------------------ With ThisWorkbook.VBProject.VBComponents("Feuil1").CodeModule .AddFromString Code End With '------------------------
La solutions que j'ai trouvée se retrouve dans le fichier que j'ai publié sur ce fil dans un message précédent. http://cjoint.com/?bpq5US66EI
Voilà ! Si tu as une explication, elle est bienvenue.
Salutations.
Fabrice N.
Bonjour à tous,
Comme promis et avec un peu de retard ( désolé ! ), je reviens avec des nouvelles.
MichDenis, merci pour ton code, tu m'excuseras, mais je te l'ai piqué pour mon fichier final car il est plus joli que le mien... ;o)
Concernant les testes, tes macros marche bien, temps que je ne fait ça que sur une feuille.
Malheureusement, au final, le but de ma macro est de faire la même chose sur toute les feuilles existantes dans le fichier. Et là, de nouveau, ça plante.
FxM, tu as raison, j'avais eu des soucis en passant le codename en paramètre dans l'ajout du code. A force de bricoler, j'avais réussi à ce que ça fonctionne en récupéreant l'index dnas le code name et en ayant une instruction de cette forme. ThisWorkbook.VBProject.VBComponents("Feuil" & IdxFeuille).CodeModule
Mais malheureusement, je n'arrive pas à aller jusqu'au bout de ma macro sans que ça plante. Au début, je pensait que c'était le fait de faire plusieurs ajout de suite dans la même feuille . Mais en m'aidant du code de MichDenis, j'ai fait en sorte d'appeler la fonction d'ajout du code qu'une fois par feuille. Mais lorsqu'il y a une boucle pour faire toute les feuilles, ça plante.
C'est comme si il y avait un problème sur des exécutions successives de cette instruction ThisWorkbook.VBProject.VBComponents("Feuil" & IdxFeuille).CodeModule. N'est-il pas possible que la page de code reste ouverte à chaque fois et ne soit déchargée qu'à la fermeture du fichier ? ça créerait une saturation en ouvrant trop de page de code en même temps ?
Je pensais que le "Obj = nothing" suffirait à les fermer, mais visiblement, ce n'est pas le cas.
"Fabrice N." <"f.nebbia" dans le domaine "technicn.com"> a écrit dans le message de news: %
Bonjour à tous,
désolé pour le retard.
Merci MichDenis d'avoir pris le temps de revoir mon code. et Merci à FxM et Modeste d'avoir pris le temps d'ajouter quelques lignes et pour les liens...
Je vais tester tout ça et ne manquerai pas de vous donner les résultat...
A+
"MichDenis" a écrit dans le message de news: %
Voici le code de ton fichier réorganisé.
Et ton code fonctionne : http://cjoint.com/?bpq5US66EI
P.S. à l'intérieur d'une même procédure, on ne peut pas exécuter 2 fois cette ligne de code en utilisant une boucle. Ton code a été réorganisé en tenant compte de ce qui précède.
'-------------------------- With ThisWorkbook.VBProject.VBComponents(Worksheets(LaFeuille).CodeName).CodeModule .AddFromString Code End With '--------------------------
Je laisse à FxM et à Modeste le soin de nous expliquer le pourquoi
Bonjour à tous,
Comme promis et avec un peu de retard ( désolé ! ), je reviens avec des
nouvelles.
MichDenis, merci pour ton code, tu m'excuseras, mais je te l'ai piqué pour
mon fichier final car il est plus joli que le mien... ;o)
Concernant les testes, tes macros marche bien, temps que je ne fait ça que
sur une feuille.
Malheureusement, au final, le but de ma macro est de faire la même chose sur
toute les feuilles existantes dans le fichier.
Et là, de nouveau, ça plante.
FxM, tu as raison, j'avais eu des soucis en passant le codename en paramètre
dans l'ajout du code.
A force de bricoler, j'avais réussi à ce que ça fonctionne en récupéreant
l'index dnas le code name et en ayant une instruction de cette forme.
ThisWorkbook.VBProject.VBComponents("Feuil" & IdxFeuille).CodeModule
Mais malheureusement, je n'arrive pas à aller jusqu'au bout de ma macro sans
que ça plante.
Au début, je pensait que c'était le fait de faire plusieurs ajout de suite
dans la même feuille .
Mais en m'aidant du code de MichDenis, j'ai fait en sorte d'appeler la
fonction d'ajout du code qu'une fois par feuille.
Mais lorsqu'il y a une boucle pour faire toute les feuilles, ça plante.
C'est comme si il y avait un problème sur des exécutions successives de
cette instruction ThisWorkbook.VBProject.VBComponents("Feuil" &
IdxFeuille).CodeModule.
N'est-il pas possible que la page de code reste ouverte à chaque fois et ne
soit déchargée qu'à la fermeture du fichier ?
ça créerait une saturation en ouvrant trop de page de code en même temps ?
Je pensais que le "Obj = nothing" suffirait à les fermer, mais visiblement,
ce n'est pas le cas.
"Fabrice N." <"f.nebbia" dans le domaine "technicn.com"> a écrit dans le
message de news: %23rafSdUOHHA.4376@TK2MSFTNGP02.phx.gbl...
Bonjour à tous,
désolé pour le retard.
Merci MichDenis d'avoir pris le temps de revoir mon code. et Merci à FxM
et Modeste d'avoir pris le temps d'ajouter quelques lignes et pour les
liens...
Je vais tester tout ça et ne manquerai pas de vous donner les résultat...
A+
"MichDenis" <michdenis@hotmail.com> a écrit dans le message de news:
%23W8V85LOHHA.960@TK2MSFTNGP04.phx.gbl...
Voici le code de ton fichier réorganisé.
Et ton code fonctionne : http://cjoint.com/?bpq5US66EI
P.S. à l'intérieur d'une même procédure, on ne peut pas exécuter
2 fois cette ligne de code en utilisant une boucle. Ton code a été
réorganisé en tenant compte de ce qui précède.
'--------------------------
With
ThisWorkbook.VBProject.VBComponents(Worksheets(LaFeuille).CodeName).CodeModule
.AddFromString Code
End With
'--------------------------
Je laisse à FxM et à Modeste le soin de nous expliquer le pourquoi
Comme promis et avec un peu de retard ( désolé ! ), je reviens avec des nouvelles.
MichDenis, merci pour ton code, tu m'excuseras, mais je te l'ai piqué pour mon fichier final car il est plus joli que le mien... ;o)
Concernant les testes, tes macros marche bien, temps que je ne fait ça que sur une feuille.
Malheureusement, au final, le but de ma macro est de faire la même chose sur toute les feuilles existantes dans le fichier. Et là, de nouveau, ça plante.
FxM, tu as raison, j'avais eu des soucis en passant le codename en paramètre dans l'ajout du code. A force de bricoler, j'avais réussi à ce que ça fonctionne en récupéreant l'index dnas le code name et en ayant une instruction de cette forme. ThisWorkbook.VBProject.VBComponents("Feuil" & IdxFeuille).CodeModule
Mais malheureusement, je n'arrive pas à aller jusqu'au bout de ma macro sans que ça plante. Au début, je pensait que c'était le fait de faire plusieurs ajout de suite dans la même feuille . Mais en m'aidant du code de MichDenis, j'ai fait en sorte d'appeler la fonction d'ajout du code qu'une fois par feuille. Mais lorsqu'il y a une boucle pour faire toute les feuilles, ça plante.
C'est comme si il y avait un problème sur des exécutions successives de cette instruction ThisWorkbook.VBProject.VBComponents("Feuil" & IdxFeuille).CodeModule. N'est-il pas possible que la page de code reste ouverte à chaque fois et ne soit déchargée qu'à la fermeture du fichier ? ça créerait une saturation en ouvrant trop de page de code en même temps ?
Je pensais que le "Obj = nothing" suffirait à les fermer, mais visiblement, ce n'est pas le cas.
"Fabrice N." <"f.nebbia" dans le domaine "technicn.com"> a écrit dans le message de news: %
Bonjour à tous,
désolé pour le retard.
Merci MichDenis d'avoir pris le temps de revoir mon code. et Merci à FxM et Modeste d'avoir pris le temps d'ajouter quelques lignes et pour les liens...
Je vais tester tout ça et ne manquerai pas de vous donner les résultat...
A+
"MichDenis" a écrit dans le message de news: %
Voici le code de ton fichier réorganisé.
Et ton code fonctionne : http://cjoint.com/?bpq5US66EI
P.S. à l'intérieur d'une même procédure, on ne peut pas exécuter 2 fois cette ligne de code en utilisant une boucle. Ton code a été réorganisé en tenant compte de ce qui précède.
'-------------------------- With ThisWorkbook.VBProject.VBComponents(Worksheets(LaFeuille).CodeName).CodeModule .AddFromString Code End With '--------------------------
Je laisse à FxM et à Modeste le soin de nous expliquer le pourquoi