Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Modification automatique de Module

S

Stany

Guest
Bonjour à tous,
voici ma situation.

J'ai un claseur de 150 Feuilles. Dont une feuille qui sert de "Modèle".
Je souhaite appliquer les modifications apportées au module de la feuille "Modèle" aux autres feuilles du classeur.

Après diverses recherches dans ce forum voilà ce que j'ai écrit:

Sub MajFeuille()
Dim X As Variant
Dim S As String
For Each X In ActiveWorkbook.Sheets
If X.Name <> "Modèlé" Then
Sheets(X.Name).Select

'Supprime le Code de la feuille à modifier
With ActiveWorkbook.VBProject.VBComponents(Sheets(X.Name).CodeName).CodeModule
.DeleteLines 1, .CountOfLines
End With

'Prend le module de la feuille Modèle
With ActiveWorkbook.VBProject.VBComponents(Sheets("Modèle").CodeName).CodeModule
S = .Lines(1, .CountOfLines)
End With

'Ecrit le module la feuille à modifier
With ActiveWorkbook.VBProject.VBComponents(Sheets(X.Name).CodeName).CodeModule
.AddFromString S
.CodePane.Window.Close
End With

End If
Next X
End Sub

A l'éxécution de cette macro, windows m'annonce une erreur d'application Excel. Donc aucun moyen de debuggage.

Lorsque j'utilise cette macro sans la boucle FOR...NEXT et que je définit par exemple Set X = Sheets("Feuille1"), cela marche très bien.

Ou est mon erreur? le CodePane.Windows.Close peut-être?

Merci
 
Z

Zon

Guest
Salut,

Tu a une erreur de saisie , "Modèlé" est différent de "Modèle", donc tu effaces le code de la feuille "Modèle" c'est pour cela que tu as une erreur d'application.



A+++
 
S

Stany

Guest
Investigation:
Modification de mon code:

Sub MajAgents()
I = 7
While Sheets("Général").Cells(I, 1) <> "" 'Liste des noms des 150 feuilles à modifier
Call MajAgentX(Sheets("Général").Cells(I, 1).Value)
I = I + 1
Wend
End Sub

Sub MajAgentX(Nom As String)
Dim X As Variant
Dim S As String
' Prend le Code Source de la feuille Modèle
With ActiveWorkbook.VBProject.VBComponents(Sheets("Modèle").CodeName).CodeModule
S = .Lines(1, .CountOfLines)
End With
Set X = Sheets(Nom)
' Supprime le Code de la feuille
With ActiveWorkbook.VBProject.VBComponents(Sheets(X.Name).CodeName).CodeModule
.DeleteLines 1, .CountOfLines
' Ecrit le Code dans le module de la feuille
.AddFromString S
.CodePane.Window.Close
End With
End Sub

C'est toujours pareil
 
S

Stany

Guest
Investigation 2:
En fait c'est l'écriture du module qui fait planter Excel.
Nouveau code

Sub MajAgentX()
Dim X As Variant
Dim S As String
With ActiveWorkbook.VBProject.VBComponents(Sheets("Modèle").CodeName).CodeModule
S = .Lines(1, .CountOfLines) ' Prend le Code Source de la feuille Modèle
End With
I = 7
While Sheets("Général").Cells(I, 1) <> "" 'Liste des noms des 150 feuilles à modifier
Set X = Sheets(Sheets("Général").Cells(I, 1).Value)
With ActiveWorkbook.VBProject.VBComponents(Sheets(X.Name).CodeName).CodeModule
.AddFromString S ' Ecrit le Code de la feuille
.CodePane.Window.Close ' Ferme le module de la feuille
End With
I = I + 1
Wend
End Sub

L'effacement des modules dans la boucle se passe bien. C'est l'écriture qui ne fonctionne pas.
 
S

Stany

Guest
Investigation 3:
L'effacement de module marche très bien (avec ou sans boucle).
Une écriture sans boucle fonctionne bien.

Le problème se produit quand je veux faire une écriture à l'intérieur d'une boucle (FOR...NEXT ou WHILE...WEND)

Sub MajAgentX()
Dim X As Variant
Dim S As String

With ActiveWorkbook.VBProject.VBComponents(Sheets("Modèle").CodeName).CodeModule
S = .Lines(1, .CountOfLines) ' Prend le Code Source de la feuille Modèle
End With

