IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Discussion :

Remplacer un évènement CheckBox_MouseMove pour 10 CheckBox par une Classe Evènementielle unique


Sujet :

VBA

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2018
    Messages : 12
    Points : 17
    Points
    17
    Par défaut Remplacer un évènement CheckBox_MouseMove pour 10 CheckBox par une Classe Evènementielle unique
    Bonjour,

    Pour commencer, merci pour ce forum qui ma permis de bien évoluer dans le monde du vba.

    Ce que je veut faire: j'aimerai réduire ce code ci dessous pour une meilleure lecture.
    ce code est intégré dans un UserForm nomé "DonnéesDuGrain"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
         'Texte information pour les CheckBox1 à CheckBox10
        Private Sub CheckBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
            Ma_Fonction (1)
        End Sub
        Private Sub CheckBox2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
            Ma_Fonction (2)
        End Sub
        Private Sub CheckBox3_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
            Ma_Fonction (3)
        End Sub
        Private Sub CheckBox4_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
            Ma_Fonction (4)
        End Sub
        Private Sub CheckBox5_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
            Ma_Fonction (5)
        End Sub
        Private Sub CheckBox6_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
            Ma_Fonction (6)
        End Sub
        Private Sub CheckBox7_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
            Ma_Fonction (7)
        End Sub
        Private Sub CheckBox8_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
            Ma_Fonction (8)
        End Sub
        Private Sub CheckBox9_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
            Ma_Fonction (9)
        End Sub
        Private Sub CheckBox10_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
            Ma_Fonction (10)
        End Sub
     
    Function Ma_Fonction(I As Integer)
        ' déclaration des variables
        Dim oCtrl As Control
        Dim Label_Name As String
        'charger les variable objects
        Set oCtrl = DonnéesDuGrain.Controls("Label" & I)
     
            Label_Name = oCtrl.Name
            DonnéesDuGrain.Label15.Caption = "Veillez cocher si besoin" 'Text qui s'affiche dans le label15
     
        'décharger les variables object
        Set oCtrl = Nothing
    End Function
    Idée en cour de construction: Je part sur l'idée de créer une classe événementielle dans ce délire là.
    Ma classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Explicit
     
    Public WithEvents Aide As MSForms.CheckBox
     
    Private Sub Aide_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        DonnéesDuGrain.Label15.Caption = "Veillez cocher si besoin" 'par exemple
    End Sub
    Pour m'aider dans ma tache, j'utilise ce lien: https://fauconnier.developpez.com/ar...eral/classes/#

    1) Est-il possible de le remplacer par une classe Event? et comment dois-je mis prendre?
    J'ai du mal a comprendre pour faire le lien entre le code module et la classe. Et comment je pourrais déclencher le code a chaque passages sur un CheckBox?
    2) Sinon, est-il possible de le réduire d'une autre façon?

    Merci de votre aide
    Voila un capture écran
    Nom : Capture écran.jpg
