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

Macros et VBA Excel Discussion :

création classe : 1 meme code l'un fonctionne, l'autre renvoie une classe de controles disparates [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    retraitée
    Inscrit en
    Février 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : retraitée

    Informations forums :
    Inscription : Février 2018
    Messages : 18
    Par défaut création classe : 1 meme code l'un fonctionne, l'autre renvoie une classe de controles disparates
    Bonsoir,

    je découvre les classes les objets et ouf.!!!! ....
    Dans un USF, j'ai une liste multiselection, deux boutons de commande et une textbox.
    Lors que je selectionne ou déselectionne un nom dans la liste, apparait ou disparait une Frame qui contient le nom et le prénom selectionné, un Combobox (donne le niveau), des labels qui reprennent les scores et les date de score en fonction de la selection choisi par la comBOBox. 2 text Box permettent d'entrer des nouveaux scores et des nouvelles date.
    Tout est en création dynamique.
    code userform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Dim NLabel As ClasseControle
    Dim NCombo As ClasseControle
    Private sub userform_Activate
    'création de la liste pour les combobox
    For Niveau = 0 To 6
    MonTableau(Niveau) = Niveau + 1
    Next Niveau
     
    'initialisation du tableau de place pour les frame
    'initialisation de la liste
    quand je crée les frames, je crée le label Nom, le label Prénom inclus dans une frame puis les combo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ' création de la combobox
    Set NCombo = New ClasseControle
    Set NCombo.oCombo = Me.Controls("Frame" & Numero).Controls.Add("Forms.Combobox.1")
    'Debug.Print "Me.Controls(Ncombo.oCombo).Name  " & Me.Controls(NCombo.oCombo).Name
    With NCombo.oCombo
        .List = MonTableau ....
    end with
    Select Case NCombo.oCombo.Value
    Case 1
        .BackColor = &H80FF80
        Couleur = "Vert"
    case 2....
    end select
    si je mets juste en dessous de la création le débug.print sur le nom des combo une erreur d'execution -2147352571(80002005)' le type ne correspond pas
    si je l'enlève le debug.print les with et select case qui suivent et qui caractérisent le combo fonctionnent. Mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Debug.Print "Me.Controls(Ncombo.oCombo).Name  " & Me.Controls(NCombo.oCombo).Name
    résultat du debug.print
    Me.Controls(Ncombo.oCombo).Name  Label2
    Me.Controls(Ncombo.oCombo).Name  TextBoxDate
    Me.Controls(Ncombo.oCombo).Name  CBGolfeur
    Me.Controls(Ncombo.oCombo).Name  Label2
    Me.Controls(Ncombo.oCombo).Name  CBInfos
    Me.Controls(Ncombo.oCombo).Name  TextBoxDate
    on voit apparaitre dans le debug.print tous les controles qui sont hors de la frame et qui ne sont pas des combo et pas le combo ????
    par contre si je fais la même chose avec les label, j e n 'obtiens que des labels...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Set NLabel = New ClasseControle
    Set NLabel.oLabel = Me.Controls("Frame" & Numero).Controls.Add("Forms.Label.1")
    Debug.Print "NLabel.oLabel.name  " & NLabel.oLabel.Name
     
    NLabel.oLabel.name  Label122
    NLabel.oLabel.name  Label123
    NLabel.oLabel.name  Label124
    NLabel.oLabel.name  Label125
    module de classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Option Explicit
    Public WithEvents oBouton As MSForms.CommandButton
    Public WithEvents oLabel As MSForms.Label
    Public WithEvents oCombo As MSForms.Combobox
    j'ai des soucis aussi sur les codes pour créer les évènements sur les combo et labels. Mais j'attends pour vous en parler de digérer les docs que j'ai imprimés.

    Avec tous mes remerciements

    Boisselière

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    re

    ce qui est en gras il manque pas quelque chose d'apres toi???
    .backcolor de quoi?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Set NCombo = New ClasseControle
    Set NCombo.oCombo = Me.Controls("Frame" & Numero).Controls.Add("Forms.Combobox.1")
    'Debug.Print "Me.Controls(Ncombo.oCombo).Name  " & Me.Controls(NCombo.oCombo).Name
    With NCombo.oCombo
        .List = MonTableau ....
    end with
    Select Case NCombo.oCombo.Value
    Case 1
        .BackColor = &H80FF80
        Couleur = "Vert"
    case 2....
    end select
    sit u veux atteindre tes controls il faut instancier les objects dans la meme instance classe que ta combo sinon tu peux toujour attendre
    d'autant plus que ton code est incomplet il en manque bien trop pour t'en dire 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

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    je voudrais a jouter un truc parce que je suis un peu fatigué et que je l'ai pas vu tout de suite

    ici crois vraiment que tu classe tout tes labels??????????
    je supose que ce code est dans une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set NLabel = New ClasseControle
    Set NLabel.oLabel = Me.Controls("Frame" & Numero).Controls.Add("Forms.Label.1")
    Debug.Print "NLabel.oLabel.name  " & NLabel.oLabel.Name
    NLabel.oLabel.name Label122
    NLabel.oLabel.name Label123
    NLabel.oLabel.name Label124
    NLabel.oLabel.name Label125
    en fait pour pas te faire tourner dans tout les sens et en rond je te le dis c est non!!!
    en fait au fur et a mesure de la boucle tu change olabel pour le suivant
    si bien que a la fin seul le dernier est classé

    quand tu a X controls de meme type tu dois instancier X sub classe pour chaque

    il es possible d'aparenter plusieur control dans une meme instance de classe mais de type différent
    je te suuggere de reprendre le tutoriel relativement bien fait je vais essayer de te retrouver le lien
    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 averti
    Femme Profil pro
    retraitée
    Inscrit en
    Février 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : retraitée

    Informations forums :
    Inscription : Février 2018
    Messages : 18
    Par défaut chgt de couleur de la combo en fonction de la valeur fonctionne mais toujours le meme pb sur la combo
    Citation Envoyé par patricktoulon Voir le message
    re

    ce qui est en gras il manque pas quelque chose d'apres toi???
    .backcolor de quoi?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Set NCombo = New ClasseControle
    Set NCombo.oCombo = Me.Controls("Frame" & Numero).Controls.Add("Forms.Combobox.1")
    'Debug.Print "Me.Controls(Ncombo.oCombo).Name  " & Me.Controls(NCombo.oCombo).Name
    With NCombo.oCombo
        .List = MonTableau ....
    end with
    Select Case NCombo.oCombo.Value
    Case 1
        .BackColor = &H80FF80
        Couleur = "Vert"
    case 2....
    end select
    sit u veux atteindre tes controls il faut instancier les objects dans la meme instance classe que ta combo sinon tu peux toujour attendre
    d'autant plus que ton code est incomplet il en manque bien trop pour t'en dire plus

    .backcolor de quoi?
    Ca cela fonctionne j'obtiens un fond de couleur différent pour une même combo selon la valeur de la combo. cela a un petit effet graphique sympa...

    Pour le reste j'ai pris en compte tes remarques. j'ai basculé le new dans les premières déclarations de l'Userform. Dans mon idée, j'aimerais avoir une classe qui comprend tous les combo . je voudrais que si les combo changent , les données qui sont inscrites sur les Label changent aussi. La valeur des combo renvoie à une couleur, couleur qui est un nom d'une plage dans la feuille de données.
    j'aimerai pouvoir t'envoyer le code de la création de la Frame en entier, code qui est appelé lorsque la liste change. mais là je n'y arrive pas. le copier coller ne fonctionne pas...
    j'essaierai plus tard mais le problème reste entier. NCombo.ocombo renvoie autre chose qu'une combo

  5. #5
    Membre averti
    Femme Profil pro
    retraitée
    Inscrit en
    Février 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : retraitée

    Informations forums :
    Inscription : Février 2018
    Messages : 18
    Par défaut plus de problème sur les combo
    Bonjour,

    je viens de comprendre mon problème. Des jours dessus pour rien !!!
    le problème venait de ma demande dans le debug.print. j'avais écrit me.controls et donc Exel me donnait gentiment les uns après les autres tous les controles dans mon USERFORM et comme la combo était encapsulée dans le Frame je ne l'avais jamais....
    Alors que pour les Label j'avais écrit NLabel.oLabel.Name c'est tout.
    Si j'écris debug.print NCombo.oCombo.name Excel me donne le nom de la combo

    Désolée pour le dérangement...
    Maintenant je passe aux choses sérieuses : il faut que ces labels et ces combos aient un fonctionnement particulier..... et je sens que cela ne va pas être de tout repos

    infiniment merci pour la prise en compte de mes difficultés...mais je ne comprenais vraiment pas ce qui se passait

  6. #6
    Membre averti
    Femme Profil pro
    retraitée
    Inscrit en
    Février 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : retraitée

    Informations forums :
    Inscription : Février 2018
    Messages : 18
    Par défaut comment voir ce que contient une classe
    Bonjour,

    j'ai essayé la propriété count pour savoir combien d'objet étaient contenus dans une classe mais cela ne fonctionne pas...
    je crois comprendre qu'une collection est une chose et une classe une autre. Mais comment peut on savoir si un objet fait partie d'une classe ou pas ?

    dans mon projet :
    j'ai un module de classe : ClasseControle
    dans lequel j'ai des objets qui réagissent à des événements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private withEvents oCombo as MS.Forms.Combobox
    et après je crée des sous classe : NCombo, NLabel
    dans lesquels je crée des objets.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set  NCombo.oCombo = Me.Controls(Frame).controls.add (Forms.combobox.1)
    Mais quand je tape NCombo Exel me propose oCombo mais aussi oLabel....

    je ne comprends pas tout.... merci de m'éclairer

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour Patrick,
    Moi pour ce genre de travail j'utilise des debgrid!

    Ou a défaut des spreetsheet!

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour Robert
    absolument d'accords

    a quoi peut il bien lui servir 60 label dans une frame dynamique en plus surtout qu'il faut deja les placer ces Labels l'ors de la constriction

    j'ai cru comprendre dans la discussion ,que ca lui etait imposé, une bonne douche froide pour le chef de projet et 2 trois coup de Latte si la douche froide ne suffit pas

    et au pire une table html dans un webbrowser une table html pouvant se construire en une ligne

    des solutions il y en a a foison

    je suis en train d'imaginer qu'il doive acceder a ses Labels differement
    combien de subclasses va t il y avoir ?
    combien d'evenement

    en gros c'est ecrire les evenement qui sont normalement dans le userform dans la classe

    la tout d'un coup la notion de dynamique perd de son attrait
    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

  9. #9
    Membre averti
    Femme Profil pro
    retraitée
    Inscrit en
    Février 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : retraitée

    Informations forums :
    Inscription : Février 2018
    Messages : 18
    Par défaut oula la !!
    Programmer pour moi c' est comme la montagne :je pense avoir atteint l'objectif mais non c'est un peu plus loin. Et au final ce n'était pas le bon chemin

    Bonjour,

    Au départ, c'est ce que j'avais fait : créer des frames en dur, les rendre visible quand l'utilisateur sélectionnait dans la liste. je m'étais farcie pendant deux jours la création de 240 labels (il y avait 4 frames avec 60 labels chacun) avec tous un nom différent (et gare à vous, si vous donnez un nom déjà pris, la punition est immédiate, excel vous sort de là sans avertissement !).
    Et je m'étais arrêtée car je ne voyais pas comment créer 240 sub identiques avec juste le nom qui change.

    d'où le passage avec des frames dynamiques, avec les heures, les découragements et espoirs dont je vous ai fait part....

    Bien sur, vous l'avez compris debgrib et spreetsheet je ne sais pas ce que c'est, mais un fichier ou quelque chose trop lourd à gérer cela je l'ai déjà vécu.

    Je vais laisser passer le week end pour digérer (ça tombe bien je suis partie) et je vais revenir à mon vieux fichier et maintenant que je commence à savoir manipuler une classe, la problématique des 240 sub identiques me semble moins insurmontable...

    Je ne clos pas la discussion car j'aurais surement besoin de votre aide...
    Je ne sais pas comment vous dire MERCI. Vous m'avez bien aidé



    ps : pour info j'avais trouver une solution à mon problème de ce matin : j'avais fait une collection de labels qui avait tous un key qui est un string et dont le premier élément était le nom de la combo. Cela fonctionnait bien : les caption des labels changeaient en fonction de la valeur de la combo et c'était les bons labels qui changeaient mais..... seuls ceux de la dernière frame créée répondaient à l'évènement click. la solution n'en était donc pas une...

  10. #10
    Invité
    Invité(e)
    Par défaut
    Dans le code que je t'es donné au poste #7 UserForm j'utilise un collection (Scripting.Dictionary).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    NewControles.Add T, "nomdesControl")
     
    NewControles("nomdesControl").add
    Ici le contrôle porte un nom nomdesControl et tu y accèdes par son non dan la collection.

    Mais le collections peuvent chainer les classes entre elles?

    Pare exemple une collection qui contiens des modules de classe Frame et un collection newFrame.

    Dans la classe frame nous retrouvons NewControles qui disparait de UserForm au profit de newFrame et on intégré le code de uderForm dans frame.

    Ainsi dans userForm on ajoute des instances de frame et pour chaque item de NewFrame("nomdeqlaFrame").add on ajoute un ligne de contrôle.

    Donc les contrôles son intiment lié à la frame.

    Je te laisse digérer un peut et on abordera la méthode!

    Il faudra quand même aborde comment on affecter des libellés aux contrôle.

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    re
    Bonjour
    entre nous 60 Labels dynamiques il y a la matiere a discussions
    en ce qui me concerne 60 Label dynamiques c'est deja a la base un probleme de conception!!!
    et je ne crois pas trop m'avancer en disant que selon le pc utilisé il vas y avoir du freeze screen dans l'air
    et alors a déboguer cela sera une torture

    je part du principe que au dela de 15/20 controls le coté dynamique n'a plus lieu d'etre et je suis deja large
    je dis ca mi j'dis rien hein

    c'est tellement plus facile de la faire en dur ta frame en ivisible ,avec tes labels et au pire gérer ces evenement dans une classe histoire de diminuer le code

    la encore j'dis ca moi j'dis rien hein
    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
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    je penses que tu n'a rien compris!

    un module de classe est là pour te simplifier la vie, hors tu te la complique!

    comme te l'a dit Patrick ()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set NCombo = New ClasseControle
    écrase l'instance précédaient créée!

    de plus pour chaque instance de ta classe tu ajoute 3 contrôle!

    une classe est un modèle de programme utilisable comme une variable et tu peux créer un tableau de variable ou une collection!

    Code ClasseControle : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Option Explicit
    Public WithEvents oBouton As MSForms.CommandButton
    Public WithEvents oLabel As MSForms.Label
    Public WithEvents oCombo As MSForms.Combobox
    Private INDX As Integer
    Public Sub Add(ByRef Frame As Object, i As Integer)
    INDX = i
    Set oBouton = Frame.Controls.Add("Forms.CommandButton.1"): oBouton.Visible = True: oBouton.Caption = "toto": oBouton.Top = 37 * i: oBouton.Width = 140: oBouton.Height = 35
    Set oLabel = Frame.Controls.Add("Forms.Label.1"): oLabel.Visible = True: oLabel.Caption = "toto": oLabel.Top = 37 * i: oLabel.Left = 150: oLabel.Width = 140: oLabel.Height = 35
    Set oCombo = Frame.Controls.Add("Forms.Combobox.1"): oCombo.Visible = True: oCombo.List = Array("OUI", "Non"): oCombo.Top = 37 * i: oCombo.Left = 300: oCombo.Width = 140: oCombo.Height = 35
    End Sub
    Private Sub oBouton_Click()
    MsgBox "INDX := " & INDX & " oLabel.Cation := " & oLabel.Caption
    End Sub
    Code UserForm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private NewControles As Object, i As Integer
    Private Sub CommandButton1_Click()
    Dim T As ClasseControle
    For i = 0 To 10
    set T = new ClasseControle
    T.Add Me.Frame1, i
    NewControles.Add T, "Classe" & i
    Set T = Nothing
    Next
    End Sub
    Private Sub UserForm_Initialize()
     Set NewControles = CreateObject("Scripting.Dictionary")
    End Sub
    Dernière modification par Invité ; 26/02/2018 à 11h50.

  13. #13
    Membre averti
    Femme Profil pro
    retraitée
    Inscrit en
    Février 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : retraitée

    Informations forums :
    Inscription : Février 2018
    Messages : 18
    Par défaut classe
    bonjour,

    je pense effectivement que je suis partie sur des interprétations peut être plus compliquées que la réalité.
    je ne remets pas du tout en cause ce que toi et Patrick me dites ; j'essaie surtout de comprendre parce qu'au final j'aimerais bien que cela fonctionne et je suis bien persuadée que vous êtes plus proche de savoir le faire que moi.

    si je comprends ce que tu m'as écrit dans les lignes de code.

    tu me dis : ton objet Frame avec ces différents labels, command button et combo est à créer dans le module de classe avec la procédure Sub ADD(frame,i). Tu pourras faire jouer les différents composants (oBouton,,,) dans des procédures comme Private Sub obutton_ click qui est toujours dans le module de classe.


    Dans le module Userform, tu pourras appeler ce modèle global qui récupérera toutes les propriétés et comportements décrits dans le modèle de classe.

    ce qui me pose souci c'est toutes les écritures que tu as mises dans l'Userform
    - ce commandButton1 dont on décrit le click est il le même que le oButton du module de classe. Je penserai que non mais j'aimerais bien être sure !!!
    - dans ton code (si je comprends) quand on appuie sur ce command button1, il crée 10 NewControles différents qui se réfèrent à une même classe... d'où le set T = NewClasseControle et le Set = Nothing
    - le fait qu'on est Set NewControles = CreateObject("Scripting.Dictionary") dans Private Sub UserForm_Initialize() est ce que cela signifie que les controles sont créés à l'avance ou c'est juste une préparation.... on lui dit quand tu auras un NewControles va créer l'objet dans le Dictionnaire...

    Désolée. j'espère avoir fait un petit pas vers la solution ...
    Merci pour votre patience et votre compréhension.

  14. #14
    Invité
    Invité(e)
    Par défaut
    en fait avec le module de classe tu n'as pas à te préoccuper du nom vue que tu utilises des objets comme Public WithEvents oBouton As MSForms.CommandButton il n'y a pas d'ambiguïtés!

    c'es juste le caption qu'il faut modifier!

    Code UserForm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private NewFrames As Object, i As Integer
    Private Sub CommandButton1_Click()
    Dim nb As String
    For i = 0 To 10
         NewFrames.Add NewFrames.Count, New FrameRd
         NewFrames(NewFrames.Count - 1).Add Me
         For l = 0 To 10
             NewFrames(NewFrames.Count - 1).AddC
         Next
    Next
    End Sub
    Private Sub UserForm_Initialize()
    Set NewFrames = CreateObject("Scripting.Dictionary")
    End Sub
    Code ClasseControle : 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
    Option Explicit
    Private WithEvents oBouton As MSForms.CommandButton
    Private WithEvents oLabel As MSForms.Label
    Private WithEvents oCombo As MSForms.ComboBox
    Public WithEvents ParentFrm As MSForms.Frame
    Public ParentDico As Object
    Public INDX As Integer
    Public Sub Add()
     
     
    Set oBouton = ParentFrm.Controls.Add("Forms.CommandButton.1"): oBouton.Visible = True: oBouton.Caption = "toto": oBouton.Top = 37 * INDX: oBouton.Width = 140: oBouton.Height = 35
    Set oLabel = ParentFrm.Controls.Add("Forms.Label.1"): oLabel.Visible = True: oLabel.Caption = "toto": oLabel.Top = 37 * INDX: oLabel.Left = 150: oLabel.Width = 140: oLabel.Height = 35
    Set oCombo = ParentFrm.Controls.Add("Forms.Combobox.1"): oCombo.Visible = True: oCombo.List = Array("OUI", "Non"): oCombo.Top = 37 * INDX: oCombo.Left = 300: oCombo.Width = 140: oCombo.Height = 35
    End Sub
    Private Sub oBouton_Click()
    MsgBox "INDX := " & INDX & " oLabel.Cation := " & oLabel.Caption
    End Sub
    Private Function contFrm(ByVal MeFrm As Object) As Integer
    For i = 0 To MeFrm.Controls.Count - 1
        Debug.Print TypeName(MeFrm.Controls(i))
        If TypeName(MeFrm.Controls(i)) = "Frame" Then contFrm = contFrm + 1
    Next
    End Function
    Code FrameRd : 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
    Private WithEvents Frm As MSForms.Frame
    Private NewControles As Object, i As Integer
    Public Sub Add(ByRef MeFrm As Object)
    nb = contFrm(MeFrm)
    Set Frm = MeFrm.Add("Forms.frame.1")
    Frm.Visible = True
    Frm.ScrollBars = fmScrollBarsBoth
    If nb > 0 Then
        Frm.Top = (Frm.Height + Frm.Top + 5) * (nb)
    End If
    End Sub
    Private Function contFrm(ByVal MeFrm As Object) As Integer
    For i = 0 To MeFrm.Controls.Count - 1
        Debug.Print TypeName(MeFrm.Controls(i))
        If TypeName(MeFrm.Controls(i)) = "Frame" Then contFrm = contFrm + 1
    Next
    End Function
    Public Sub AddC()
    NewControles.Add NewControles.Count, New ClasseControle
    Set NewControles(NewControles.Count - 1).ParentFrm = Frm
     NewControles(NewControles.Count - 1).INDX = NewControles.Count - 1
     NewControles(NewControles.Count - 1).Add
    End Sub
     
     
    Private Sub Class_Initialize()
     Set NewControles = CreateObject("Scripting.Dictionary")
    End Sub
     
     
    Private Sub Class_Terminate()
    Set NewControles = Nothing
    End Sub

    Nom : Sans titre.png
Affichages : 168
Taille : 5,2 Ko

    on peux considéré chaque instance de la classe comme des calque superposés! on peut voir par transparence le contrôles du calque inférieure!


    Voici une collection de module de classe!

    Nom : images.jpg
Affichages : 173
Taille : 6,3 Ko

    La collection c'est notre oignions constitué de cercles concentriques ou chaque cercle est une instance!
    Je conçois for bien que ça face pleurer!

    Et pour le coup je dirais que chaque instance de framerd s'occupe de ses oignions!
    Fichiers attachés Fichiers attachés
    Dernière modification par Invité ; 09/03/2018 à 18h24.

  15. #15
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    re
    240 label 60 par frame le tout dynamique
    j'espere que ce ne sera pas utilisé sur le s PC de bureau au boulots tu va pas etre decu du voyage

    comme je l'ai dis au dela d'une 20 aine de controls identiques utiliser une classe est une erreur de conception

    te rend tu compte que sans rien faire ,juste le userform affiché, la memoire sera deja occupé par par 240 labels et ses propriétés et fonction evenement substiuées dans la classe

    ton fichier sera evita eternam en soufrance

    je te parle meme pas du debogage

    robert dis lui non de dieu!!
    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

  16. #16
    Membre averti
    Femme Profil pro
    retraitée
    Inscrit en
    Février 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : retraitée

    Informations forums :
    Inscription : Février 2018
    Messages : 18
    Par défaut
    Bonjour,

    Je lis, je vais fonctionner le code de ton fichier. j'avance à petit pas dans la compréhension mais il y a deux points qui me posent souci.

    * le premier il y a un public ParentDico as Object dans la Classe sauf étourderie de ma part, il n'est pas utilisé. Est- ce une scorie ou est-ce nécessaire de l'écrire ?
    * le second : il y a plusieurs sub ADD dans ton fichier.
    dans la ClasseControle il y a Sub ADD qui est appelé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NewControles(NewControles.Count - 1).Add
    dans la classe Framed il y a Sub ADD (by ref MeFrm as object) qui est appelé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NewFrames(NewFrames.Count - 1).Add Me
    CEs deux Sub Add je les comprends. Ce que je ne comprends pas c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     NewFrames.Add NewFrames.Count, New FrameRd
     'et son corollaire  
    NewControles.Add NewControles.Count, New ClasseControle
    la première NewFrames déclenche Sub Class_Initialize (). Ces instructions créent des new instances de la classe, je suppute
    Mais quand je la compare avec la méthode ADD Object. Add item, key, ... je ne retrouve pas cette syntaxe
    Je ne les comprends pas : j'ai bien Object.add mais après j'ai un chiffre et après une nouvelle instance.
    et en plus les lignes qui suivent, tu parles de NewFrames(NewFrames.Count - 1) et de NewControles(NewControles.Count - 1)
    Du coup, je plonge... C'est peut-être les oignons qui me brouillent la vue.

    Mille merci

    Marielyse

  17. #17
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    c'est pas pour dénigrer robert mais je me pose une question
    pourquoi utilise tu un dico??
    quest ce que tu veux faire finalement avec ces 60 labels par frames?????????????????????????????
    je t'ai montré un exemple simple de classe control avec leur evenement a multiplier en 2 lignes par le nombres de labels
    pourquoi cherche tu a te compliqué la vie

    et surtout :et je le redis encore une fois, c'est que ce fichier sera une soufrance perpetuelle du a la surcharge memoire en fonctionnement et a deboguer je t'en parle meme pas
    comment il faut le dire en javanais ???

    si tu reprenais depuis le debut et expliquer clairement ce que feront ces labels et comment et pourquoi ils seront manipulés on pourrais te donner une solution plus propre et certainement moins lourde !
    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
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    re
    si tu veux tu n'y est pas obligé bien sur
    1. tu va ouvrir un classeur absolument vierge
    2. dans ce classeur tu va y mettre un userform absolument vide de tout controls
    3. dans ce classeur tu va y mettre aussi un module classe que tu nomera "newframe"
    4. et c'est tout !!!


    les codes:

    code a mettre comme tel dans le userform:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim cl As New newframe
    Private Sub UserForm_Activate()
    cl.initfram Me
    End Sub
    jusque la rien de compliqué

    code a mettre comme tel dans le module classe nommé "newframe"
    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
    Option Explicit
    Public WithEvents labelo As MSForms.Label
    Public WithEvents framm As MSForms.Frame
    Dim BTN(60) As New newframe
    Public uff As Object
    Function initfram(usf)
        Dim fram As Object, lab As Object, X As Long, C As Long, L As Long, w As Long, H As Long
        Set fram = usf.Controls.Add("Forms.Frame.1", "maFrame", True)
        With fram
            .Width = usf.Width / 1.5
            .Height = usf.Height / 2
            .BackColor = vbBlue
            w = fram.Width / 10
            H = fram.Height / 6
             For C = 0 To 9
                For L = 0 To 5
                    X = X + 1
                    Set lab = fram.Controls.Add("Forms.Label.1", "Label" & X, True)
                    With lab
                        .Caption = "Label" & X
                        .Width = w - 2
                        .Height = H - 2
                        .Left = C * w
                        .Top = H * L
                        .BorderStyle = 1
                        .BackColor = ThisWorkbook.Colors(2 + (Rnd * 54))
                    End With
                    Set BTN(X).labelo = lab: Set BTN(X).framm = fram: Set BTN(X).uff = usf
                Next L
            Next C
        End With
    End Function
    Private Sub labelo_Click()
    MsgBox " je suis le label : " & labelo.Name & vbCrLf & " le nom de ma frame parent est :" & framm.Name & _
    vbCrLf & "nous somme tout deux dans le userform : " & uff.Name
    End Sub
    voila sauve ce fichier sous le nom que tu veux et ou tu veux

    lance le userform c'est magique!!
    et c'est pas tout clique sur les labels
    voila 35 lignes et tu a une frame et 60 label disposés facon grille completement operationel

    a partir de l'evenement click tu peux partir ou tu veux dans n'importe quel module vers une sub ou fonction en injectant le/les nom(s) puisque tu les a dispo dans l'evenement
    j'ai mis que l'evenement click mais on peut y mettre tout les evenement label qui existe dans la classe
    demonstration
    Nom : demo2.gif
Affichages : 233
Taille : 1,14 Mo

    Attention que les chose soit claires ca n'enleve rien a ce que j'ai dis plusieur fois "ce n'est pas le bon chemin a prendre" meme si ca marche meme si c'est joli ya plein de couleur et tout et tout
    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

  19. #19
    Invité
    Invité(e)
    Par défaut
    Jon tu peux créer tes contrôle dynamiquement, c'est ce que je fais d'une certaine manière!

    Mais il me fallait trouver un exemple hors contexte d'où le commandbuton!

    NewControles contient la collection de tous tes modules de classe.


    INDX permet de positionner tes contrôles dans la frame

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oBouton.Top = 37 * i ou oBouton.Top = 37 * INDX

    NewControles.count te donne le nombre d'instance!


    Si nous considérons que tu ajoute a chaque fois 3 contrôle, nous pouvons considérer que ADD ajoute une ligne de trois contrôles! Tu peux tout à loisirs modifier ADD pour lui passer ses valeurs en paramètres!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Sub Add(ByRef Frame As Object, i As Integer,texteBouton as string,textLabel as string,Liste as variant)
     
    NewControles.Add T, "Classe" & i'permet de donner un nom a l'item de ta collection
     
    NewControles.Add T, "Ligne1"
    Debug.print NewControles("Ligne1").oBouton.name
     
    Debug.print NewControles("Ligne2").oBouton.name
    Pas beson de donner un nom à tes contrôles vue qu'ils sont liés NewControles qui attribut un nom a chaque items!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    set T = new ClasseControle 'je crée une nouvelle instance de la classe 
    T.Add Me.Frame1, i 'J'ajoutes ue ligne dans la frame1
    NewControles.Add T, "Classe" & i 'j'ajoute mon mon instance à la collection en lui donnant un nom
    Set T = Nothing ' je coupe le cordons ombilical  entre la collection et la classe
     
    'si je ne fais pas cela la dernière instance de la lâches sera visible dans tous les items de la collection!
    Dernière modification par LittleWhite ; 11/03/2018 à 14h57. Motif: Balise code

  20. #20
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    la facon dont tu crée ta classe n'est pas adaptée a plusieur element du meme type

    amoisn de faire en haut de module public withevent ....as msforms.label le nombre de fois que tu a de label
    et toi la ou ca se complique c'est que tu veux que l'evenement d'un/des label agisse sur la combo ou l'inverse je sais plus
    pour cela il te faut instancier autant de classe que de controls

    donc au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim maclass=new classe1
    tu peux mettre par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim mesclass(50) as new classe1
    et dans ta boucle sur controls(ctrl) avec une variable incrémentée (i par exemple )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set mesclass(i).ocombo=ctrl
    *et si tu veux que la combo aggisse sur un label en particulier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set mesclass(i).olabel=ctrl
    regarde cet exemple de classe qui me permet d'avoir le mouseover sur les commandbutton
    regarde comment j'integre le userform a chaque instance de la classe pour chaque bouton
    afin que dans l'evenement userform il reconnaisse le bouton

    sans ca c'est walouh walouh

    dans le module classe tu met
    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
    Public WithEvents bouton As MSForms.CommandButton
    Public WithEvents framm As MSForms.Frame
    Public WithEvents formm As UserForm
    Dim BTN(100) As New overbouton
    Dim fram(100) As New overbouton
    Dim form(1) As New overbouton
    Public uff As Object
    Function initbouton(usf)
        Set form(1).formm = usf: Set form(1).uff = usf
        For Each ctrl In usf.Controls
            If TypeName(ctrl) = "CommandButton" Then
                ctrl.Tag = ctrl.BackColor
                i = i + 1: Set BTN(i).bouton = ctrl: Set BTN(i).uff = usf
            End If
            If TypeName(ctrl) = "Frame" Then
                f = f + 1: Set fram(f).framm = ctrl: Set fram(f).uff = usf
            End If
        Next
    End Function
    Private Sub bouton_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        If bouton.BackColor = bouton.Tag Then bouton.BackColor = vbRed
     If uff.Tag <> "" And uff.Tag <> bouton.Name Then uff.Controls(uff.Tag).BackColor = uff.Controls(uff.Tag).Tag
      uff.Tag = bouton.Name
    End Sub
    Private Sub framm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        If uff.Tag <> "" And uff.Tag <> bouton.Name Then uff.Controls(uff.Tag).BackColor = uff.Controls(uff.Tag).Tag
    End Sub
    Private Sub formm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        If uff.Tag <> "" Then uff.Controls(uff.Tag).BackColor = uff.Controls(uff.Tag).Tag
    End Sub
    et dans le userform tu met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim cl As New overbouton
    Private Sub UserForm_Activate()
    cl.initbouton Me
    End Sub
    le module classe se nomme "overbouton"


    et pour reprendre robert

    non seulement tu ecrase la classe precedente et combien meme si tu l'ecrasais pas

    tu ecrase olabel precedent

    tu ne peux pas faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set maclasse.olabel= label1
    set maclasse.olabel=label2
    etc..........
    ce sera toujours le dermier qui sera intégré ala classe
    en fait c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set maclasse(1).olabel=label1
    set ma classe(2).olabel=label2
    etc......
    et si tu veux un control eccessible par le click du label par exemple ta combo
    ce sera set maclasse(3).olabel=label4:setmaclasse(3).ocombo=tacomboboboxainsi dans le click de ton label 4
    tu peux faire ocombo.backcolor=vbred (elle deviendra rouge )

    si tu essaie dans le label 2 par exemple tu aura erreur object indefinie car la classe(2) ne connais pas la combobox
    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

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/06/2016, 15h44
  2. Réponses: 6
    Dernier message: 30/10/2014, 12h27
  3. Réponses: 3
    Dernier message: 11/07/2011, 18h07
  4. Faire fonctionner le constructeur d'une classe
    Par Marc22 dans le forum Langage
    Réponses: 2
    Dernier message: 02/12/2010, 00h53
  5. Réponses: 8
    Dernier message: 23/05/2010, 21h06

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