Propriétés de controles

Chrige

XLDnaute Occasionnel
Bonjour à tout le Forum

Depuis longtemps je me demande à quoi peuvent bien servir certaines propriétés de contrôles
Ils peuvent parfois être très nombreux
Certains sont connus, d'autres très explicites
Mais pour d'autres ??
Si je prends les propriétés d'un ComboBox
Je vois la propriété SpecialEffect, a quoi peut elle bien servir ??
Même en la testant, alors que l'effet devrait être visuel, je vois aucune différence ?
Je recherche au cas par cas, mais c'est laborieux et souvent on en ressort pas plus avancé.

Y aurait-il quelqu’un qui pourrait me dire s'il y a moyen de trouver sur le net la fonction de toutes ces propriétés ?

Merci
 

Staple1600

XLDnaute Barbatruc
Re

@Chrige
Il faut lancer la macro test_I ou la macro test_II
Et l'userform doit avoir pour nom UserForm1 et les textbox TextBox1 et TextBox2
C'est juste un petit exemple (qui fonctionne chez moi - Excel 2013)

Et quand je dis que c'est à peaufiner, je ne dis pas qu'il te faille la peaufiner.
Je veux juste dire que cette macro peut-être améliorée (par celui* oui celle* qui en aura envie)

*: XLDnautes de passage dans ton fil.
 

Staple1600

XLDnaute Barbatruc
Re

Tu as marqué TexteBox1 dans ton message or c'est TextBox1
Tu as bien copié le code VBA dans un module standard ?

Sinon est-ce qu'une macro sous cette forme te parle plus?
VB:
Sub ListeControles_II()
Dim ctrl As MSForms.Control, frm As MSForms.UserForm, j&
j = 1
Set frm = UserForm1 'mettre le nom de l'userform à lister
For Each ctrl In frm.Controls
On Error Resume Next
Select Case TypeName(ctrl)
    Case "TextBox"
        Cells(j, 1) = TypeName(ctrl)
        Cells(j, 2) = ctrl.Name
        Cells(j, 3) = ctrl.BackStyle
        Cells(j, 4) = ctrl.BorderColor
        Cells(j, 5) = ctrl.BorderStyle
        Cells(j, 6) = ctrl.BackColor
        Cells(j, 7) = ctrl.Height
        Cells(j, 8) = ctrl.Width
        Cells(j, 9) = ctrl.Left
        Cells(j, 10) = ctrl.Top
        Cells(j, 11) = IIf(Len(ctrl.Tag) = 0, "Vide", ctrl.Tag)
        Cells(j, 12) = ctrl.MaxLength
        Cells(j, 13) = ctrl.Font.Name
        Cells(j, 14) = ctrl.ForeColor
        Cells(j, 15) = ctrl.Locked
    Case "ToggleButton"
        Cells(j, 1) = TypeName(ctrl)
        Cells(j, 2) = ctrl.Name
        Cells(j, 3) = ctrl.Value
    Case "OptionButton"
        Cells(j, 1) = TypeName(ctrl)
        Cells(j, 2) = ctrl.Name
        Cells(j, 3) = ctrl.Value
    Case "CheckBox"
        Cells(j, 1) = TypeName(ctrl)
        Cells(j, 2) = ctrl.Name
        Cells(j, 3) = ctrl.Value
    Case "ComboBox"
        Cells(j, 1) = TypeName(ctrl)
        Cells(j, 2) = ctrl.Name
        Cells(j, 3) = ctrl.Value
    Case "Label"
        Cells(j, 1) = TypeName(ctrl)
        Cells(j, 2) = ctrl.Name
        Cells(j, 3) = ctrl.Value
    Case "ListBox"
        Cells(j, 1) = TypeName(ctrl)
        Cells(j, 2) = ctrl.Name
        Cells(j, 3) = ctrl.Value
    Case "CommandButton"
        Cells(j, 1) = TypeName(ctrl)
        Cells(j, 2) = ctrl.Name
        Cells(j, 3) = ctrl.Value
End Select
j = Cells(Rows.Count, 1).End(3).Row + 1
Next ctrl
End Sub

NB: On reprends la discussion demain.
Il est l'heure pour moi d'aller dormir.
 

Si...

XLDnaute Barbatruc
Re

À toutes fins utiles

Pour m'y retrouver un peu, avec ma version, j'ai aussi la fenêtre Eplorateur d'objets
upload_2018-4-24_7-28-32.png


