XL 2019 Afficher les noms des checkbox sélectionné dans une listbox

Tipeu

XLDnaute Nouveau
Bonjour a tous,

Je suis a la recherche d'une solution pour générer le nom de mes checkbox sélectionnés dans une liste box visible a coté en direct.
Photo ci dessous : pour la démonstration j'ai cliqué sur ma checkbox nommé 1A j'aurais voulu que son nom apparaisse dans la listbox et si possible d'y rajouter un complément de phrase.
1595511586118.png

Merci de votre aide, un jeune padawan qui a envie d'apprendre mais bloque un peu tout seul malgrés toutes les aides dispo sur le web.
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Vous associez deux mots qui n'ont à priori pas de rapport.
Un handle est un identifiant vers une zone de mémoire allouée généralement dynamiquement par Windows à la demande d'un programme. Mais difficile de savoir si c'est réellement juste un indice ou carrément une adresse vers quelque chose. Bonjour les soucis pour ceux qui passent en 64bits.
Les Property, en VBA sont des sortes de procédure au même titre que les Sub et les Function. Le mot est suivi de Get, Let ou Set pour préciser comment on veut qu'elle fonctionne. La Get fonctionne exactement comme une Function. La seule différence est qu'on a le droit d'écrire aussi une Property Let ou Set portant le même nom. La Property Let peut se voir affecter une expression spécifiée derrière un signe '='. Elle est muni pour cela d'un faux dernier paramètre formel indiquant la valeur à affecter. La Property Set, c'est pareil sauf qu'elle s'invoque par un Set devant, et garantit que ce ne sera pas une propriété par défaut de l'objet affecté qui sera considérée, mais bien l'objet lui même.
 

laurent950

XLDnaute Accro
Bonjour @Dranreb

Point A )
Ma question était posé par rapport au logiciel AUTOCAD :
Il y a pour un Objet de Propriété pour un Objet.
Exemple pour dessiné une polyligne sur un dessin DAO 2D avec Autocad
Une fois cette multiligne dessiné sur l'espace de dessin Autocad
Cette objet à 2 identifiants dit Unique (avec le choix dans ces propriétés.
Soit : l'objet c'est la polyligne
object.Handle
An object ID and a unique handle are the two ways of referencing an object. A handle is persistent (stays the same) in a drawing for the lifetime of the object.
Ou
object.ObjectID
An object ID and a unique handle are both ways of referencing an object.
In general, use a handle unless you plan to work with certain ObjectARX functions that require an object ID.
Je connais pas la différence ?

********************************************************************************************************

Point B )
votre exemple que vous avez joint

WithEvents en liens avec Event
2 Modules de Classes :
CkxCollect et SupportCkx
c'est astucieux cette méthode dans votre classe SupportCkx :
Private Parent As CkxCollect
Public Sub Init(ByVal It As CkxCollect, ByVal Ctl As MSForms.CheckBox, ByVal Caption As String)
Set Parent = It
Depuis la classe SupportCkx vous recupérer toute la classe CkxCollect (Avec Parent)
C'est vraiment bien pensé

1606769084302.png

Je ne maîtrise pas encore vraiment (Tous combiné et refaire votre code sans exemple, même avec exemple c'est dur !

********************************************************************************************************

Point C )
Ce qui me ramène au point C
J'ai donc fait l'exercice de corrigé le code de cette personne qui est la suite d'une partie du code qu'il à assemblé en se servant de l'aide du Forum.

Je pense que j'ai bricolé par rapport à vous, mais j'aimerais savoir mes erreurs pour les comprendre si vous acceptez de regarder et corrigé :

Le sujet du Fils
https://www.excel-downloads.com/thr...r-les-valeurs-de-chaque-case-cocher.20048866/

Le résultat a obtenir et dans l'Userform
dans la procedure : Private Sub ToggleButton7_Click()

La correction :
VB:
' Boucle sur les resultats pour test
    Dim i As Integer
    Dim Tresultat() As Variant
    Tresultat = CkxCln.TAcadCircleRes
    For i = LBound(Tresultat, 1) To UBound(Tresultat, 1)
        If Tresultat(i, 6) <> Empty Then
        Debug.Print "Centre x : " & Tresultat(i, 3) & " Centre x : " & Tresultat(i, 4) & " Code : " & Tresultat(i, 5)
        CC(0) = Tresultat(i, 3): CC(1) = Tresultat(i, 4)
        End If
    Next i

J'ai créer une variable tableau dans le module de classe !
CkxCollect (Module de Classe)
Private TabCircle() As Variant
Mais je voulais en créer une collection comme avez fait pour initialisé l'userform
CkxCln.Add "1A", 21.961525, 259.807625

L'dée etait de créer une collection dans la classe CkxCollect (Module de Classe)
Comme vous avez fait pour initialisé l'userform
soit récupérer les positions
1606770058773.png

