OVH Cloud OVH Cloud

Excel plante :-(

7 réponses
Avatar
Pierre Dumas
Bonsoir les noctambules (ou les outre-merriens)

Ce code ci-dessous fait planter et fermer Excel.
Pourquoi ?
Je ne comprend pas du tout.

La situation : une feuille, deux boutons de commandes dans=20
la feuille avec un msgbox("coucou") pour chaque code=20
associ=E9. Du basique.

'*****D=E9but du code
Option Explicit

Sub testdubazar()
Call RenommeProc("CommandButton1", "ZCommandButton1")
Call RenommeBouton("CommandButton2", "CommandButtonGAGNE")
End Sub

Sub RenommeBouton(AncienNom, NouveauNom As String)
Dim OleObj2 As OLEObject
Dim Ctrl2 As MSForms.CommandButton
MsgBox ("avant set ole" & vbCrLf & AncienNom & vbCrLf &=20
NouveauNom)
Set OleObj2 =3D ActiveSheet.OLEObjects(AncienNom)
MsgBox ("avant set Ctrl2")
Set Ctrl2 =3D OleObj2.Object
ActiveCell.Activate
MsgBox ("avant OleObj2.name")
OleObj2.Name =3D NouveauNom
MsgBox ("avant Ctrl2.name")
Ctrl2.Name =3D NouveauNom
MsgBox ("avant OleObj2 nothing")
Set OleObj2 =3D Nothing
MsgBox ("avant Ctrl2 nothing")
Set Ctrl2 =3D Nothing
End Sub


Sub RenommeProc(AncienneProc, NouvelleProc As String)
Dim Comp As Object
Dim liDeb As Long

With ThisWorkbook.VBProject.VBComponents(Worksheets
(ActiveSheet.Name).CodeName).CodeModule
liDeb =3D .ProcStartLine(AncienneProc & "_Click", 0)
End With

Set Comp =3D ActiveWorkbook.VBProject.VBComponents(Worksheets
(ActiveSheet.Name).CodeName)
MsgBox (liDeb)
Comp.CodeModule.replaceLine liDeb, "Private Sub " &=20
NouvelleProc & "_Click()"
Comp.CodeModule.replaceLine liDeb + 1, " msgbox
(""coucou gagn=E9"")"
MsgBox ("fin select")
Set Comp =3D Nothing
MsgBox ("comp nothing")
End Sub
'****Fin du code***

Il y a beaucoup de msgbox pour savoir =E0 quel moment cela=20
plante, mais cela ne m'aide pas beaucoup.

Merci =E0 ceux(celui, celle) qui m'aideront(a)

Pierre

7 réponses

Avatar
Denis Michon
Bonsoir Pierre,

J'ai modifié un peu ton code, ceci semble fonctionner :


Attention avec la substitution de ligne de code.. si jamais tu déplaçais ta ligne de message d'une ligne vers le bas(en
insérant une ligne vide), ta procédure ne serait plus efficace...puisque ta référence à une ligne fixe est préétablie.


Option Explicit
'-----------------------
Sub testdubazar()
Call RenommeProc("CommandButton1", "ZCommandButton1")
Call RenommeBouton("CommandButton2", "CommandButtonGAGNE")
End Sub
'-----------------------
Sub RenommeBouton(AncienNom, NouveauNom As String)
Dim OleObj2 As OLEObject

Set OleObj2 = ActiveeSheet.Shapes(AncienNom).OLEFormat.Object
With OleObj2.Object
MsgBox "ancien nom était : " & .Caption
.Caption = NouveauNom
MsgBox "Le nouveau nom est : " & .Caption
End With
Set OleObj2 = Nothing
End Sub
'-----------------------
Sub RenommeProc(AncienneProc, NouvelleProc As String)

Dim Comp As Object
Dim liDeb As Long

Set Comp = ActiveWorkbook.VBProject.VBComponents(Worksheets(ActiveSheet.Name).CodeName)
With Comp
liDeb = .ProcStartLine(AncienneProc & "_Click", 0)
MsgBox (liDeb)
Comp.codemodule.replaceLine liDeb, "Private Sub " & NouvelleProc & "_Click()"
Comp.codemodule.replaceLine liDeb + 1, "MsgBox ""fin select"""
End With
Set Comp = Nothing
MsgBox "comp nothing"
End Sub
'-----------------------


Salutations!




"Pierre Dumas" a écrit dans le message de
news:1255901c3c03b$22407940$
Bonsoir les noctambules (ou les outre-merriens)

Ce code ci-dessous fait planter et fermer Excel.
Pourquoi ?
Je ne comprend pas du tout.

La situation : une feuille, deux boutons de commandes dans
la feuille avec un msgbox("coucou") pour chaque code
associé. Du basique.

'*****Début du code
Option Explicit

Sub testdubazar()
Call RenommeProc("CommandButton1", "ZCommandButton1")
Call RenommeBouton("CommandButton2", "CommandButtonGAGNE")
End Sub

Sub RenommeBouton(AncienNom, NouveauNom As String)
Dim OleObj2 As OLEObject
Dim Ctrl2 As MSForms.CommandButton
MsgBox ("avant set ole" & vbCrLf & AncienNom & vbCrLf &
NouveauNom)
Set OleObj2 = ActiveSheet.OLEObjects(AncienNom)
MsgBox ("avant set Ctrl2")
Set Ctrl2 = OleObj2.Object
ActiveCell.Activate
MsgBox ("avant OleObj2.name")
OleObj2.Name = NouveauNom
MsgBox ("avant Ctrl2.name")
Ctrl2.Name = NouveauNom
MsgBox ("avant OleObj2 nothing")
Set OleObj2 = Nothing
MsgBox ("avant Ctrl2 nothing")
Set Ctrl2 = Nothing
End Sub


Sub RenommeProc(AncienneProc, NouvelleProc As String)
Dim Comp As Object
Dim liDeb As Long

With ThisWorkbook.VBProject.VBComponents(Worksheets
(ActiveSheet.Name).CodeName).CodeModule
liDeb = .ProcStartLine(AncienneProc & "_Click", 0)
End With

Set Comp = ActiveWorkbook.VBProject.VBComponents(Worksheets
(ActiveSheet.Name).CodeName)
MsgBox (liDeb)
Comp.CodeModule.replaceLine liDeb, "Private Sub " &
NouvelleProc & "_Click()"
Comp.CodeModule.replaceLine liDeb + 1, " msgbox
(""coucou gagné"")"
MsgBox ("fin select")
Set Comp = Nothing
MsgBox ("comp nothing")
End Sub
'****Fin du code***

Il y a beaucoup de msgbox pour savoir à quel moment cela
plante, mais cela ne m'aide pas beaucoup.

Merci à ceux(celui, celle) qui m'aideront(a)

Pierre
Avatar
Pierre Dumas
Merci d'etre la pour me seconder dans cette nuit.

J'ai remodifie un peu derriere.
Tout marche si on lance d'abord une sub, puis après
l'autre.
Mais cela ne fonctionne pas les 2 enchainees.