Affichages : 280
Taille : 80,2 Ko

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 949
    Points
    55 949
    Billets dans le blog
    131
    Par défaut
    Salut.

    Crée une classe perso que tu nommes par exemple cCheckBox. Cette classe te permettra de gérer les évènements du contrôle que tu lui passeras grâce à la propriété autoimplémentée chk. Dans cette classe, tu places le code suivant (en adaptant évidemment le code de chk_Click selon tes besoins:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Option Explicit
     
    Public WithEvents chk As MSForms.CheckBox
     
     
    Private Sub chk_Click()
      MsgBox chk.Name
    End Sub
    Dans ton userform, tu vas avoir besoin d'une collection privée au userform que tu déclareras en début de module de ton usf. A l'initialisation, tu parcours tes contrôles et si c'est un checkbox, tu crées un nouvel objet cCheckBox, tu lui passes le contrôle et tu ajoutes cet objet perso à la collection.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Option Explicit
     
    Dim Checkboxes As Collection
     
    Private Sub UserForm_Initialize()
      Dim chk As MSForms.Control
      Dim cChk As cCheckBox
     
      Set Checkboxes = New Collection
      For Each chk In Me.Controls
        If TypeName(chk) = "CheckBox" Then
          Set cChk = New cCheckBox
          Set cChk.chk = chk
          Checkboxes.Add cChk
        End If
      Next
    End Sub
    Il y a d'autres techniques, comme de sortir la collection du userform, qui demandent moins de code dans l'initialize, mais celle que je te propose, assez minimaliste, est simple à comprendre et à mettre en place.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour
    il y a cette methode aussi tout se passe dans la classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Option Explicit
    Public WithEvents checkB As MSForms.CheckBox
    Dim cls() As New cCheckBox
    Public usf As Object
    Function initiate(uf As Object)
        Dim ctrl As Object, i As Long
        For Each ctrl In uf.Controls
            If TypeName(ctrl) = "CheckBox" Then i = i + 1: ReDim Preserve cls(0 To i): Set cls(i).checkB = ctrl: Set cls(i).usf = uf
        Next
    End Function
    'evenement de substitution 
    Private Sub CheckB_Click()
        If usf.ActiveControl.Name = checkB.Name Then
            MsgBox checkB.Name
        End If
    End Sub
    dans le userform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim cl As New cCheckBox
    Private Sub UserForm_Activate()
    cl.initiate Me
    End Sub
    remarque le test sur le activecontrol dans l'evenement
    il est la pour eviter qu'il soit declanché lors de changement du .value d'un des checkboxs par code
    en effet le changement par code declenche l'evenement "click"

    un dernier conseil classe toujours ton userform dans les instances de classe avec le checkbox on peut toujours avoir besoins d'un acces a l'object userform comme c'est le cas avec mon test activecontrol

    la encore JE PRECISE !!! le userform en tant qu'object "As Object" pas en tant qu'userform "As UserForm"
    car en tant qu'object on a acces a ses propriété et collection d'enfant(les controls),tandis qu'en tant que userform non

    pour le classer en tant qu'userform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public WithEvents usf As UserForm
    le reste du code ne change pas
    tu peux tres bien le classer des deux facons si tu veux sous une variable differente usfU et usfO par exemple comme ca tu peux gerer ses evenements et propertie et controls
    je pense avoir tout dis
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2018
    Messages : 12
    Points : 17
    Points
    17
    Par défaut
    Merci Pierre Fauconnier et patricktoulon, je essayer de comprendre et tester vos 2 solutions.
    Certain mots techniques m'échappe, je vais sortir le dico

    si besoin je reviendrais pour de l'aide ou clôturer la discussion

  5. #5
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2018
    Messages : 12
    Points : 17
    Points
    17
    Par défaut
    Re

    alors j'ai pris la technique de Pierre Fauconnier plus simple a assimiler vue mon niveau.

    J'ai juste modifier la classe car je voulais le déclancher avec un passage de sourie
    donc sa c'est le module classe qui porte le nom de ClassAide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Explicit
     
    Public WithEvents cAide As MSForms.CheckBox
     
    Private Sub cAide_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        DonnéesDuGrain.Label15.Caption = "Veillez cocher si besoin" 'par exemple
    End Sub
    Ici c'est le module Init de L'UserForm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    '**********************************************************************
    '   Init de l'UserForm "DonnéesDuGrain"
    '**********************************************************************
     
    Public Sub UserForm_Initialize()
     
    Dim cAide As MSForms.Control
    Dim cChk As ClassAide ' créer un nouvel object pour la classe
     
    '________________________________________________________________________
    'A l'initialisation, parcours des contrôles pour rechercher les checkbox,
    'crées un nouvel objet ClassAide, tu lui passes le contrôle et tu
    'ajoutes cet objet perso à la collection.
     
    Set Checkboxes = New Collection
      For Each cAide In Me.Controls
        If TypeName(cAide) = "CheckBox" Then
           ' Charger l'objet dans la classe
          Set cChk = New ClassAide
          Set cChk.cAide = cAide
          Checkboxes.Add cChk
        End If
      Next
     
    End Sub
    Voila, tout fonctionne bien.
    Je vais faire quelle recherche pour développer mon langage vba pour mieux comprendre le cycle de ses 2 codes.
    Merci a vous deux

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    je viens de tester chez moi ca ne fonctionne pas
    de plus un truc me gene dans ta classe
    c'est le nom du userform en dur dans le code


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DonnéesDuGrain.Label15.........
    dans une classe controls c'est pas top

    chez moi j'ai testé ca qui ne fonctionne pas non plus , tu veux bien tester chez toi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    '**********************************************************************
    '   Init de l'UserForm "DonnéesDuGrain"
    '**********************************************************************
     
    Private Sub UserForm_Activate()
     
    Dim cAide As MSForms.Control
    Dim cChk As ClassAide ' créer un nouvel object pour la classe
     
    '________________________________________________________________________
    'A l'initialisation, parcours des contrôles pour rechercher les checkbox,
    'crées un nouvel objet ClassAide, tu lui passes le contrôle et tu
    'ajoutes cet objet perso à la collection.
     
    Set CheckBoxes = New Collection
      For Each cAide In Me.Controls
        If TypeName(cAide) = "CheckBox" Then
           ' Charger l'objet dans la classe
          Set cChk = New ClassAide
          Set cChk.CheckB = cAide
          Set cChk.usf = Me
          CheckBoxes.Add cChk
        End If
      Next
     
    End Sub
    module classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Explicit
     
    Public WithEvents CheckB As MSForms.CheckBox
    Public usf As Object
    Private Sub CheckB_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
            usf.Label15.Caption = "Veillez cocher si besoin" 'par exemple
    End Sub
    apres test plus poussés seul le dernier checkbox est classé j'avoue ne pas saisir


    edit: ca y est j'ai pigé c'etait sous mon nez
    en fait tu n'a pas dimer la collection et il faut la dimer en dehor de la sub au debut sinon les instances de la collection sont perdues en dehors du initialyse !!!!!!!!!!!!!!!!!!!!!!

    conclusion ton code ne peut pas fonctionner

    donc
    le userform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    '**********************************************************************
    '   Init de l'UserForm "DonnéesDuGrain"
    '**********************************************************************
    'Dimer l 'object collection en dehors de la sub IMPORTANT !!!!!!!!!!!!!!!!!
    Dim CheckBoxes As Collection
    Private Sub UserForm_Initialize()
    '________________________________________________________________________
    'A l'initialisation, parcours des contrôles pour rechercher les checkbox,
    'crées un nouvel objet ClassAide, tu lui passes le contrôle et tu
    'ajoutes cet objet perso à la collection.
        Dim ctrl As Object
        Dim cChk As ClassAide    ' créer un nouvel object pour la classe
        Set CheckBoxes = New Collection
        For Each ctrl In Me.Controls
            If TypeName(ctrl) = "CheckBox" Then
                ' Charger l'objet dans la classe
                Set cChk = New ClassAide
                Set cChk.CheckB = ctrl
                Set cChk.usf = Me
                CheckBoxes.Add cChk
            End If
        Next
    End Sub
    la classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Explicit
     
    Public WithEvents CheckB As MSForms.CheckBox
    Public usf As Object
    Private Sub CheckB_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        usf.Label15.Caption = CheckB.Name & " Veillez le cocher si besoin" 'par exemple
    End Sub
    la ca fonctionne et le userform n'est pas en dur dans le code
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 949
    Points
    55 949
    Billets dans le blog
    131
    Par défaut
    Salut.

    Le code que j'ai fourni fonctionne et la collection est déclarée dans le userform. Dans le code fourni par ZTeddy, je ne vois pas cette ligne de déclaration, mais je suppose qu'elle est plus haut dans le code du userform (qui n'est pas retranscrit au complet dans son message), car ça ne saurait pas fonctionner sans la ligne de déclaration .

    De plus, ma classe n'utilise pas le userform (celle de ZTeddy non plus), donc il n'est pas question qu'il y soit hardcodé. Du coup, Patrick, je ne comprends pas bien d'où tu sors ce code en le présentant comme celui de ZTeddy, et du coup, je ne comprends pas bien ta dernière intervention?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 949
    Points
    55 949
    Billets dans le blog
    131
    Par défaut
    Salut Patrick,

    Plutôt que de déclarer ton usf As Object, déclare-le As Msforms.Userform, tu auras accès à ses méthodes et propriétés et également à la saisie semi-automatique.

    Si on veut désactiver l'évènement de la classe lorsque le contrôle est modifié autrement que par son évènement propre (ce que propose ta solution) et que l'on valorise les contrôles dans l'évènement Initialize du userform, il est impératif que cette valorisation soit effectuée avant l'alimentation de la classe, car il n'y a pas d'ActiveControl lors de l'initialisation du userform. Le userform n'est en effet actif qu'après chargement, et donc ses contrôles aussi.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    Bonjour pierre
    ma derniere intervention et due au fait que copier coller son code n'a pas fonctionné il manquait la declaration de la collection en haut de module userform je l'ai pas vu tout de suite

    ensuite comme je l'ai dit le nom de l'userform en DUR !! dans le code de la classe c'est pas top!! Autant variabliliser celui ci aussi et avoir une classe generique ,ca coute rien et ca prend une variable en plus c'est tout

    son evenement avec le nom Userform en dur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Explicit
     
    Public WithEvents cAide As MSForms.CheckBox
     
    Private Sub cAide_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        DonnéesDuGrain.Label15.Caption = "Veillez cocher si besoin" 'par exemple
    End Sub
    pour quoi?
    comme je l'ai dit pour ma version je recommande fortement de classer le parent Userform dans la classe surtout avec des checkboxs ou optionbutton
    ca n'a pas grand interet visiblement dans cet exemple avec l'evenement mousemove mais pour le click
    ca represente une variable object en plus mais pour une intervention dans l'evenement( in classe ) il est necessaire

    ca n'est pas ton code ni ta methode que j'ai remis en cause

    une derniere chose la variable Caide userform/classe identique me genait un peu
    pourquoi?
    par ce que dans le userform Caide est n'importe quel controls dans la boucle dans la classe ce sont des checkboxs
    c'est pour ca que je l'ai changée en ctrl

    tu trouvera peu etre que c'est chipoter mais perso je pense que c'est mieux pour ne pas confondre object (All) et un control de type bien determiné
    dans un code avec un peu plus de ligne ca peu faire la différence en terme de lecture

    et en reponse a ton post 8 concernant l'etat acif ou pas j' ai donné mon code dans le initialyse mais en genéral je le fait dans le activate du userform

    d'autant plus que :
    avec l'userform variabilisé et la classification dans le activate le meme code sans absolument rien changer peut servir a d'autre userform dans le meme classeur

    tu me diras ce que tu en pense
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #10
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 949
    Points
    55 949
    Billets dans le blog
    131
    Par défaut
    Salut Patrick,

    Oui, désolé. Tu as raison. Je n'avais pas fait attention à DonnéesDuGrain... (nom du userform) dans le code de ZTeddy. Mais c'est ok, bien sûr, pour variabiliser le userform comme tu le fais dans ton code
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    une derniere chose Pierre ca me parait important de le preciser

    Plutôt que de déclarer ton usf As Object, déclare-le As Msforms.Userform, tu auras accès à ses méthodes et propriétés et également à la saisie semi-automatique.
    je repond non non!!
    dans les modules classe selon comment est classé l'userform tu n'a pas acces a tout !!!

    un exemple simple vite fait
    code userform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim cl As New ClasseUF
    Private Sub UserForm_Activate()
    Set cl.usfU = Me
    Set cl.usfO = Me
    End Sub
    code classeUF
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public WithEvents usfU As UserForm
    Public usfO As Object
    Private Sub usfU_Click()
    'MsgBox usfU.Width'erreur 438 propriété ou methode  non gérée par cet object"
    MsgBox usfO.Width' ca fonctionne 
    End Sub
    debloque le message usfU et bloque le message usfO et teste

    c'est bien pour ca que j'ai insisté sur ce point "as object" dans ma premiere intervention
    dans l'apel (argument) je laisse "as object" et je le declare des deux facon dans la classe

    perso je le classe toujours comme ca des deux facons meme avec ma methode intra classe comme ca j'ai vraiment acces à tout (properties/evenement /controls(child))

    tu vois c'est pas du hardcodage mais bien necessaire
    voila ce que ca coute
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  12. #12
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 949
    Points
    55 949
    Billets dans le blog
    131
    Par défaut
    Ah oui. Je n'avais jamais vraiment fait attention à cela. Merci
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut de
    re
    de rien Pierre
    peut etre un paragraphe en plus dans ton tuto de classe personalisé, je sais plus si tu a abordé les classe controls
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Points : 350
    Points
    350
    Par défaut quel problème est résolu ?
    Salut

    Problème présenté : «J'ai juste modifié la classe car je voulais le déclencher avec un passage de souris»

    Cet évènement n'est pas prévu initialement dans la Classe du contrôle CheckBox.

    On peut le provoquer, simplement, en passant par la propriété "ControlTipText".

    Le Module de Classe est intéressant, ici, pour un évènement "Click" ou "Change".

    Préférant coller le plus simplement à la situation décrite au départ, je verrais bien, pour 10 cases à cocher (nommées C1, C2 … C10 *) dans un formulaire, écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    'Fenêtre Usf
    Dim Ct, n As Byte, Ch(9) As New Ch
    Private Sub UserForm_Initialize()
      Ct = Array("utiliser", "mettre", "prendre", "éviter", "affronter", "adopter", "joindre", "montrer", "ajouter", "refuser")
      For n = 0 To 9
        Me("C" & n).ControlTipText = "à " & Ct(n) & " ?"           'pour le survol
        Set Ch(n).Ch = Me("C" & n)                                 'pour l'action en module
       Next
    End Sub
    'Fenêtre Module de classe
    Public WithEvents Ch As MSForms.CheckBox
    Private Sub Ch_Change()
       If Ch Then
         If MsgBox("confirmer " & Ch.Caption & "?", 36, "Attention...") = 6 Then Exit Sub
         Ch = 0
       End If
    End Sub
    * j'attache plus d'importance à la préparation du projet (10 cases) qu'à la recherche de méthodes syntaxiques qui se veulent universelles. Ici, peu importe qu'il y ait d'autres contrôles. Ceux-ci seront pris en charge en fonction de leur présence.
    Il est quand même plus facile de travailler avec des objets bien nommés, non ?

    remarque plus générale : je ne vois pas souvent la recommandation de la présence constante de la Fenêtre des propriétés alors qu'elle permet d'initialiser les objets en sachant celles qui seront à programmer ou pas.
    Fichiers attachés Fichiers attachés

  15. #15
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 949
    Points
    55 949
    Billets dans le blog
    131
    Par défaut
    @ Patrick

    Citation Envoyé par Pierre Fauconnier Voir le message
    Ah oui. Je n'avais jamais vraiment fait attention à cela. Merci


    Cela étant dit, je préfère tout de même typer le usf en userform, car la responsablité de cette classe n'est pas de redimensionner le userform, mais de gérer des évènements de contrôles de façon +/- générique. Dans cette vision limitée à une responsabilité précise de la classe, ne pas disposer de toutes les propriétés et méthodes du usf n'est pas pénalisant
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  16. #16
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 949
    Points
    55 949
    Billets dans le blog
    131
    Par défaut
    Salut OrDonc

    Citation Envoyé par OrDonc Voir le message
    [...]
    Personnellement, je ne partage pas ton avis, pour différentes raisons.

    Je n'appelle pas "bien nommés" des checkboxes appelés C1, C2, etc... . Le fait de ne pas travailler en générique t'impose de modifier du code "un peu partout" lors de l'ajout ou le retrait de contrôles du userform, ce qui rend l'ensemble du code assez peu réutilisable. je ne suis pas convaincu qu'il est moins coûteux en termes de temps de créer du code pour alimenter les infobulles que de le faire à la main dans la fenêtre des propriétés. Pour la remarque concernant la fenêtre des propriétés, elle est toujours activée sur mon écran, c'est peut-être pour cela que je ne pense pas à préciser qu'il est important de l'afficher.

    D'une façon générale, j'essaie de programmer de façon générique et réutilisable, histoire de gagner du temps, et donc de l'argent. J'aime d'ailleurs mieux la solution de Patrick du "tout dans la classe" (sauf que je préfère travailler avec une collection qu'un tableau redimensionné, question très personnelle) que ma solution proposée lors de mon premier message (qui allait au plus simple), car cela factorise le code au niveau de la classe si elle doit être réutilisée ailleurs, car on limite le code à une déclaration dans le userform et une ligne d'appel dans l'Initialize, le reste étant déjà écrit, quel que soit le nombre de checkboxes à gérer.

    La classe pourrait d'ailleurs devenir totalement générique, en gérant non seulement des procs "évènementielles" différentes en fonction du projet à gérer, mais également le fait de savoir, pour chaque contrôle, si l'événement est levé à tous les coups ou uniquement s'il est actif, en passant des paramètres optionnels lors de l'initialisation de la classe. Ca ne coûterait pas cher et en générisant le code, on gagne en efficacité grâce au réemploi.

    Quoi qu'il en soit, la gestion des clics sur checkbox ne doit impacter que l'ergonomie du userform (rendre des contrôles accessibles ou pas, adapter une liste déroulante, ...), ce qui limite de toute façon la "générisation" du code

    Cela dit, je ne détiens pas LA vérité, mais seulement la mienne. Et merci pour ton apport sui alimenté le débat.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  17. #17
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Citation Envoyé par Pierre Fauconnier Voir le message
    @ Patrick
    Cela étant dit, je préfère tout de même typer le usf en userform, car la responsablité de cette classe n'est pas de redimensionner le userform, mais de gérer des évènements de contrôles de façon +/- générique. Dans cette vision limitée à une responsabilité précise de la classe, ne pas disposer de toutes les propriétés et méthodes du usf n'est pas pénalisant


    oui je te l'accorde c'est pas pénalisant pour cet exemple utilisant le mousemove mais tout de meme on a vu qu'il utilisait dans son exemple le nom du userform en dur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub cAide_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        DonnéesDuGrain.Label15.Caption = "Veillez cocher si besoin" 'par exemple
    End Sub
    il a donc besoins de l'object userform dans sa classe checkbox
    hors !!
    si l'on veut remplacer sa ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DonnéesDuGrain.Label15.Caption..........
    par une variable generique
    on doit donc classer le userform
    MAIS !!!
    comme je l'ai expliqué et démontré plus haut pour atteindre la collection de controls en l'occurence ici le " Label15" il ne faut pas utiliser "as userform " sinon c'est l'erreur 438
    dans les classe controls et je parle uniquement de controls il y a des evenements ou propriété innaccessibles

    ceci ci dessous n'est absolument pas possible dans une classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public withevents form as userform
    'dans une sub ou fonction de la classe 
    for each ctrl in form.controls
    '......
    next 
    'ou meme 
    form.Label15.caption="....."
    j'ai galéré pendant longtemps avant de comprendre que ca n'etait pas possible (c'est pas logique j'en convient)mais c'est comme ca

    @ordonc: je comprends ton point de vue avec le controltiptext sauf qu'il est un peu long a la detente en pratique il n'apparait pas tout de suite ,meme un msgbox dans l'evenement est plus rapide

    je vais vérifier si en tant qu'object userform detaché de l'event de substitution ca fonctionne j'ai du essayé mais je ne m'en souvient plus
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  18. #18
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 949
    Points
    55 949
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    [...]il a donc besoins de l'object userform dans sa classe checkbox[...]
    C'est un défaut d'architecture qui fait qu'il a besoin du userform dans la classe. Avec une architecture correcte, ça ne pose aucun souci, la classe étant simplement là pour génériser l'évènement (en clair, pour permettre à plusieurs "listeners" d'écouter "le même" évènement, ou plutôt à un même listener d'écouter les évènements de plusieurs contrôles, ce qui permet de modéliser en vba ce qui se fait très facilement en dot.net) et n'ayant donc jamais besoin de savoir de quel userform elle gère les contrôles, et l'évènement "Click" redirigeant en fonction de la façon dont l'objet de la classe perso a été initialisé. si besoin de savoir quel userform est actif au moment de la levée d'évènement dans la classe, ça se gère en aval grâce au Click de la classe.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  19. #19
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    bon j'ai testé comme ca il n'y a plus d'ambiguité

    on a la collection de controls avec "as userform" mais pas les properties

    alors pour respecter le type d'object dans la fonction initiate je suis bien en en "as userform" vous pouvez tester j'ai préparer les ligne a (dé)bloquer selon les tests

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Public WithEvents Form As UserForm
    Public WithEvents CheckB As MSForms.CheckBox
    Public formDU As UserForm    'detaché de l'event
    Public formDO As Object    'détaché de l'event
    Dim cls() As New ClasseUF
    'Function iniatecheckbox(usf As Object)    ' debloquer celle ci ou celle de dessous et tester les 3 options des deux evenements
    Function iniatecheckbox(usf As UserForm)
     
        For Each ctrl In usf.Controls
            If TypeName(ctrl) = "CheckBox" Then
                i = i + 1: ReDim Preserve cls(1 To i):
                Set cls(i).CheckB = ctrl
                Set cls(i).Form = usf
                Set cls(i).formDU = usf
                Set cls(i).formDO = usf
            End If
        Next
    End Function
    Private Sub CheckB_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        Form.Label15.Caption = " vous etes sur " & CheckB.Name
        'formDU.Label15.Caption = " vous etes sur " & CheckB.Name
        'formDO.Label15.Caption = " vous etes sur " & CheckB.Name
    End Sub
    'evenement userform
    Private Sub Form_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    '   Form.Label15.Caption = " vous etes sur " & Form.Name    ' ne fonctionne pas erreur 438 erreur avec  (Form.name)et oui!! "as userform"
    '   formDO.Label15.Caption = " vous etes sur " & formDO.Name    ' fonctionne que si l'argument dans initiate est "object
    '   formDU.Label15.Caption = " vous etes sur " & formDU.Name ' ne fonctionne pas erreur 438 erreur avec  (FormDU.name)et oui!! "as userform"
    End Sub
    ' comme vous constaterez selon l'evenement j'ai un choix a faire aussi bien dans le typage de l'argument  dans le initiate que dans celui des variables
    'mettez tout en "as object " argument et variables
    'voila :)
    userform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim CL As New ClasseUF
     
    Private Sub UserForm_Activate()
    CL.iniatecheckbox Me
    End Sub
    n'est il pas mieux de ne pas s'ennuyer et comme je l'ai dit plus haut utiliser usfU/form pour les evenement et usfO pour tout le reste
    et cela que se soit avec ma methode ou la methode avec collection
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  20. #20
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 949
    Points
    55 949
    Billets dans le blog
    131
    Par défaut
    Non Patrick.

    Comme je l'ai dit, c'est un défaut d'architecture que la classe ait besoin d'utiliser le userform. Sa responsabilité, qui doit être unique si on veut programmer "selon les règles", doit simplement être de rediriger les click de façon générique, et pour cela, il n'est pas nécessaire qu'elle sache de quel userform elle gère les contrôles. C'est juste une question d'architecture.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. [Toutes versions] remplacer le nom d'un Control (listbox) par une variable pour agir sur ses propriétés
    Par jppouma dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 04/04/2017, 14h15
  2. [XL-2007] Évènement "décocher" pour un checkbox
    Par mobiclick dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/09/2010, 00h06
  3. Réponses: 3
    Dernier message: 11/12/2005, 11h15
  4. Réponses: 1
    Dernier message: 09/12/2005, 23h34
  5. Réponses: 1
    Dernier message: 23/08/2005, 14h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo