OVH Cloud OVH Cloud

Nom de bouton sous XL 97

3 réponses
Avatar
Pierre Dumas
Bonjour tout le monde,

Grace a vous je sais bien faire des boutons (du genre=20
CommandButton) sous Excel 2000 et XP. Tout fonctionne=20
correctement. Malheureusement, cela ne marche pas avec=20
Excel 97. J'ai un probleme de nom.=20

Je m'explique :

Avec le code ci-dessous, j'insere un bouton dans ma=20
feuille et je lui affecte un nom et du code. Puis, quand=20
je clique sur mon bouton dans ma feuille, rien ne se passe.
En selectionnant le bouton en mode cr=E9ation, le nom que je=20
lui ai affecte apparait bien dans la zone de nom (au=20
dessus de la cellule A1), mais dans ses proprietes, le=20
bouton continue de s'appeler CommandButtonx (ou x est le=20
numero d'ordre de creation).
Qu'elle est la difference entre ces deux noms ?
Comment lui faire changer le nom que l'on trouve dans les=20
proprietes ?

*****Le Code en question*****
Public NomBouton As String
Public CaptionBouton As String


Sub InsererBoutonDeCommande()

Dim L As Double, T As Double, B As Object
NomBouton =3D NomBouton & Application.Substitute
(NomEvenement, ".", "_")

With ActiveSheet
L =3D .Range("I" & ActiveCell.Row).Left
T =3D .Range("I" & ActiveCell.Row).Top
With .OLEObjects.Add
(ClassType:=3D"Forms.CommandButton.1", _
Link:=3DFalse, DisplayAsIcon:=3DFalse, Left:=3DL, _
Top:=3DT, Width:=3D40, Height:=3D13.75)
With .Object
.ForeColor =3D RGB(255, 255, 255)
.BackColor =3D RGB(0, 0, 128)
.Caption =3D CaptionBouton
.Font.Name =3D "Arial"
.Font.Size =3D 5
End With
.Name =3D NomBouton
.PrintObject =3D False
Ins=E9rerLeCodeDuBouton ActiveSheet.Name, .Name
End With
End With

End Sub

Sub Ins=E9rerLeCodeDuBouton(NomFeuille As String, NomBouton=20
As String)

Dim A As String

A =3D Worksheets(NomFeuille).CodeName