Centre X et Centre Y pour 1 A
CkxCln.CentreXY String, Double, Double ' String = 1A / Double = -120 / Double = -207.8461
Mais je n'ai pas su ajouter une nouvelle collection !
Je suis passé par une variable Tableau
C'est possible d'ajouter une Nouvelle collection pour c'est nouvelle valeurs !
Comme votre exemple ?
VB:
Public Sub [COLOR=rgb(184, 49, 47)][B]Add[/B][/COLOR](ByVal Nom As String, x As Double, ByVal Y As Double)
Dim SocleCkx As SupportCkx
Dim Ctl As MSForms.Control
    Set SocleCkx = New SupportCkx
    Set Ctl = Cts.Add("Forms.CheckBox.1")
        SocleCkx.Init Me, Ctl, Nom
        Cln.Add SocleCkx, Nom
        Ctl.Left = x: Ctl.Top = Y
End Sub

Je ne suis pas arrivé a créer une nouvelle collection !
Public Sub CentreXY (ByVal Nom As String, x As Double, ByVal Y As Double)

Je suis bloqué lorsque je suis dans une classe pour récupérer l'intégralité d'une autre comme je vous ai expliqué en point B

je vous remercie @Dranreb j'ai beaucoup appris avec votre aide et j'applique vos conseilles, c'est une autres partie que je doit encore apprendre si vous acceptez de me corrigé sur ses nouvelles méthodes que je suis entrains d'apprendre

Merci @Dranreb
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Je ne peux guère répondre pour Autocad, n'ayant pas ce logiciel ni donc la bibale pour l'utiliser en VBA.
J'utilise le préfixe Ckx exclusivement pour les CheckBox ! (Parce que CBx est déjà pris pour les ComboBox). Je ne comprends pas ce que vous vous expliquez par 'récupérer l'intégralité d'une autre classe'. Vous savez, une variable objet c'est juste un pointeur vers son exemplaire, rien d'autre. J'en ai seulement besoin pour exécuter la MéthodeRéservéeÀSupportCkx de celui ci en réaction à un clic sur la CheckBox.
 

laurent950

XLDnaute Accro
Merci @Dranred
C'est un peux comme le principe de l’héritage entre classe (Mais cela n'existe pas en VBA) vous m'avez déjà expliqué
J'ai fait l'exemple (qui fonctionne pas) mais j'ai tous commenté
Pour un exemple très simple
1606784693312.png


1606784839272.png


1606785007544.png
 

Pièces jointes

  • ModuleDeClasse_Heritage (VBA Commenté).xlsm
    18.8 KB · Affichages: 14
Dernière édition:

Dranreb

XLDnaute Barbatruc
Je ne sais pas trop où vous voulez en venir.
Mais faites en sorte qu'un module de classe soit le plus autonome possible. Il ne faudrait pas intervenir dedans à partir d'un code externe. Il faut l'équiper de méthodes simples vues de l'extérieur, surtout pour la partie utilisatrice, et c'est à lui de se débrouiller pour s'organiser comme il faut. En dehors de ses propriétés et méthodes, on ne devrait plus avoir à penser à la programmation d'un module de classe quand on n'est plus dedans.
 

laurent950

XLDnaute Accro
Merci @Dranreb

En Poste #19 (J'ai refait tous le code)
J'arrive a récupérer les propriété d'une classe depuis une autre
.
Lorsque je met le Point après l'objet (J'ai toutes les propriété d'une autre classe)
Mais lorsque je lance la commande (Il y a un bug)
Je pense que c'est les déclaration de variable (Public et Privé)

J'ai fais des copie décans.

C'est possible de corrigé cela (Le but et de récupérer toutes les propriété d'une autre classe)

Un grand merci pour vos conseille et votre aide @Dranreb
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour
Si l'exemplaire de ModClassB n'est pas créé pas le ModClasseA, il n'a pas à le connaitre en tant que parent. Vous n'aviez pas assimilé le principe de la méthode Add de mon CkxCollect, qui crée un SupportCkx puis l'initialise par sa méthode Init en s'y spécifiant comme parent au 1er argument. Le nom It (lui) n'a pas été choisi au hasard, c'est le pendant de Me (moi) dans l'autre.
 

laurent950

XLDnaute Accro
Bonjour @Dranreb
Comment cela fonctionne ?
Comment corriger le code pour que cela fonctionne ?
* Qu'elle sont les étapes à suivre en ModClasseA : Pour
* Comment cela s'écrit dans le code du ModClasseA ?
- Si l'exemplaire de ModClassB n'est pas créé par le ModClasseA

* La méthode Add de mon (CkxCollect = C'est votreModule de Classe) et (SupportCkx = un Objet)
* Comment cela s'articule (s'écrit et se code) !
- le principe de la méthode Add de mon CkxCollect, qui crée un SupportCkx

