OVH Cloud OVH Cloud

[VBA-2003] Déclaration feuille

2 réponses
Avatar
Péhemme
Bonjour à tous,

Pourquoi, dans la macro qui suit, quand la feuille Sh1 est déclarée en
Worksheet, le bouton "CommandButton1" n'est pas reconnu, tandis que si cette
feuille est déclarée sans type (Variant de fait) le même "CommandButton1"
est reconnu ?
Merci d'avance
Michel

Sub test_01()
Dim Sh1 'As Worksheet
Set Sh1 = Worksheets("Accueil")

If [b2] = "" Then
[b2] = "Bonjour"
With Sh1.CommandButton1
.Caption = "Efface"
.ForeColor = &HFF0000
.BackColor = &HFF00&
End With
Else
[b2] = ""
With Sh1.CommandButton1
.Caption = "Bonjour"
.ForeColor = &HFF00&
.BackColor = &HFF0000
End With
End If
Set Sh1 = Nothing
End Sub

2 réponses

Avatar
michdenis
Et pour répondre au Pourquoi ?

Quand tu déclares le type d'une variable comme dans
Dim Sh1 As Worksheet

À chaque fois que tu utilise le "point" suivant le nom de
la variable déclarée, Excel te propose une liste déroulante des
propriétés et méthodes appartenant à ce type de variable.
Comme le type de la variable est connu, excel est capable
de vérifier au moment de l'écriture du code et non à l'exécution
si oui ou non, la propriété ou la méthode fait vraiment parti de
la classe objet. À cet égard, un commandButton n'est pas
une propriété ou une méthode associée à un objet "Worksheet" mais
plutôt un "objet hiérarchisé" qui peut se retrouver dans une feuille.
Le "point" entre Sh1 et commandButton1 fait référence à une hié-
rarchie d'objet plutôt qu'à une méthode ou propriété de l'objet Worksheet.

Quand tu ne déclares pas le type d'objet, Excel doit attendre
l'exécution du code ligne par ligne pour savoir à quoi la variable
fait référence. La ligne de code est alors possible car, après
qu'il a fait l'analyse de la ligne de code, il se rend compte que
celle-ci fait référence à un objet hiérarchisé présent et
appartenant à la feuille.

Voici 3 autres syntaxes que tu peux utiliser :

Dim Sh1 As Worksheet
Set Sh1 = Worksheets("Accueil")

x = Worksheets(Sh1.Name).CommandButton1.Caption
x = Sh1.Shapes("CommandButton1").OLEFormat.Object.Object.Caption
x = Sh1.OLEObjects("CommandButton1").Object.Caption




"Péhemme" a écrit dans le message de news:

Bonjour à tous,

Pourquoi, dans la macro qui suit, quand la feuille Sh1 est déclarée en
Worksheet, le bouton "CommandButton1" n'est pas reconnu, tandis que si cette
feuille est déclarée sans type (Variant de fait) le même "CommandButton1"
est reconnu ?
Merci d'avance
Michel

Sub test_01()
Dim Sh1 'As Worksheet
Set Sh1 = Worksheets("Accueil")

If [b2] = "" Then
[b2] = "Bonjour"
With Sh1.CommandButton1
.Caption = "Efface"
.ForeColor = &HFF0000
.BackColor = &HFF00&
End With
Else
[b2] = ""
With Sh1.CommandButton1
.Caption = "Bonjour"
.ForeColor = &HFF00&
.BackColor = &HFF0000
End With
End If
Set Sh1 = Nothing
End Sub
Avatar
Péhemme
Merci Denis pour ces explications parfaitement claires.
En plus, c'est logique et... j'ai tout compris (enfin je crois).
Bon dimanche à toi et
Bien amicalement
Michel

"michdenis" a écrit dans le message de
news:

Et pour répondre au Pourquoi ?

Quand tu déclares le type d'une variable comme dans
Dim Sh1 As Worksheet

À chaque fois que tu utilise le "point" suivant le nom de
la variable déclarée, Excel te propose une liste déroulante des
propriétés et méthodes appartenant à ce type de variable.
Comme le type de la variable est connu, excel est capable
de vérifier au moment de l'écriture du code et non à l'exécution
si oui ou non, la propriété ou la méthode fait vraiment parti de
la classe objet. À cet égard, un commandButton n'est pas
une propriété ou une méthode associée à un objet "Worksheet" mais
plutôt un "objet hiérarchisé" qui peut se retrouver dans une feuille.
Le "point" entre Sh1 et commandButton1 fait référence à une hié-
rarchie d'objet plutôt qu'à une méthode ou propriété de l'objet Worksheet.

Quand tu ne déclares pas le type d'objet, Excel doit attendre
l'exécution du code ligne par ligne pour savoir à quoi la variable
fait référence. La ligne de code est alors possible car, après
qu'il a fait l'analyse de la ligne de code, il se rend compte que
celle-ci fait référence à un objet hiérarchisé présent et
appartenant à la feuille.

Voici 3 autres syntaxes que tu peux utiliser :

Dim Sh1 As Worksheet
Set Sh1 = Worksheets("Accueil")

x = Worksheets(Sh1.Name).CommandButton1.Caption
x = Sh1.Shapes("CommandButton1").OLEFormat.Object.Object.Caption
x = Sh1.OLEObjects("CommandButton1").Object.Caption