Construire feuille

3 réponses
Avatar
Joël André
Bonjour,

En cliquant sur un bouton, la construction d'une page est lancée par la
procédure ci-dessous.
La construction se passe bien jusqu'à la partie devant écrire le code sur le
module code de la feuille, "With ThisWorkBook.VBProject...etc".
Aprés quelques secondes d'attentes, erreur critique et tout se ferme.
Essai d'une autre forme "Application.VBE.ActiveVBProject...etc", même
punition.

Où me suis-je planté?
Merci pour votre temps.
Joël


Option Explicit
Public NouvelleAnnée, AfficheQuestion, NomBouton, Compteur, LigneSuivante,
Code
...
...
Sub ConstruitFeuille()
Worksheets.Add after:=Sheets("Accueil")
Sheets("Model 11").Visible = True
Sheets("Model 11").Select
Cells.Select
Selection.Copy
Sheets("Feuil1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Range("A1").Select
Sheets("Model 11").Visible = False
Sheets("Feuil1").Range("B2") = NouvelleAnnée

'Dans la fenêtre de l'éditeur de code, barre des menus / outils /
références,
'cocher : "Microsoft visual basic for applications extensibility 5.3"
' Ici, construction du bouton retour et du code correspondant
With Sheets("Feuil1") ' à voir si plus simple
With .OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, _
DisplayAsIcon:=False, Left:=0, Top:=0.75, Width:=48.75, Height:=19.5)
.Placement = xlFreeFloating
.PrintObject = False
.Name = "Retour_Click"
With .Object
.Caption = "Retour"
.Font.Name = "arial"
.Font.Bold = True
.Font.Size = 8
End With
End With
End With
Code = " " & vbCrLf
Code = Code & " Private Sub Retour_Click()" & vbCrLf
Code = Code & " Range(""A3"").Select" & vbCrLf
Code = Code & " Range(""A1"").Select" & vbCrLf
Code = Code & " ActiveWindow.SelectedSheets.Visible = False" &
vbCrLf
Code = Code & " Sheets(""Accueil"").Select" & vbCrLf
Code = Code & " End Sub" & vbCrLf

' Ici, le code est écrit dans le module de la feuille du bouton

'With ThisWorkbook.VBProject.VBComponents("Feuil1").CodeModule
'LigneSuivante = .CountOfLines + 1
'.InsertLines LigneSuivante, Code
'End With

Application.VBE.ActiveVBProject.VBComponents("Feuil1").CodeModule.AddFromString
(Code)

Sheets("Feuil1").Name = NouvelleAnnée
ActiveSheet.Visible = False
Application.ScreenUpdating = True
End Sub

3 réponses

Avatar
MichD
Bonjour,

Dans cette section du code :
'--------------------------------------------------------
Code = Code & "Private Sub Retour_Click()" & vbCrLf
Code = Code & "Range(""A3"").Select" & vbCrLf
Code = Code & "Range(""A1"").Select" & vbCrLf
Code = Code & "ActiveWindow.SelectedSheets.Visible = False" & vbCrLf
Code = Code & "Sheets(""Accueil"").Select" & vbCrLf
Code = Code & "End Sub" & vbCrLf

ThisWorkbook.VBProject.VBComponents("Feuil1").CodeModule.AddFromString Code
'--------------------------------------------------------

Sur la dernière ligne de code, "Feuil1" n'est pas le nom de l'onglet de la feuille, mais
la propriété Name de l'objet feuille visible seulement dans la fenêtre de l'éditeur de code.

Dans la petite fenêtre de gauche "Projet-VBAProject, sélectionne d'abord le nom du
projet vba : VBAProjet(NomDeTonclasseur.xls) . En cliquant sur le plus devant l'appellation,
tu vas afficher les objets du projet. Pour ce qui est des feuilles, elles sont listées de cette
manière :
Feuil1(toto)
Feuil2(Bozo)
Feuil3(cadeau)

La première partie : Feuil1 , Feuil2, Feuil3, représente la propriété Name de chacune des feuilles
La deuxième partie toto, bozo, cadeau, représente le nom des onglets de la feuille.

Dans la ligne de code suivante, c'est la propriété de la feuille que tu dois insérer et non le nom
de l'onglet de la feuille.
ThisWorkbook.VBProject.VBComponents("Feuil1").CodeModule.AddFromString Code

