plantage excel avec codemodule

J

jean

Guest
Bonjour,

Voici ci-dessous le code de deux procédures qui fonctionnent parfaitement lorsqu'elles sont lancées séparément, mais pour mon projet j'ai besoin à un moment d'écrire dans une autre procédure :

call apparitionbouton
call apparitionbouton2

et lorsque je fais ça excel plante complètement et se ferme...
Visiblement quelque chose cloche dans l'enchainement des deux procédures...
merci de votre aide et voici le code:

Sub apparitionbouton()



Dim code, code2 As String
Dim bouton, bouton2 As OLEObject
Set bouton = Worksheets('tabloogloobal').OLEObjects.Add(ClassType:='Forms.CommandButton.1', Link:=False, DisplayAsIcon:=False, Left:=6.75, Top:=19, Width:=63, Height:=25)
bouton.Object.Caption = 'rafraîchir'
bouton.Name = 'bouton'

code = 'Private sub bouton_Click()' & vbCrLf
code = code & 'run ''processusinverse''' & vbCrLf
code = code & 'worksheets(''tabloogloobal'').select' & vbCrLf
code = code & 'End sub' & vbCrLf



With ThisWorkbook.VBProject.VBComponents(Worksheets('tabloogloobal').CodeName).CodeModule
.AddFromString (code)
.CodePane.Window.Close
End With


End Sub



Sub apparitionbouton2()


'Dim code2 As String
'Dim bouton2 As OLEObject
Set bouton2 = Worksheets('SemaineProchaine').OLEObjects.Add(ClassType:='Forms.CommandButton.1', Link:=False, DisplayAsIcon:=False, Left:=6.75, Top:=19, Width:=63, Height:=25)
bouton2.Object.Caption = 'rafraîchir'
bouton2.Name = 'bouton2'

code2 = 'Private sub bouton2_Click()' & vbCrLf
code2 = code2 & 'run ''processusinverse2''' & vbCrLf
code2 = code2 & 'worksheets(''SemaineProchaine'').select' & vbCrLf
code2 = code2 & 'End sub' & vbCrLf



With ThisWorkbook.VBProject.VBComponents(Worksheets('SemaineProchaine').CodeName).CodeModule
.InsertLines .countoflines + 1, code2
.CodePane.Window.Close
End With

End Sub
 

Bebere

XLDnaute Barbatruc
bonjour

j'ai testé le code qui suit , pas de problèmes

on ne peut pas passer d'objets aux macros à l'aide de la méthode Run

Sub apparitionbouton()

Dim code As String
Dim bouton As OLEObject
Set bouton = Worksheets('tabloogloobal').OLEObjects.Add(ClassType:='Forms.CommandButton.1', Link:=False, DisplayAsIcon:=False, Left:=6.75, Top:=19, Width:=63, Height:=25)
bouton.Object.Caption = 'rafraîchir'
bouton.Name = 'bouton'

code = 'Private sub bouton_Click()' & vbCrLf
code = code & 'Application.run ''processusinverse''' & vbCrLf
code = code & 'worksheets(''tabloogloobal'').select' & vbCrLf
code = code & 'End sub' & vbCrLf

With ThisWorkbook.VBProject.VBComponents(Worksheets('tabloogloobal').CodeName).CodeModule
.AddFromString (code)
.CodePane.Window.Close
End With

End Sub

Sub apparitionbouton2()

Dim code2 As String
Dim bouton2 As OLEObject
Set bouton2 = Worksheets('SemaineProchaine').OLEObjects.Add(ClassType:='Forms.CommandButton.1', Link:=False, DisplayAsIcon:=False, Left:=6.75, Top:=19, Width:=63, Height:=25)
'bouton2.Object.Caption = 'rafraîchir'
'bouton2.Name = 'bouton2'