I = 1
While Sheets("Feuil1").Cells(I, 1) <> "" ' Liste des feuilles à modifier
Set X = Sheets(Sheets("Feuil1").Cells(I, 1).Value)
' MAJ Module
With ActiveWorkbook.VBProject.VBComponents(Sheets(X.Name).CodeName).CodeModule
.AddFromString S ' Ecrit le Code de la feuille
End With
I = I + 1
Wend
End Sub
 
S

Stany

Guest
Investigation 4
Le problème vient de ce que je veux écrire.

Mon code source que je veux copier dans les autres feuilles est le suivant:

Private Sub Back_Click()
Call AgentX_Back_Click
End Sub

Mon code pour écrire dans les feuille est le suivant:

Sub MajAgentX()
Dim X As Variant
Dim S As String

With ActiveWorkbook.VBProject.VBComponents(Sheets("Modèle").CodeName).CodeModule
S = .Lines(1, .CountOfLines) ' Prend le Code Source de la feuille Modèle
End With
I = 1
While Sheets("Feuil1").Cells(I, 1) <> "" 'Liste des feuilles à modifier
Set X = Sheets(Sheets("Feuil1").Cells(I, 1).Value)
' MAJ Module
With ActiveWorkbook.VBProject.VBComponents(Sheets(X.Name).CodeName).CodeModule
.AddFromString S ' Ecrit le Code de la feuille
End With
I = I + 1
Wend
End Sub

Quand je met REM devant chaque ligne...
Rem Private Sub Back_Click()
Rem Call AgentX_Back_Click
Rem End Sub
...le code passe donc en commantire, alors tout ce passe bien. Ma macro de mise à jour ecrit dans toutes les feuilles (utilisation d'une boucle).
Rappel: Tout ce passe bien (effacement, écriture sans Rem..) si je n'utilise pas la boucle. Mais j'ai pas envie de faire la manip. pour 150 feuilles.

Qu'est ce qui cloche dans ce que je veux écrire dans les feuilles pour que ca plante Excel?

Merci
 
Z

Zon

Guest
Salut,

En modifiant la déclaration de X et en rajoutant un gestion d'erreur .

Sub MajAgentX()
Dim X As worksheet
Dim S As String,Msg$
dim I& 'on déclare i tant qu'on y est
With ActiveWorkbook.VBProject.VBComponents(Sheets("Modèle").CodeName).CodeModule
S = .Lines(1, .CountOfLines) ' Prend le Code Source de la feuille Modèle
End With
I = 1
with Sheets("Feuil1")
While .Cells(I, 1) <> "" 'Liste des feuilles à modifier
on error resume next
Set X = Sheets(.Cells(I, 1).Value)
if err<>0 then
msg=msg & " " .Cells(I, 1).Value
' MAJ Module
else
With ActiveWorkbook.VBProject.VBComponents(x.CodeName).CodeModule
.AddFromString S ' Ecrit le Code de la feuille
End With
end if
I = I + 1
Wend
end with
if len(msg)>0 then msgbox "Erreur de saisie pour " & msg
End Sub

Au lieu d'écrire les 150 noms on peut passer par une boucle sur les feuilles du classeur

Sub MajAgentX()
Dim X As worksheet
Dim S As String
With ActiveWorkbook
with .VBProject.VBComponents(Sheets("Modèle").CodeName).CodeModule
S = .Lines(1, .CountOfLines) ' Prend le Code Source de la feuille Modèle
End With
for each x in .worksheets
if x.name <>"Modèle" then
With .VBProject.VBComponents(x.CodeName).CodeModule
.AddFromString S ' Ecrit le Code de la feuille
End With
end if
next x
end with
End Sub

A+++
 
S

Stany

Guest
SPER MERCI.
T'as gestion d'erreurs, contrôle celles de Visual BAsic mais celle de Windows.
Mais J'ai trouvé d'où venait le bugg.
Je décalrais "X AS VARIANT" au lieu de "X AS WORKSHEET".
Et rien que ça faisait planter Windows (Excel).

Encore Merci @+
 

Discussions similaires

Réponses
3
Affichages
879
Réponses
1
Affichages
1 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…