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 :

code formulaire redondant [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Par défaut code formulaire redondant
    bonjour a tous
    j'utilise le code ci-dessous pour mettre des information dans des textbox à chaque fois que la combobox change

    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
     
    Private Sub cmb_ref1_Change()
    On Error Resume Next
    Dim libelle As String
    Dim reference As String
    Dim prix As Single
    Dim poids, prixcarton, prixdétail, prixcartonpromo, prixdétailpromo As Double
    Sheets("source").Select
    reference = Me.cmb_ref1.Text
    Cells.Find(What:=reference, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext).Activate
    'faire apparaitre le libéllé
    libelle = ActiveCell.Offset(0, 3).Text
    Me.txt_lib1.Text = libelle
    'faire apparaitre le poids
    poids = ActiveCell.Offset(0, 4).Value
    Me.txt_poids1.Value = poids
    'faire apparaitre le poids
    poids = ActiveCell.Offset(0, 4).Value
    Me.txt_poids1.Value = poids
    'faire apparaitre le prix au carton
    prixcarton = ActiveCell.Offset(0, 8).Value
    txt_prix_carton1.Value = prixcarton
     
    'faire apparaitre le prix au détail
    prixdétail = ActiveCell.Offset(0, 9).Value
    txt_prix_detail1.Value = prixdétail
     
    'faire apparaitre le prix au carton promo
    prixcartonpromo = ActiveCell.Offset(0, 13).Value
    txt_prixpromo_carton1.Value = prixcartonpromo
     
    'faire apparaitre le prix au détail promo
    prixdétailpromo = ActiveCell.Offset(0, 14).Value
    txt_prixpromo_detail1.Value = prixdétailpromo
    End Sub
    j'ai donc 10 combobox et je répète ce code 10 fois

    existe-t-il un moyen d’alléger ce système

  2. #2
    Membre émérite
    Inscrit en
    Décembre 2006
    Messages
    897
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 897
    Par défaut bonjour bosk1000, le forum,
    plusieurs solutions :

    1) mettre le code affiché ci-dessus dans une fonction

    2) une solution est de placer dans le TAG du COMBOBOX le nom de la TEXTBOX correspondante. Dans chaque évènement change, on passe la valeur de la propriété TAG à la fonction. On ne change rien dans la "USERFORM" et on utilise le paramètre de la fonction.

    une autre solution est de renommer chaque combobox avec un numéro et chaque textbox avec le même numéro (pas trop dur avec 20 objets, et ça correspond au code ci-dessus). On va chercher le nombre final dans le nom de la COMBOBOX que l'on réutilise pour la TEXTBOX. Un code simpliste pour comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Cbo01_Change()
        TraiteChoix
    End Sub
     
    Sub Cbo02_Change()
        TraiteChoix
    End Sub
     
    Function TraiteChoix
       NbFinal = Right(ActiveControl.name,2)
       Controls("TxtBox" & NbFinal).value = Rnd
    End Function
    une dernière solution est de faire une classe...


    ESVBA

  3. #3
    Membre éclairé Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Par défaut
    merci pour ton aide
    je vais opter pour la fonction

    car je n'ai pas compris le fonctionnement du module de classe
    a moins que quelqu'un veuille bien me guider

    je confirme après si j'ai réussi la fonction

    voici ce que j'ai mis

    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
     
    Private Sub cmb_ref1_Change()
    TraiteChoix
    End Sub
     
    Function TraiteChoix()
    Dim nbfinal As Variant
    Dim libelle As String
    Dim reference As String
    Dim prix As Single
    Dim poids, prixcarton, prixdétail, prixcartonpromo, prixdétailpromo As Double
     
       nbfinal = Right(ActiveControl.Name, 2)
     
     
    On Error Resume Next
    Sheets("source").Select
    reference = Controls("cmb_ref" & nbfinal).Text
    Cells.Find(What:=reference, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext).Activate
    'faire apparaitre le libéllé
    libelle = ActiveCell.Offset(0, 3).Text
    Controls("txt_lib" & nbfinal).Text = libelle
    'faire apparaitre le poids
    poids = ActiveCell.Offset(0, 4).Value
    Controls("txt_poids" & nbfinal).Value = poids
    'faire apparaitre le poids
    poids = ActiveCell.Offset(0, 4).Value
    Controls("txt_poids" & nbfinal).Value = poids
    'faire apparaitre le prix au carton
    prixcarton = ActiveCell.Offset(0, 8).Value
    Controls("txt_prix_carton" & nbfinal).Value = prixcarton
    'faire apparaitre le prix au détail
    prixdétail = ActiveCell.Offset(0, 9).Value
    Controls("txt_prix_detailé" & nbfinal).Value = prixdétail
    'faire apparaitre le prix au carton promo
    prixcartonpromo = ActiveCell.Offset(0, 13).Value
    Controls("txt_prixpromo_carton" & nbfinal).Value = prixcartonpromo
    'faire apparaitre le prix au détail promo
    prixdétailpromo = ActiveCell.Offset(0, 14).Value
    Controls("txt_prixpromo_detail" & nbfinal).Value = prixdétailpromo
     
    End Function
    mais je n’obtiens rien
    ou est mon erreur ?

  4. #4
    Membre émérite
    Inscrit en
    Décembre 2006
    Messages
    897
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 897
    Par défaut
    les noms des contrôles textbox et combobox se terminent biens par "01" "02" "03"...
    avec mon exemple, on avait "x1", "x2"... que ce soit des combo ou des txbox.


    Précise l'objet "conteneur" avec les "activecell", "Controls(...)", ... :
    - "UserForm."
    - "Me."
    - "Sheets("Source").
    - ...

    ça évite les méprises de VBA et de nous.


    ESVBA

  5. #5
    Membre éclairé Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Par défaut
    merci
    effectivement il fallait nommer 01, 02
    et pas 1, 2

    par contre ma boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub UserForm_Initialize()
    Dim i As Byte
    For i = 1 To 10
    Me.Controls("cmb_ref" & i).RowSource = "source!a2:a" & Sheets("source").Cells(1, 15).End(xlDown).Row
    Next i
    End Sub
    ne fonctionne plus car j'ai due renommer les combobox cmb_ref en 01, 02 au lieu de 1, 2

    donc j'ai mis à la place
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmb_ref01.RowSource = "source!a2:a" & Sheets("source").Cells(1, 15).End(xlDown).Row
    etc... jusqu'a cmb_ref10
    s'il y a un moyen de quand même faire la boucle avec les 01, 02 ?

    par contre je ne comprend pas ce que tu veux dire :

    Précise l'objet "conteneur" avec les "activecell", "Controls(...)", ... :
    - "UserForm."
    - "Me."
    - "Sheets("Source").
    - ...

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Controls("cmb_ref" & Format(i, "00"))
    Pour i=3, tu auras cmb_ref03
    Et pour i=14, tu auras cmb_ref14

  7. #7
    Membre émérite
    Inscrit en
    Décembre 2006
    Messages
    897
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 897
    Par défaut
    Me.Controls("cmb_ref" & i).RowSource

    c'est une concaténation (vba) donc en formatant la chaine pour avoir deux caractères :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Controls("cmb_ref" & Format( i, "00")).RowSource

    ESVBA

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

Discussions similaires

  1. [Code] Formulaire de Recherche: Problème de code
    Par Laure041 dans le forum IHM
    Réponses: 9
    Dernier message: 29/04/2008, 17h22
  2. problème code formulaire de recherche
    Par ThieBEN dans le forum VBA Access
    Réponses: 6
    Dernier message: 21/02/2008, 10h13
  3. Réponses: 2
    Dernier message: 08/01/2008, 15h25
  4. insérer du code (formulaire)
    Par cramerao dans le forum IHM
    Réponses: 5
    Dernier message: 10/05/2007, 08h36
  5. probleme de code formulaire
    Par bachilbouzouk dans le forum ASP
    Réponses: 45
    Dernier message: 13/04/2005, 10h01

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