code2 = 'Private sub bouton2_Click()' & vbCrLf
code2 = code2 & 'Application.run ''processusinverse2''' & vbCrLf
code2 = code2 & 'worksheets(''SemaineProchaine'').select' & vbCrLf
code2 = code2 & 'End sub' & vbCrLf



With ThisWorkbook.VBProject.VBComponents(Worksheets('SemaineProchaine').CodeName).CodeModule
.InsertLines .countoflines + 1, code2
.CodePane.Window.Close
End With

au revoir
End Sub
 

Ti_

Nous a quitté
Repose en paix
Marrant ça, je je me suis débattu pendant plusieurs jours la semaine passée sur un problème similaire dans mon dernier programme, et je pense que ce qui m'a pourri la vie doit avoir la même cause que toi.

En fait, Excel recompile en arrière plan dès qu'on insère du code dans une feuille, et c'est là qu'il plante. On peut d'ailleurs noter qu'il doit recompiler de la même manière dans un module, mais que là ça ne plante pas. Après force recherches, je n'ai trouvé qu'une seule solution valable, et encore, si ce code n'est destiné qu'à tourner sur ta propre machine : il faut aller dans le menu outils de l'éditeur VBA, onglet 'Général', et là décocher l'option 'compilation sur demande'. Alors ça ne plante plus.

Mais comme je n'ai par ailleurs trouvé aucun moyen de modifier cette option par macro, j'ai dû m'avouer vaincu et supprimer dans mon programme la copie de code dans une feuille.
A noter pour être précis que dans mon programme, ça plante systématiquement lorsque le copier/coller se fait depuis un treeview, mais ça ne plante que 'de temps en temps' lorsque je passe par un simple bouton de commande qui va copier telle macro d'un module à une feuille.
 

Hellboy

XLDnaute Accro
Bonsoir jean, Ti_, Bebere

Jean, peux-tu me dire si ton but est d'insérer une procédure a partir d'un autre fichier vers un autre fichier.

Et pourquoi elle n'est pas présente déjà dedans ?

Ton bouton que tu crée apparait ds un autre fichier, ou dans celui que tu travail ?

En attendant, j'ai pris cette sitation (anglaise)du site http://www.cpearson.com/excel/vbe.htm

Elle parle bien entendu comment inséré une procédure dans un module. Je ne sais pas si ça s'applique atoi, mais il y a deux mises en garde. Si tu comprend pas tout je te ferai une traduction de mon mieux.


Adding A Procedure To A Module

The procedure below will add a new procedure called 'MyNewProcedure' to the module named 'NewModule' in ThisWorkbook.

Sub AddProcedure()

Dim VBCodeMod As CodeModule
Dim LineNum As Long

Set VBCodeMod = ThisWorkbook.VBProject.VBComponents('NewModule').CodeModule
With VBCodeMod
LineNum = .CountOfLines + 1
.InsertLines LineNum, _
'Sub MyNewProcedure()' & Chr(13) & _
' Msgbox ''Here is the new procedure'' ' & Chr(13) & _
'End Sub'
End With

Application.Run 'MyNewProcedure'

End Sub

Pay attention to the way in which the .InsertLines method is called. The entire procedure is passed as one argument -- a string with embedded Chr(13) characters for the line breaks. The code statement

Application.Run 'MyNewProcedure'

will run the new procedure. You must use Application.Run rather than calling the procedure directly in order to prevent compile-time errors. This method will work only if you are adding code to another code module. If you are adding code a the same code module, you must use an Application.OnTime method, so that control is returned to Excel, and the module can be recompiled and reloaded. Using Application.OnTime may have some synchronizations problems, so you should avoid calling a procedure that you've just added to the same code module without allowing all VBA procedures to come to an end.

Application.OnTime Now,'NewProcedureName'

a+
 

Discussions similaires

Réponses
16
Affichages
1 K

Statistiques des forums

Discussions
312 493
Messages
2 088 952
Membres
103 989
dernier inscrit
jralonso