et bien sûr la fenêtre des Propriétés couplée avec la page de codes obtenue pour les écrire.
upload_2018-4-24_7-28-17.png


 

Chrige

XLDnaute Occasionnel
Bonsoir Stapple, Bonsoir Si, Bonsoir à tous

Si : C'est vrai que je pense pas assez souvent à la fenêtre Eplorateur d'objets

et bien sûr la fenêtre des Propriétés couplée avec la page de codes obtenue pour les écrire.
Là je ne vois pas bien ce que tu veux dire ??

Stapple:
Tu as marqué TexteBox1 dans ton message or c'est TextBox1
Tu as bien copié le code VBA dans un module standard ?

Oui j'avais bien copié le code dans un module standard
Et pour le "e" de trop, sans doute un peu de fatigue
J'ai bien essayé de trouver le problème, mais rien à faire, rien ne sort !

Mais par contre pour ta dernière macro
Là c'est super !! et çà fonctionne !

Un sacré boulot, Chapeau.

Là je vais pouvoir peaufiner !
Déjà en mettant une ligne de titre pour mentionner les propriétés, cela sera plus facile pour s'y retrouver....

Juste un problème de trouvé
Si on relance la macro, la liste des propriété vient se caler sous la dernière ligne inscrite
Mais on perd la 1ère ligne ???
La liste commence à TextBox2 au lieu de TextBox1

Je continue à tester.....
A+
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, le forum

Chrige
Ce n'était juste qu'une ébauche (rien de finalisé)
Puisque tu es en plein tests, j'attends tes retours (et ton code VBA) pour poursuivre ici.