Par ailleurs, ce n'est pas le .caption que je veux
modifier, mais le .name et cela a une grosse difference
car ce code ne fonctionne pas en XL97. Mais marche en
XL200 (et plus, mais je n'ai pas essaye).
Or, mon code DOIT fonctionner poue toute version depuis la
97. C'est pourquoi, je passai par le OleObj2 et le Ctrl2.

En resumant : cela ne fonctionne pas en enchainant les 2
procedures d'affile, et en XL97, le .name ne fait rien.

Voila mon code modifie :

Option Explicit
'-----------------------
Sub testdubazar()
Call RenommeProc("CommandButton1", "ZCommandButton1")
Call RenommeBouton("CommandButton2", "CommandButtonGAGNE")
End Sub
'-----------------------
Sub RenommeBouton(AncienNom, NouveauNom As String)
Dim OleObj2 As OLEObject

Set OleObj2 = ActiveSheet.Shapes
(AncienNom).OLEFormat.Object
With OleObj2
.Name = NouveauNom
End With
Set OleObj2 = Nothing
End Sub
'-----------------------
Sub RenommeProc(AncienneProc, NouvelleProc As String)

Dim Comp As Object
Dim liDeb As Long

Set Comp = ActiveWorkbook.VBProject.VBComponents(Worksheets
(ActiveSheet.Name).CodeName)
With Comp
liDeb = .codemodule.ProcStartLine(AncienneProc
& "_Click", 0)
MsgBox (liDeb)
Comp.codemodule.replaceLine liDeb, "Private Sub " &
NouvelleProc & "_Click()"
Comp.codemodule.replaceLine liDeb + 1, " msgbox
(""coucou gagné"")"
End With
Set Comp = Nothing
End Sub
'-----------------------

Merci bien.

J'attends de tes nouvelles avant d'aller voir Morphee.

Pierre
Avatar
Denis Michon
Bonjour Pierre,

Voici, J'ai testé ce qui suit avec excel 2003 et cela fonctionne

Cependant, je ne peux la modifier et la tester pour la version excel 97, je n'ai pas cette version d'installer.


Option Explicit
'-------------------------
Sub testdubazar()

Call RenommeBouton("CommandButton2", "CommandButtonGAGNE")
Call RenommeProc("CommandButton1", "ZCommandButton1")

End Sub

Sub RenommeBouton(AncienNom, NouveauNom As String)
Dim OleObj2 As OLEObject

Set OleObj2 = ActiveSheet.Shapes(AncienNom).OLEFormat.Object
With OleObj2
MsgBox "ancien nom était : " & .Name
.Name = NouveauNom
MsgBox "Le nouveau nom est : " & .Name
End With
Set OleObj2 = Nothing

End Sub

'-------------------------
Sub RenommeProc(AncienneProc, NouvelleProc As String)

Dim Comp As Object
Dim liDeb As Long

Set Comp = ActiveWorkbook.VBProject.VBComponents(Worksheets(ActiveSheet.Name).CodeName)
With Comp.codemodule
liDeb = .ProcStartLine(AncienneProc & "_Click", 0)
MsgBox (liDeb)
Comp.codemodule.replaceLine liDeb, "Private Sub " & NouvelleProc & "_Click()"
Comp.codemodule.replaceLine liDeb + 1, "MsgBox ""fin select"""
End With
Set Comp = Nothing
MsgBox "comp nothing"
End Sub
'-------------------------


Salutations!




"Pierre Dumas" a écrit dans le message de
news:125df01c3c047$faa0f790$
Merci d'etre la pour me seconder dans cette nuit.

J'ai remodifie un peu derriere.
Tout marche si on lance d'abord une sub, puis après
l'autre.
Mais cela ne fonctionne pas les 2 enchainees.

Par ailleurs, ce n'est pas le .caption que je veux
modifier, mais le .name et cela a une grosse difference
car ce code ne fonctionne pas en XL97. Mais marche en
XL200 (et plus, mais je n'ai pas essaye).
Or, mon code DOIT fonctionner poue toute version depuis la
97. C'est pourquoi, je passai par le OleObj2 et le Ctrl2.

En resumant : cela ne fonctionne pas en enchainant les 2
procedures d'affile, et en XL97, le .name ne fait rien.

Voila mon code modifie :

Option Explicit
'-----------------------
Sub testdubazar()
Call RenommeProc("CommandButton1", "ZCommandButton1")
Call RenommeBouton("CommandButton2", "CommandButtonGAGNE")
End Sub
'-----------------------
Sub RenommeBouton(AncienNom, NouveauNom As String)
Dim OleObj2 As OLEObject

Set OleObj2 = ActiveSheet.Shapes
(AncienNom).OLEFormat.Object
With OleObj2
.Name = NouveauNom
End With
Set OleObj2 = Nothing
End Sub
'-----------------------
Sub RenommeProc(AncienneProc, NouvelleProc As String)

Dim Comp As Object
Dim liDeb As Long

Set Comp = ActiveWorkbook.VBProject.VBComponents(Worksheets
(ActiveSheet.Name).CodeName)
With Comp
liDeb = .codemodule.ProcStartLine(AncienneProc
& "_Click", 0)
MsgBox (liDeb)
Comp.codemodule.replaceLine liDeb, "Private Sub " &
NouvelleProc & "_Click()"
Comp.codemodule.replaceLine liDeb + 1, " msgbox
(""coucou gagné"")"
End With
Set Comp = Nothing
End Sub
'-----------------------

Merci bien.

J'attends de tes nouvelles avant d'aller voir Morphee.

Pierre
Avatar
Denis Michon
En supplément, pour cette section de ta procédure, tu peux aussi utiliser cette version ( tout au moins sur excel 2003)
est-ce ok avec excel 97 ?

'------------------------
Sub RenommeBouton(AncienNom, NouveauNom As String)
Dim OleObj2 As Shape

Set OleObj2 = ActiveSheet.Shapes(AncienNom)
With OleObj2
MsgBox "ancien nom était : " & .Name
.Name = NouveauNom
MsgBox "Le nouveau nom est : " & .Name
End With
Set OleObj2 = Nothing

End Sub
'------------------------


Salutations!




"Denis Michon" <denis a écrit dans le message de news:ny8Cb.51355$
Bonjour Pierre,

Voici, J'ai testé ce qui suit avec excel 2003 et cela fonctionne

Cependant, je ne peux la modifier et la tester pour la version excel 97, je n'ai pas cette version d'installer.


Option Explicit
'-------------------------
Sub testdubazar()

Call RenommeBouton("CommandButton2", "CommandButtonGAGNE")
Call RenommeProc("CommandButton1", "ZCommandButton1")

End Sub

Sub RenommeBouton(AncienNom, NouveauNom As String)
Dim OleObj2 As OLEObject

Set OleObj2 = ActiveSheet.Shapes(AncienNom).OLEFormat.Object
With OleObj2
MsgBox "ancien nom était : " & .Name
.Name = NouveauNom
MsgBox "Le nouveau nom est : " & .Name
End With
Set OleObj2 = Nothing

End Sub

'-------------------------
Sub RenommeProc(AncienneProc, NouvelleProc As String)

Dim Comp As Object
Dim liDeb As Long

Set Comp = ActiveWorkbook.VBProject.VBComponents(Worksheets(ActiveSheet.Name).CodeName)
With Comp.codemodule
liDeb = .ProcStartLine(AncienneProc & "_Click", 0)
MsgBox (liDeb)
Comp.codemodule.replaceLine liDeb, "Private Sub " & NouvelleProc & "_Click()"
Comp.codemodule.replaceLine liDeb + 1, "MsgBox ""fin select"""
End With
Set Comp = Nothing
MsgBox "comp nothing"
End Sub
'-------------------------


Salutations!




"Pierre Dumas" a écrit dans le message de
news:125df01c3c047$faa0f790$
Merci d'etre la pour me seconder dans cette nuit.

J'ai remodifie un peu derriere.
Tout marche si on lance d'abord une sub, puis après
l'autre.
Mais cela ne fonctionne pas les 2 enchainees.

Par ailleurs, ce n'est pas le .caption que je veux
modifier, mais le .name et cela a une grosse difference
car ce code ne fonctionne pas en XL97. Mais marche en
XL200 (et plus, mais je n'ai pas essaye).
Or, mon code DOIT fonctionner poue toute version depuis la
97. C'est pourquoi, je passai par le OleObj2 et le Ctrl2.

En resumant : cela ne fonctionne pas en enchainant les 2
procedures d'affile, et en XL97, le .name ne fait rien.

Voila mon code modifie :

Option Explicit
'-----------------------
Sub testdubazar()
Call RenommeProc("CommandButton1", "ZCommandButton1")
Call RenommeBouton("CommandButton2", "CommandButtonGAGNE")
End Sub
'-----------------------
Sub RenommeBouton(AncienNom, NouveauNom As String)
Dim OleObj2 As OLEObject

Set OleObj2 = ActiveSheet.Shapes
(AncienNom).OLEFormat.Object
With OleObj2
.Name = NouveauNom
End With
Set OleObj2 = Nothing
End Sub
'-----------------------
Sub RenommeProc(AncienneProc, NouvelleProc As String)

Dim Comp As Object
Dim liDeb As Long

Set Comp = ActiveWorkbook.VBProject.VBComponents(Worksheets
(ActiveSheet.Name).CodeName)
With Comp
liDeb = .codemodule.ProcStartLine(AncienneProc
& "_Click", 0)
MsgBox (liDeb)
Comp.codemodule.replaceLine liDeb, "Private Sub " &
NouvelleProc & "_Click()"
Comp.codemodule.replaceLine liDeb + 1, " msgbox
(""coucou gagné"")"
End With
Set Comp = Nothing
End Sub
'-----------------------

Merci bien.

J'attends de tes nouvelles avant d'aller voir Morphee.

Pierre
Avatar
Pierre Dumas
Encore bonsoir

Tout à fait d'accord. Cela fonctionne, meme en 2000.
Mais, j'ai besoin d'avoir l'autre ordre de lancement :
call RenommeProc
call RenommeBouton
et, la cela plante.

J'en ai besoin, car dans ma feuille, il y a plein de
boutons qui sont numerotes hierarchiquement (comme les
numeros de livres dans une bibliotheque).
Or, l'utilisateur, peut avoir la possibilite de supprimer
toute une arborescence. Donc certains boutons vont
disparaitre (avec leur procedure), et d'autres sont
renommes (avec leur procedure). Et la est mon souci quand
je dois renommer un bouton apres avoir renomme la
procedure du bouton precedent.
(Je ne suis pas sur d'etre parfaitement clair).
Je suis donc ici coince par l'ordre des procedure a lancer.

Cependant, je ne peux la modifier et la tester pour la
version excel 97, je n'ai pas cette version d'installer.


J'essaierai de trouver une solution le temps venu.

Pierre (encore eveille)

Avatar
Pierre Dumas
En faisant travailler ma tete, j'ai essaye de changer
l'ordre dans laquelle les procedures se changeaient.
Ca, j'ai reussi
Je lance d'abord, tous les renommage de bouton, puis les
renommages de procédures.
Et cela plante.

En fait XL se ferme quand on lance une deuxieme fois le
RenommeProc.

On peut donc pour reproduire le phenomene lancer la macro
suivante :
Sub testdubazar()
Call RenommeProc("CommandButton1", "ZCommandButton1")
Call RenommeProc("CommandButton2", "ZCommandButton2")
End Sub

XL se fermera des le debut de la seconde instruction.
Ou est donc l'erreur dans le code RenommeProc ?
Qu'est-ce qui fait que dans le code suivant on ne peut pas
le lancer 2 fois de suite ?

Sub RenommeProc(AncienneProc, NouvelleProc As String)
Dim Comp As Object
Dim liDeb As Long
Set Comp = ActiveWorkbook.VBProject.VBComponents(Worksheets
(ActiveSheet.Name).CodeName)
With Comp.codemodule
liDeb = .ProcStartLine(AncienneProc & "_Click", 0)
MsgBox (liDeb)
Comp.codemodule.replaceLine liDeb, "Private Sub " &
NouvelleProc & "_Click()"
Comp.codemodule.replaceLine liDeb + 1, "MsgBox ""fin
select"""
End With
Set Comp = Nothing
End Sub


Pierre
Avatar
Pierre Dumas
J'ai trouve (apres une nuit complete) a cause de quoi
exactement Excel plante !!
Tout simplement parce que on cherche a ecrire une macro
avec Private Sub.
Si on remplace par une macro en Sub, Excel ne plante plus.

Quant à savoir pourquoi cela fait planter Excel...

Merci a Denis d'avoir tenu la lumiere allumee cette nuit.

Pierre (qui dormira mieux ce soir)