code =3D " Private Sub " & NomBouton & "_Click()" & vbCrLf
code =3D code & "call Crea2Projet(""" & NomEvenement & """)"=20
& vbCrLf
code =3D code & "End Sub"
Set B =3D ThisWorkbook.VBProject.VBComponents(A).CodeModule
With B
.AddFromString code
End With
Set B =3D Nothing

End Sub
*****Fin du code*****
Note : les variables NomBouton et CaptionBouton etant deja=20
initialisees avant.

En esperant avoir ete clair.

Merci d'avance

Pierre

3 réponses

Avatar
Alain CROS
Bonjour.

Effectivement avec XL97, le nom du bouton pose problème.
Voici une copie d'un message que j'avais posté il y a quelque temps.

------------------------------------------------------------------------
Voila 1 petit exemple qui fonctionne sur XL97 et 2000.
Tu colle tous le code qui suit dans le module d'une feuille de calcul.
Sur cette feuille de calcul, tu insere 1 CommandButton nommé CommandButton1.
Ce Bouton permet lors du premier Click d'insérer 1 CommandButton puis lors du Click suivant de le supprimer.
Si tu est sur Mac, tu supprimes les 2 références a "user32".
Tu enléves les commentaires sur les lignes qui comportent Application.ScreenUpdating.
Tu met en commentaire la ligne qui suit Application.ScreenUpdating .

Option Explicit

Private Declare Function LockWindowUpdate Lib "user32" _
(ByVal hwndLock As Long) As Long

Private Declare Function GetDesktopWindow Lib "user32" () As Long

Private Sub CommandButton1_Click()

Static LeBouton As String
Dim MonBouton As OLEObject, lenom As String

If LeBouton = vbNullString Then LeBouton = "NouveauBouton"
On Error Resume Next
Set MonBouton = ActiveSheet.OLEObjects(LeBouton)
On Error GoTo 0
If MonBouton Is Nothing Then
lenom = CreerBoutonAvecEventClick(ActiveSheet, Range("D4"), LeBouton)
MsgBox "Nom Choisi = " & LeBouton & vbNewLine & _
"Nom Obtenu = " & lenom
LeBouton = lenom
Exit Sub
Else
Set MonBouton = Nothing
MsgBox "Le Bouton " & NettoieBoutonEtCodeClick(ActiveSheet, LeBouton) & _
" a été éffaçé" & vbNewLine & "Le Bouton demandé était " & LeBouton
LeBouton = vbNullString
End If

End Sub
Function CreerBoutonAvecEventClick(WS As Worksheet, _
LaCell As Range, lenom As String) As String
'créer un bouton sur une feuille de calcul, avec son événement Click

Dim OleObj As OLEObject
Dim Ctrl As MSForms.CommandButton
Dim LeCode As String
Dim CtrlName As String

On Error Resume Next
Set OleObj = WS.OLEObjects(lenom)
On Error GoTo 0
If Not OleObj Is Nothing Then Set OleObj = Nothing: Exit Function
' Application.ScreenUpdating = False
LockWindowUpdate GetDesktopWindow
ActiveCell.Activate
With LaCell
Set OleObj = WS.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Left:=.Left, Top:=.Top, Height:=.Height * 2, Width:=.Width * 2)
End With
OleObj.Name = lenom
Set Ctrl = OleObj.Object
Ctrl.Caption = lenom
CtrlName = Ctrl.Name
LeCode = "Msgbox ""Je suis le nouveau bouton "" & vbNewLine & _" & _
vbNewLine & """Mon Nom de Control est "" & """ & Ctrl.Name & """" & _
" & vbNewLine & _" & vbNewLine & _
"""Mon Nom d'OLEObject est "" & """ & OleObj.Name & """"
With ThisWorkbook.VBProject.VBComponents(Ctrl.Parent.Name).CodeModule
.ReplaceLine .CreateEventProc("Click", CtrlName) + 1, LeCode
.VBE.MainWindow.Visible = False
End With
' Application.ScreenUpdating = True
LockWindowUpdate False
CreerBoutonAvecEventClick = CtrlName
Set OleObj = Nothing
Set Ctrl = Nothing

End Function

Function NettoieBoutonEtCodeClick(WS As Worksheet, _
lenom As String) As String
'supprimer un bouton et son événement Click sur une feuille de calcul.

Dim OleObj As OLEObject
Dim Ctrl As MSForms.CommandButton

On Error Resume Next
Set OleObj = WS.OLEObjects(lenom)
On Error GoTo 0
If OleObj Is Nothing Then Exit Function
Application.ScreenUpdating = False
Set Ctrl = OleObj.Object
lenom = Ctrl.Name
ActiveCell.Activate
OleObj.Delete
Set OleObj = Nothing
With ActiveWorkbook.VBProject.VBComponents(WS.CodeName).CodeModule
.DeleteLines .ProcStartLine(lenom & "_Click", 0), _
.ProcCountLines(lenom & "_Click", 0)
End With
Set Ctrl = Nothing
Application.ScreenUpdating = True
NettoieBoutonEtCodeClick = lenom

End Function
-------------------------------------------------------------------------
Alain CROS.

"Pierre Dumas" a écrit dans le message de news: 101a01c3b364$3b230c40$
Bonjour tout le monde,

Grace a vous je sais bien faire des boutons (du genre
CommandButton) sous Excel 2000 et XP. Tout fonctionne
correctement. Malheureusement, cela ne marche pas avec
Excel 97. J'ai un probleme de nom.

Je m'explique :

Avec le code ci-dessous, j'insere un bouton dans ma
feuille et je lui affecte un nom et du code. Puis, quand
je clique sur mon bouton dans ma feuille, rien ne se passe.
En selectionnant le bouton en mode création, le nom que je
lui ai affecte apparait bien dans la zone de nom (au
dessus de la cellule A1), mais dans ses proprietes, le
bouton continue de s'appeler CommandButtonx (ou x est le
numero d'ordre de creation).
Qu'elle est la difference entre ces deux noms ?
Comment lui faire changer le nom que l'on trouve dans les
proprietes ?

*****Le Code en question*****
Public NomBouton As String
Public CaptionBouton As String


Sub InsererBoutonDeCommande()

Dim L As Double, T As Double, B As Object
NomBouton = NomBouton & Application.Substitute
(NomEvenement, ".", "_")

With ActiveSheet
L = .Range("I" & ActiveCell.Row).Left
T = .Range("I" & ActiveCell.Row).Top
With .OLEObjects.Add
(ClassType:="Forms.CommandButton.1", _
Link:úlse, DisplayAsIcon:úlse, Left:=L, _
Top:=T, Width:@, Height:.75)
With .Object
.ForeColor = RGB(255, 255, 255)
.BackColor = RGB(0, 0, 128)
.Caption = CaptionBouton
.Font.Name = "Arial"
.Font.Size = 5
End With
.Name = NomBouton
.PrintObject = False
InsérerLeCodeDuBouton ActiveSheet.Name, .Name
End With
End With

End Sub

Sub InsérerLeCodeDuBouton(NomFeuille As String, NomBouton
As String)

Dim A As String

A = Worksheets(NomFeuille).CodeName

code = " Private Sub " & NomBouton & "_Click()" & vbCrLf
code = code & "call Crea2Projet(""" & NomEvenement & """)"
& vbCrLf
code = code & "End Sub"
Set B = ThisWorkbook.VBProject.VBComponents(A).CodeModule
With B
.AddFromString code
End With
Set B = Nothing

End Sub
*****Fin du code*****
Note : les variables NomBouton et CaptionBouton etant deja
initialisees avant.

En esperant avoir ete clair.

Merci d'avance

Pierre
Avatar
Pierre Dumas
Bonjour

J'avais bien vu ton message, mais n'y avait pas prete
assez attention :-(

Toutefois, une legere modification semble s'imposer.
Au lieu de :
-----Message d'origine-----
[...]

OleObj.Name = lenom
Set Ctrl = OleObj.Object
Ctrl.Caption = lenom
CtrlName = Ctrl.Name


Il devrait y avoir :
OleObj.Name = lenom
Set Ctrl = OleObj.Object
Ctrl.Caption = lenom
Ctrl.Name = lenom

Bonne journee et merci encore.

Pierre

Avatar
Alain CROS
Bonjour.

Je l'ais écrit comme ça pour pointer la différence de comportement entre vba5(XL97) et vba6(XL2000 et >).
Dans mon exemple:

Avec vba6, le code créer est :
Private Sub NouveauBouton_Click()
MsgBox "Je suis le nouveau bouton " & vbNewLine & _
"Mon Nom de Control est " & "NouveauBouton" & vbNewLine & _
"Mon Nom d'OLEObject est " & "NouveauBouton"
End Sub

Avec vba5, le code créer est :
Private Sub CommandButton2_Click()
MsgBox "Je suis le nouveau bouton " & vbNewLine & _
"Mon Nom de Control est " & "CommandButton2" & vbNewLine & _
"Mon Nom d'OLEObject est " & "NouveauBouton"
End Sub

Alain CROS.

"Pierre Dumas" a écrit dans le message de news: 0bb701c3b40a$4e68a7a0$
Bonjour

J'avais bien vu ton message, mais n'y avait pas prete
assez attention :-(

Toutefois, une legere modification semble s'imposer.
Au lieu de :
-----Message d'origine-----
[...]

OleObj.Name = lenom
Set Ctrl = OleObj.Object
Ctrl.Caption = lenom
CtrlName = Ctrl.Name


Il devrait y avoir :
OleObj.Name = lenom
Set Ctrl = OleObj.Object
Ctrl.Caption = lenom
Ctrl.Name = lenom

Bonne journee et merci encore.

Pierre