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 :

Utilisation d'objets d'une UserForm [XL-2000]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé Avatar de Brebiou
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 86
    Par défaut Utilisation d'objets d'une UserForm
    Bonjour a tous,

    Voila, j'ai un petit souci, je m'explique:

    J'ai ce bout de code:

    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
    46
    47
    48
    49
    50
    51
    52
    53
     
    Public Sub NouveauPuissanceActiveOK_Click()
    TABPactive(1) = TBPerAcqG1.Text
    TABPactive(2) = TBLimHG1.Text
    TABPactive(3) = TBLimBG1.Text
    TABPactive(4) = TBGradG1.Text
    TABPactive(5) = TBCoefEchG1.Text
    TABPactive(6) = TBTalG1.Text
    TABPactive(7) = TBCoefFiltG1.Text
    TABPactive(8) = TBNbAcqDefG1.Text
    TABPactive(9) = TBAcqAutoDefG1.Text
    TABPactive(10) = TBPerAcqG2.Text
    TABPactive(11) = TBLimHG2.Text
    TABPactive(12) = TBLimBG2.Text
    TABPactive(13) = TBGradG2.Text
    TABPactive(14) = TBCoefEchG2.Text
    TABPactive(15) = TBTalG2.Text
    TABPactive(16) = TBCoefFiltG2.Text
    TABPactive(17) = TBNbAcqDefG2.Text
    TABPactive(18) = TBAcqAutoDefG2.Text
    TABPactive(19) = TBPerAcqG3.Text
    TABPactive(20) = TBLimHG3.Text
    TABPactive(21) = TBLimBG3.Text
    TABPactive(22) = TBGradG3.Text
    TABPactive(23) = TBCoefEchG3.Text
    TABPactive(24) = TBTalG3.Text
    TABPactive(25) = TBCoefFiltG3.Text
    TABPactive(26) = TBNbAcqDefG3.Text
    TABPactive(27) = TBAcqAutoDefG3.Text
    TABPactive(28) = TBPerAcqG4.Text
    TABPactive(29) = TBLimHG4.Text
    TABPactive(30) = TBLimBG4.Text
    TABPactive(31) = TBGradG4.Text
    TABPactive(32) = TBCoefEchG4.Text
    TABPactive(33) = TBTalG4.Text
    TABPactive(34) = TBCoefFiltG4.Text
    TABPactive(35) = TBNbAcqDefG4.Text
    TABPactive(36) = TBAcqAutoDefG4.Text
    TABPactive(37) = TBPerAcqG5.Text
    TABPactive(38) = TBLimHG5.Text
    TABPactive(39) = TBLimBG5.Text
    TABPactive(40) = TBGradG5.Text
    TABPactive(41) = TBCoefEchG5.Text
    TABPactive(42) = TBTalG5.Text
    TABPactive(43) = TBCoefFiltG5.Text
    TABPactive(44) = TBNbAcqDefG5.Text
    TABPactive(45) = TBAcqAutoDefG5.Text
     
    NouveauPuissanceReactive.Show
    Unload Me
     
     
    End Sub
    Vous remarquerez que j'ai écrit cinq fois la même chose, a un détail près

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    TABPactive(1) = TBPerAcqG1.Text
    TABPactive(2) = TBLimHG1.Text
    TABPactive(3) = TBLimBG1.Text
    TABPactive(4) = TBGradG1.Text
    TABPactive(5) = TBCoefEchG1.Text
    TABPactive(6) = TBTalG1.Text
    TABPactive(7) = TBCoefFiltG1.Text
    TABPactive(8) = TBNbAcqDefG1.Text
    TABPactive(9) = TBAcqAutoDefG1.Text
    Le "G1" qui devient "G2" et ainsi de suit jusqu'a "G5".

    J'ai essayé pas mal de concatenation et autre, mais rien n'y fait.

    Donc je m'en remet a vous pour savoir s'il est possible de manipuler le nom d'un objet d'une feuille.

    J'aurais juste voulu faire une boucle en changeant la fin du nom, car ceci n'est que 5% du code hyper repetitif que j'ai récupéré et qu'il me faut clarifier.

    J'espère avoir été limpide

    Merci d'avance.

  2. #2
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    Bonjour,

    A adapter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub TestControl()
    Dim OLe As OLEObject
     
    For Each OLe In ActiveSheet.OLEObjects
    If Mid$(OLe.Name, 1, 7) = "TextBox" Then
     
    MsgBox OLe.Name
    End If
    Next
    End Sub

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Mars 2009
    Messages : 100
    Par défaut
    Salut,

    Tu as une valeur tabIndex pour chaque champs, c'est ce qui te permet de savoir quel est l'ordre des objets de ta form.

    D'après ce que j'ai vu tu répète 9 fois chaque champs.

    Donc si tu fais un calcul du style (à adapter)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if objet.tabIndex = 0 then
       i = 1
    else
       i = (objet.tabIndex mod 9)+1 
    end if
    ensuite tu créé le nom de ton champ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nomChamp = left(objet,len(objet.name)-1) & i
    Je ne sais pas du tout si celà fonctionne c'est à tester.

    Bon courage!

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    mettre en manuel lors du design, dans les propiétés Tag..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TBPerAcqG1.Tag = 1
    TBLimHG1.Tag = 2
    TBLimBG1.Tag = 3
    TBGradG1.Tag = 4
    TBCoefEchG1.Tag = 5
    etc... etc.
    et la macros de transcriptions des données pourrait être ..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub MemoData()
    Dim Cont As Control
    Dim N As Integer
        For Each Cont In Me.Controls
            If TypeOf Cont Is MSForms.TextBox Then
                N = Cont.Object.Tag
                TABPactive(N) = Cont.Object.Text
            End If
        Next Cont
    End Sub
    Il pourait y avoir des textBox qui ne doivent pas êtres pris en compte, alors les mettre avec Tag, par exemple a 99 et mettre une condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If N < 99 then
        TABPactive(N) = Cont.Object.Text
    End If
    L'inverse est également possible pour initialiser les textBox.
    A+

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Citation Envoyé par aalex_38 Voir le message
    Bonjour,

    A adapter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub TestControl()
    Dim OLe As OLEObject
     
    For Each OLe In ActiveSheet.OLEObjects
    If Mid$(OLe.Name, 1, 7) = "TextBox" Then
     
    MsgBox OLe.Name
    End If
    Next
    End Sub
    Uniquement pour info,
    Cette forme de code est uniquement valable pour des textBox qui se trouve sur une feuille de calcul..
    Et attention, sur un textBox de feuille il n'y a pas la propriété Tag, il faut donc employer une autre solution.
    et il n'est pas nécessaire de tester le nom de cette façon, ont peu...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If TypeOf Obj.Object Is MSForms.TextBox Then
        MsgBox OLe.Name
    end if
    A+

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonsoir, tous,

    A brebiou :

    J'ai pour toi une solution amusante et intéressante, n'utilisant pas la propriété tag ni bouclant sur tes contrôles.

    Peux-tu, simplement et pour lever tout doute, me confirmer que le tableau d'accueil est dimensionné à partir de 1 et non 0 (le mieux est que tu nous montres comment tu le déclares et le dimensionnes. <Le reste suivra vite ... )

  7. #7
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,

    ton problème semble proche de celui-ci, il s'agit de créer une sorte de moteur d'écriture de code

    http://www.developpez.net/forums/d66...isons-boucles/

    cordialement,

    Didier

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour, Ormonth

    Pas besoin d'une "sorte de moteur d'écriture de code"
    Que Brebiou veuille bien répondre à la question que j'ai posée (à propos de son tableau d'accueil) et on verra ...

  9. #9
    Membre confirmé Avatar de Brebiou
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 86
    Par défaut
    Oula, que de réponses.

    Alors pour la question de ucfoutu, mon tableau et dimensionné a partir de 0, mais je l'utilise a partir de 1 (logique d'automaticien )

    Ils sont déclarés comme suit

    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
     
    Public TABPactive(45) As Variant
    Public TABPreactive(45) As Variant
    Public TABTension(45) As Variant
    Public TABRGN(45) As Variant
    Public TABRGU(45) As Variant
    Public TABFrequence(45) As Variant
    Public TABConsDebit(45) As Variant
    Public TABConsTension(45) As Variant
    Public TABRGNDech(27) As Variant
    Public TABConsDebitDech(27) As Variant
    Public TABAssRGN(40) As Variant
    Public TABAssRGNDech(24) As Variant
    Public TABAssRGU(40) As Variant
    Public TABConversionGB(32) As Variant
    Sinon je vais tenter la solution de LeForestier et de Ptikir ainsi que regarder le topic que Ormonth m'a indiqué.

    Merci à tous pour votre réactivité

  10. #10
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Désolé pour ce retar ...
    Une réuniopn qui devait commencer à 10 h. 30 et durer 2 heures a été reportée (de 1/2 heure en 1/2 heure !) pour finalement débuter à 14 heures et durer 2 heures 30 !!!

    Bon ...

    Je me suis vengé avec ce petit exercice de logique arithmétique qui m'a bien délassé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     Dim montotal As Integer, i As Integer
      montotal = 45
      ReDim TABPactive(montotal)
      toto = Array("TBPerAcqG", "TBLimHG", "TBLimBG", "TBGradG", "TBCoefEchG", "TBTalG", "TBCoefFiltG", "TBNbAcqDefG", "TBAcqAutoDefG")
      For i = 0 To montotal - 1
          TABPactive(i + 1) = Controls(toto((i) Mod 9) & (i \ 9) + 1).Text 'attention : c'est bien \ et non /
      Next
    Cela devrait marcher ... Essaye

  11. #11
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    très jolie.
    Belle utilisation du modulo et de la partie entière de la division euclidienne

    Edit je sais que ca ne fait pas particulièrement avancé la discution, mais là fallait féliciter l'auteur

  12. #12
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Merci, mais tu sais ... :
    VB n'y est pas pour grand-chose (moi non plus, d'ailleurs ...) . L'arithmétique, ce n'est pas moi qui l'ai inventée. Le même raisonnement aurait pu être tenu dans différents langages de développement (et même sans langage informatique ... juste avec une feuille de papier et un crayon ...)
    C'est souvent le cas, d'ailleurs : un mécanisme d'abord, un langage ensuite (et le langage est vraiment si peu, dans cette affaire ...).

  13. #13
    Membre confirmé Avatar de Brebiou
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 86
    Par défaut
    Merci a tous de m'avoir consacré votre temps.

    Alors de toutes les solutions, j'ai retenu celle de LeForestier.

    En voici les explications:

    Bien que la solution de ucfoutu soit astucieuse et légère, il y a tellement de TextBox a gérer que j'aurais été obligé de créé 6 fonctions au moins sur ton modèle, néanmoins, merci

    De plus, comme l'a souligné LeForestier, son code (en mode création) peut être appliqué à l'inverse et c'est justement le fonctionnement souhaité un peu plus loin dans ma macro (en mode édition).

    Il a quand même fallu que j'adapte un chouilla, sinon ça aurai été trop simple:

    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
     
    'Fonctions de récuperations des valeurs dans les TextBox et insertion dans le tableau correspondant
    Function RecupDonnee(User_form, Tableau)
    'Déclarations
    Dim Cont As Control
    Dim N As String
     
        For Each Cont In User_form.Controls         'Test de l'objet de l'user form
            If TypeOf Cont Is MSForms.TextBox Then  'Si c'est une TextBox
                N = Cont.Tag                        'Récuperation du numero de Tag
                Tableau(N) = Cont.Object.Text       'Insertion de la valeur dans le tableau
            End If
        Next Cont
     
    End Function
    Le premier point, c'est que la propriété Tag est de type string, et pas Integer, donc incompatibilité

    Ensuite a la ligne N = Cont.Tag tu avais mis N = Cont.Object.Tag mais apparement, le Object ne lui plait pas.

    Merci à tous, vous m'avez fait faire un pas en avant, et pas des moindres.

    Bonne journée.

  14. #14
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Tag est de type string, et pas Integer, donc incompatibilité
    Tu peut peut être essayer de la convertir en entier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Flex3] Utiliser un objet depuis une autre page MXML
    Par cairon59 dans le forum MXML
    Réponses: 4
    Dernier message: 11/08/2010, 16h50
  2. Débutant : utiliser des objets d'une dll perso
    Par julien20vt dans le forum ASP.NET
    Réponses: 9
    Dernier message: 28/04/2010, 11h27
  3. utilisation d'objet dans une class
    Par turican2 dans le forum Langage
    Réponses: 4
    Dernier message: 19/02/2009, 15h43
  4. Réponses: 12
    Dernier message: 17/01/2008, 11h46
  5. [delphi 5,6,7] utiliser un objet dans une procédure
    Par wizdom dans le forum Langage
    Réponses: 3
    Dernier message: 27/01/2006, 15h38

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