Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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.

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 Barbatruc
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é


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

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 Barbatruc
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




 

Pièces jointes

  • ModuleDeClasse_Heritage (VBA Commenté).xlsm
    18.8 KB · Affichages: 15
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 Barbatruc
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 Barbatruc
Bonjour @Dranreb
Comment cela fonctionne ?
Comment corriger le code pour que cela fonctionne ?
 

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 Barbatruc
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: 5

Dranreb

XLDnaute Barbatruc
Je crois qu'une autre classe n'est pas adaptée au besoin du demandeur.
En revanche peut être une propriété supplémentaire du SupportCkx donnant le numéro de ligne dans le tableau source pourrait être utile.
 

laurent950

XLDnaute Barbatruc
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)



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 Barbatruc
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
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…