Une autre façon de faire (d'écrire la ligne de code)
'------------------------------
With ThisWorkbook
With .VBProject.VBComponents(.Worksheets("toto").CodeName)
.CodeModule.AddFromString Code
End With
End With
'------------------------------

Ceci Worksheets("toto").CodeName retourne le nom de la propriété de la feuille dont le nom de l'onglet est "Toto"


N.B. Pour exécuter la macro décrite dans ce message, tu n'as pas besoin d'utiliser ceci :
"Microsoft visual basic for applications extensibility 5.3"



MichD
------------------------------------------
Avatar
MichD
Bonjour,

Dans cette section du code :
'--------------------------------------------------------
Code = Code & "Private Sub Retour_Click()" & vbCrLf
Code = Code & "Range(""A3"").Select" & vbCrLf
Code = Code & "Range(""A1"").Select" & vbCrLf
Code = Code & "ActiveWindow.SelectedSheets.Visible = False" & vbCrLf
Code = Code & "Sheets(""Accueil"").Select" & vbCrLf
Code = Code & "End Sub" & vbCrLf

ThisWorkbook.VBProject.VBComponents("Feuil1").CodeModule.AddFromString Code
'--------------------------------------------------------

Sur la dernière ligne de code, "Feuil1" n'est pas le nom de l'onglet de la feuille, mais
la propriété Name de l'objet feuille visible seulement dans la fenêtre de l'éditeur de code.

Dans la petite fenêtre de gauche "Projet-VBAProject, sélectionne d'abord le nom du
projet vba : VBAProjet(NomDeTonclasseur.xls) . En cliquant sur le plus devant l'appellation,
tu vas afficher les objets du projet. Pour ce qui est des feuilles, elles sont listées de cette
manière :
Feuil1(toto)
Feuil2(Bozo)
Feuil3(cadeau)

La première partie : Feuil1 , Feuil2, Feuil3, représente la propriété Name de chacune des feuilles
La deuxième partie toto, bozo, cadeau, représente le nom des onglets de la feuille.

Dans la ligne de code suivante, c'est la propriété de la feuille que tu dois insérer et non le nom
de l'onglet de la feuille.
ThisWorkbook.VBProject.VBComponents("Feuil1").CodeModule.AddFromString Code

Une autre façon de faire (d'écrire la ligne de code)
'------------------------------
With ThisWorkbook
With .VBProject.VBComponents(.Worksheets("toto").CodeName)
.CodeModule.AddFromString Code
End With
End With
'------------------------------

Ceci Worksheets("toto").CodeName retourne le nom de la propriété de la feuille dont le nom de l'onglet est "Toto"


N.B. Pour exécuter la macro décrite dans ce message, tu n'as pas besoin d'utiliser ceci :
"Microsoft visual basic for applications extensibility 5.3"



MichD
------------------------------------------
Avatar
Joël André
Merci MichD,
Grâce à tes conseils, tout fonctionne.
Merci, merci beaucoup.

"MichD" a écrit dans le message de news:
j8h2ra$lhu$
Bonjour,

Dans cette section du code :
'--------------------------------------------------------
Code = Code & "Private Sub Retour_Click()" & vbCrLf
Code = Code & "Range(""A3"").Select" & vbCrLf
Code = Code & "Range(""A1"").Select" & vbCrLf
Code = Code & "ActiveWindow.SelectedSheets.Visible = False" & vbCrLf
Code = Code & "Sheets(""Accueil"").Select" & vbCrLf
Code = Code & "End Sub" & vbCrLf

ThisWorkbook.VBProject.VBComponents("Feuil1").CodeModule.AddFromString
Code
'--------------------------------------------------------

Sur la dernière ligne de code, "Feuil1" n'est pas le nom de l'onglet de la
feuille, mais
la propriété Name de l'objet feuille visible seulement dans la fenêtre de
l'éditeur de code.

Dans la petite fenêtre de gauche "Projet-VBAProject, sélectionne d'abord
le nom du
projet vba : VBAProjet(NomDeTonclasseur.xls) . En cliquant sur le plus
devant l'appellation,
tu vas afficher les objets du projet. Pour ce qui est des feuilles, elles
sont listées de cette
manière :
Feuil1(toto)
Feuil2(Bozo)
Feuil3(cadeau)

La première partie : Feuil1 , Feuil2, Feuil3, représente la propriété Name
de chacune des feuilles
La deuxième partie toto, bozo, cadeau, représente le nom des onglets de la
feuille.

Dans la ligne de code suivante, c'est la propriété de la feuille que tu
dois insérer et non le nom
de l'onglet de la feuille.
ThisWorkbook.VBProject.VBComponents("Feuil1").CodeModule.AddFromString
Code

Une autre façon de faire (d'écrire la ligne de code)
'------------------------------
With ThisWorkbook
With .VBProject.VBComponents(.Worksheets("toto").CodeName)
.CodeModule.AddFromString Code
End With
End With
'------------------------------

Ceci Worksheets("toto").CodeName retourne le nom de la propriété de la
feuille dont le nom de l'onglet est "Toto"


N.B. Pour exécuter la macro décrite dans ce message, tu n'as pas besoin
d'utiliser ceci :
"Microsoft visual basic for applications extensibility 5.3"



MichD
------------------------------------------