* A qu'elle endroit faire cette initialisation ?
* Comment les lignes de codes s'écrivent ? surtout pour parent au 1er argument.
- puis l'initialise par sa méthode Init en s'y spécifiant comme parent au 1er argument.

* It est un (Mots reservé pour VBA "au même titre que For/Each/Worksheet/ Ect.)
* Me (C'est un Mot reservé je sais = est votre principe (Me = Le module de Classe ?)
- Le nom It (lui) n'a pas été choisi au hasard, c'est le pendant de Me (moi) dans l'autre.
 

Dranreb

XLDnaute Barbatruc
Je ne sais pas. Comme ça, là, maintenant, je ne crois pas qu'il faille gérer autre chose que les CheckBox par des modules de classe. Il ne me semble pas qu'il faille d'autre support aux informations de base que le tableau en A1:E43 du classeur du demandeur. Même les positions des CheckBox sont données par
Left = 51,961525 + CentreX / 4 et Top = 207,8461 - CentreY / 4.
Ce que je ne comprend juste pas c'est pourquoi il n'y a pas une colonne diamètre aussi (voire plusieurs, j'ai vu quelque part une histoire de cercles concentriques).
Ni pourquoi il fait si compliqué avec un Multipage.
Je crois qu'il faudrait juste un Userform de mise à jour de ce tableau, et faire le traçage dans une procédure indépendante. Après tout on saurait que le trou n'est pas à tracer si les diamètres sont à 0, non ?
 
Dernière édition:

laurent950

XLDnaute Accro
re @Dranred
En Réponse au Poste #22
Suivant vos conseilles en Poste #22 la Procédure Fonctionne.
Je Poste le fichier
Vous me dite si vous êtes d'accord sur le Principe et si j'ai compris !
D'une classe vers une autres.

Je regarde votre Poste #24
et je vous répond
 

Pièces jointes

  • ModuleDeClasse_Heritage (VBA Commente avec Exemple).xlsm
    27.1 KB · Affichages: 4

laurent950

XLDnaute Accro
Re @Dranreb
En Réponse au Poste #24
Je ne sais pas. Comme ça, là, maintenant, je ne crois pas qu'il faille gérer autre chose que les CheckBox par des modules de classe.

Il ne me semble pas qu'il faille d'autre support aux informations de base que le tableau en A1:E43 du classeur du demandeur. (J'ai utilisé une variable tableau dans le module de classe)

Même les positions des CheckBox sont données par :
- Left = 51,961525 + CentreX / 4 et Top = 207,8461 - CentreY / 4.

Ce que je ne comprend juste pas c'est pourquoi il n'y a pas une colonne diamètre aussi (voire plusieurs, j'ai vu quelque part une histoire de cercles concentriques).
C'est en relation avec Autocad donc :
Pour dessiner un cercle :
VB:
Sub Example_AddCircle()
    ' This example creates a circle in model space.
    Dim circleObj As AcadCircle
    Dim centerPoint(0 To 2) As Double
    Dim radius As Double
    ' Define the circle
    centerPoint(0) = 0#: centerPoint(1) = 0#: centerPoint(2) = 0#
    radius = 5#
    ' Create the Circle object in model space
    Set circleObj = ThisDrawing.ModelSpace.AddCircle(centerPoint, radius)
    ZoomAll
End Sub
Ni pourquoi il fait si compliqué avec un Multipage (Je suis d'accord avec vous)
Je crois qu'il faudrait juste un Userform de mise à jour de ce tableau (C'est quoi l'idée je ne vois pas ?),
et faire le traçage dans une procédure indépendante (Le tracage se fait depuis Autocad
Avec l'object AcadCircle)

1606831705568.png


Après tout on saurait que le trou n'est pas à tracer si les diamètres sont à 0, non ? (C'est avec les Methodes, Propriétes de la classe Circle de l'objet Autocad)
 

Dranreb

XLDnaute Barbatruc
Bref, ce qui manque c'est un dialogue essentiellement basé sur la plage A1:E43, qu'il conviendrait d'ailleurs de mettre sous forme de tableau.
Je ne pourrais jamais tester l'UserForm si les instructions qui dialoguent avec Autocad sont dedans.
 

laurent950

XLDnaute Accro
Re @Dranreb
Je suis d'accord en Poste #29

Pour mon fichier avec l'exemple en Poste #25 (J'ai Compris se que vous m'avez expliqué en Poste #22 ?)

J'ai pas compris cela :
la méthode Add de mon CkxCollect, qui crée un SupportCkx puis l'initialise par sa méthode Init en s'y spécifiant comme parent au 1er argument
 

Statistiques des forums

Discussions
312 305
Messages
2 087 084
Membres
103 461
dernier inscrit
dams94