EDITION: Je rajoute quand même une dernière petite macro
(qui selon comment tu la pratiques, tu renverras soit la ligne d'entêtes, soit ce qu'il faut ;))
Je te laisse chercher le pourquoi du comment
(cf un indice: suivre l'étoile)
VB:
Sub Lister()
Dim Ctrl As MSForms.Control, i&, usf, entetes
Cells.Clear
entetes = _
    Array("Type de Contrôle", "Nom Contrôle", "Height", "Left", "ControlTipText", "TabIndex", "TabStop", "Tag", "Top", "Visible", _
    "Width", "RowSource", "RowSourceType", "BoundValue", "[_GetID]", "[_GethWnd]", "InSelection", "Parent Name", "Cancel", "ControlSource", _
    "Default", "HelpContextID", "LayoutEffect", "Object", "Parent", "Accelerator", "Caption", "ForeColor", "BackColor")
[A1:AC1] = entetes: i = 1: usf = InputBox("Nom de l'userform?", "Liste propriétés", "Userform1")
Application.ScreenUpdating = False
On Error Resume Next
For Each Ctrl In ThisWorkbook.VBProject.VBComponents(CStr(usf)).Designer.Controls'*
i = i + 1
With Ctrl
Cells(i, 1) = TypeName(Ctrl): Cells(i, 2) = .Name: Cells(i, 3) = .Height: Cells(i, 4) = .Left: Cells(i, 5) = .ControlTipText
Cells(i, 6) = .TabIndex: Cells(i, 7) = .TabStop: Cells(i, 8) = .Tag: Cells(i, 9) = .Top: Cells(i, 10) = .Visible: Cells(i, 12) = .RowSource
Cells(i, 13) = .RowSourceType: Cells(i, 14) = .BoundValue: Cells(i, 15) = .[_GetID]: Cells(i, 16) = .[_GethWnd]: Cells(i, 17) = .InSelection
Cells(i, 18) = .Parent.Name: Cells(i, 19) = .Cancel: Cells(i, 20) = .ControlSource: Cells(i, 22) = .HelpContextID: Cells(i, 23) = .LayoutEffect
Cells(i, 24) = .Object: Cells(i, 25) = .Parent: Cells(i, 26) = .SpecialEffect: Cells(i, 27) = .Caption: Cells(i, 28) = .ForeColor: Cells(i, 29) = .BackColor
End With
Next Ctrl
'inspired by aalex_38 (091215)
End Sub
Bonne nuit et à plus tard.
 
Dernière édition:

Chrige

XLDnaute Occasionnel
Salut Stapple, Bonsoir à tous

Encore plus fort ! Et plus complet !

Pour l’autre version, au diable la ligne qui manquait lors d’un nouveau test, j’avais fait comme tu viens de le faire, l’effacement totale des cellules.
Car cela ne sert à rien de conserver les données d’un 1er test.

J’avais rentré à la main les noms des propriétés, puisqu’elles n’ont pas vocations à changer.
Mais là inutile de conserver cette ligne de noms, puisque tu as tout prévu dans ta nouvelle version.

J’avais entrepris de présenter les propriétés verticalement
Puisque verticalement on peut visualiser toutes les propriétés
Et que horizontalement on peut présenter un nombre suffisant de contrôles.
Donc de lecture plus facile, à mon sens.

Je pense que cela doit être possible ?
Je pensais même que cela devait être facile !
Mais je n’y suis pas arrivé !

Ta nouvelle version est mieux c’est indéniable.
Surement plus complexe dans son code. Donc plus difficile à assimiler pour moi.
Mais c’est comme cela que l’on progresse.

Pour la devinette, je ne suis pas sur d’avoir bien compris ??
Mais je vais chercher ….

A+
 

Chrige

XLDnaute Occasionnel
Bonsoir Stapple, Bonsoir à tous

Avec ta 1ère macro, pour 1 type de contrôle
J'ai trouvé cette solution pour affichage vertical

Code:
Sub ListeControles_Verticale()
Dim Ctrl As MSForms.Control, frm As MSForms.UserForm, j&
j = 1
Set frm = UserForm1 'mettre le nom de l'userform à lister
For Each Ctrl In frm.Controls
On Error Resume Next
Select Case TypeName(Ctrl)
    Case "TextBox"
        Cells(1, j) = TypeName(Ctrl)
        Cells(2, j) = Ctrl.Name
        Cells(3, j) = Ctrl.BackStyle

[code]Sub Lister_Vertical()
Dim Ctrl As MSForms.Control, i&, usf, entetes
Cells.Clear
entetes = _
    Array("Type de Contrôle", "Nom Contrôle", "Height", "Left", "ControlTipText", "TabIndex", "TabStop", "Tag", "Top", "Visible", _
    "Width", "RowSource", "RowSourceType", "BoundValue", "[_GetID]", "[_GethWnd]", "InSelection", "Parent Name", "Cancel", "ControlSource", _
    "Default", "HelpContextID", "LayoutEffect", "Object", "Parent", "Accelerator", "Caption", "ForeColor", "BackColor")
[A1:A29] = Application.Transpose(entetes): i = 1: usf = InputBox("Nom de l'userform?", "Liste propriétés", "Userform1")
Application.ScreenUpdating = False
On Error Resume Next
For Each Ctrl In ThisWorkbook.VBProject.VBComponents(CStr(usf)).Designer.Controls '*

Next Ctrl
'inspired by aalex_38 (091215)
End Sub


Pour la 2ème macro, pour les noms des propriétés
Pour un affichage vertical
J'ai fait cela :


Code:
Sub Lister_Vertical()
Dim Ctrl As MSForms.Control, i&, usf, entetes
Cells.Clear
entetes = _
    Array("Type de Contrôle", "Nom Contrôle", "Height", "Left", "ControlTipText", "TabIndex", "TabStop", "Tag", "Top", "Visible", _
    "Width", "RowSource", "RowSourceType", "BoundValue", "[_GetID]", "[_GethWnd]", "InSelection", "Parent Name", "Cancel", "ControlSource", _
    "Default", "HelpContextID", "LayoutEffect", "Object", "Parent", "Accelerator", "Caption", "ForeColor", "BackColor")
[A1:A29] = Application.Transpose(entetes): i = 1: usf = InputBox("Nom de l'userform?", "Liste propriétés", "Userform1")
Application.ScreenUpdating = False
On Error Resume Next
For Each Ctrl In ThisWorkbook.VBProject.VBComponents(CStr(usf)).Designer.Controls '*

Next Ctrl
'inspired by aalex_38 (091215)
End Sub


Il y surement mieux ??

A+
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, le forum

@Chrige
Je suppose que tu l'as ainsi rédigée ?
VB:
Sub Lister_Vertical()
Dim Ctrl As MSForms.Control, i&, usf, entetes
Cells.Clear
entetes = _
    Array("Type de Contrôle", "Nom Contrôle", "Height", "Left", "ControlTipText", "TabIndex", "TabStop", "Tag", "Top", "Visible", _
    "Width", "RowSource", "RowSourceType", "BoundValue", "[_GetID]", "[_GethWnd]", "InSelection", "Parent Name", "Cancel", "ControlSource", _
    "Default", "HelpContextID", "LayoutEffect", "Object", "Parent", "Accelerator", "Caption", "ForeColor", "BackColor")
[A1:A29] = Application.Transpose(entetes): i = 1: usf = InputBox("Nom de l'userform?", "Liste propriétés", "Userform1")
Application.ScreenUpdating = False
On Error Resume Next
For Each Ctrl In ThisWorkbook.VBProject.VBComponents(CStr(usf)).Designer.Controls '*
i = i + 1
    With Ctrl
        Cells(1, i) = TypeName(Ctrl): Cells(2, i) = .Name
        Cells(3, i) = .Height: Cells(4, i) = .Left
    'etc...
    End With
Next Ctrl
'inspired by aalex_38 (091215)
End Sub
Quand à savoir s'il y a "mieux" ou "différent", que les amateurs n'hésitent pas à se manifester dans le fil ;)
Si la macro telle que tu l'as modifiée/rédigée te satisfait, c'est le principal, non ? ;)
 

Staple1600

XLDnaute Barbatruc
Re

@Chrige
Quelle est ta version d'Excel ?
(On dirait bien que tu viens de rencontrer ce que j'évoquais plus bas ... devinette etc... ;))
Chez moi (Excel 2013), ça fonctionne.

NB: Pour être sûr que cela fonctionne, j'affiche d'abord l'userform dans VBE
Ensuite suite seulement je retourne dans le module et je lance la macro
 

Staple1600

XLDnaute Barbatruc
Re

@Chrige
Est-ce que cette version fonctionne mieux chez toi?
VB:
Sub Lister_Vertical_VIII()
Dim ctrl As MSForms.Control, i&, usf, entetes, frm As MSForms.UserForm, j&
Cells.Clear: Application.ScreenUpdating = False

'///////////////////////////////////////////////////////////
Set frm = UserForm1 'mettre le nom de l'userform à lister /
'/////////////////////////////////////////////////////////

entetes = _
    Array("Type de Contrôle", "Nom Contrôle", "Height", "Left", "ControlTipText", "TabIndex", "TabStop", "Tag", "Top", "Visible", _
    "Width", "RowSource", "RowSourceType", "BoundValue", "[_GetID]", "[_GethWnd]", "InSelection", "Parent Name", "Cancel", "ControlSource", _
    "Default", "HelpContextID", "LayoutEffect", "Object", "Parent", "Accelerator", "Caption", "ForeColor", "BackColor")
[A1:A29] = Application.Transpose(entetes): i = 1
On Error Resume Next
For Each ctrl In frm.Controls
i = i + 1
    With ctrl
        Cells(1, i) = TypeName(ctrl): Cells(2, i) = .Name: Cells(3, i) = Format(.Height, "0.00"): Cells(4, i) = .Left
        Cells(5, i) = .ControlTipText: Cells(6, i) = .TabIndex: Cells(7, i) = .TabStop: Cells(8, i) = IIf(Len(.Tag) = 0, "Tag vide", .Tag)
        Cells(9, i) = .Top: Cells(10, i) = .Visible: Cells(11, i) = .Width: Cells(12, i) = IIf(Len(.RowSource) = 0, "Pas de RowSource", .RowSource)
    'etc...
    End With
Next ctrl
Range("A1").CurrentRegion.Columns.AutoFit
End Sub
 

Chrige

XLDnaute Occasionnel
Je suis sous 2007, Et oui! un peu en retard! :rolleyes:

Mois je lance la macro directement à partir de la feuille Excel

Mais vu que d'après ce que tu venais de me dire, que j'étais dans la bonne méthode.
J'ai réécris ma macro sous Notepad++
Avec ces codes à rallonges, on y vois rien sous VBE
Tu avais oublié une propriété (Width), ce n'étais surement pas là le problème
J'avais du faire une erreur, car maintenant cela fonctionne parfaitement.

Heureusement que tu as posté ton message
Car je serais encore de chercher une erreur de code, alors que c'était juste une erreur de frappe!

Maintenant je vais pouvoir PAUFINERo_O la présentation.

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 198
Messages
2 086 151
Membres
103 133
dernier inscrit
mtq