"Indicer" une combobox [Résolu]

- - Dernière réponse : ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 11 oct. 2013 à 16:39
Bonjour à tous,

Tout d'abord, je vous informe que je débute en VBA, donc n'hésitez pas à critiquer mon code si vous voyez des choses mal faites.

Petite explication de mon code:
Je dispose de plusieurs pièces pour lesquelles l'utilisateur doit choisir leur matériau (avec une combobox). Selon leur choix, la valeur de la masse volumique correspondante est mise dans une case donnée (toutes les pièces n'ont pas nécessairement le même matériau)

Mon problème est le suivant :
J'ai donc 3 combobox qui vont appeler le même programme. Je les différencie avec l'indice i.
Je les définis comme ça (leur création se fait correctement) :

Private Sub ComboBox1_DropButtonClick()

    ComboBox1.ColumnHeads = True
    ComboBox1.ListFillRange = "Listes!D2:D5"
    Dim i As Single
    i = 1
    Call materiaux(i)
    
End Sub
Idem pour la CB2 et la CB3, j'adapte le i.

Mon problème est que je voudrais eviter de mettre trois fois l'instruction de completion de la masse vol. Donc j'aimerais "indicer" (je ne sais pas si ca se dit mais je ne trouve mieux) les combobox. J'ai pensé à :
    If i = 1 Then
        CB = ComboBox1
        
        ElseIf i = 2 Then
            CB = ComboBox2
        
        Else: CB = ComboBox3
        
    End If
        
    
    If CB.Value = "Acier" Then ... [suite du code]

Mais manifestement ca ne va pas !
Avec le debogage pas à pas j'ai vu que CB prenait en fait une des valeurs de la liste de matériaux.

Avez vous une solution à mon problème ?

Merci pour votre temps !

Bonne journée
Afficher la suite 

Votre réponse

4 réponses

Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Bonjour,
1) ton i est inutile.
Tu ne nous dis pas sur quoi (feuille ou userform) tu as mis ces comboboxes.
Si suir userform, par exemple ===>>>
Me.controls("Combobox" & i) se réfère à la combobox2 lorsque i = 2
Si sur feuille, dis-le (car similaire mùais un peu différent)
2) CB = ComboBox1 ===>> pas bon
pour affecter un objet à une variable, il faut dimensionner cette variable et utiliser l'instruction Set ===>>
exemple :
Dim toto as object
Set toto = nom de l'objet
Commenter la réponse de ucfoutu
0
Merci
ucfoutu :
Merci pour ta réponse
Désolée du manque d'info, les combobox sont dans une feuille.
J'ai modifié avec le déclaration de CB en objet, et le "set", ca marche merci beaucoup !

Je clos ma question donc.
Commenter la réponse de Schtroumpfette
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Ouais ...

Dis-voir, tu ne crois pas qu'il serait plus simple de faire ainsi :
Private Sub ComboBox1_DropButtonClick()

    ComboBox1.ColumnHeads = True
    ComboBox1.ListFillRange = "Listes!D2:D5"
    materiau Combobox1
    
End Sub

et ta procédure materiau :
private sub materiau(quoi as object)
  If quoi.Value = "Acier" Then ... [suite du code]
end sub

Essaye donc ...
Commenter la réponse de ucfoutu
0
Merci
Je vais essayer ca, merci de l'info
Effectivement ca m'evite de promener ce i, c'est plus propre !
Comme je disais je suis débutante, j'imagine bien que mon code doit être un peu agressif pour quelqu'un d'expérimenté !
ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
-
Je ne saurais te répondre sans voir ce qui vient après ton Then ...
Et pourquoi avoir choisi l'évènement DropButtonClick
J'aurais personnellement choisi l'évènement Click et ...
private sub materiau(quoi as object)
  dim choisi as string
  choisi = quoi.list(quoi.listindex)
  select case Ucase(choisi )
     case "ACIER"
         ''''' ce que tu veux faire
     case "TITANE"
        '''' ce que tu veux faire
    ' etc ...
 end select
end sub

note le Ucase (il sert , en comparant avec tout en majuscules, à éviter des erreurs éventuelles de casse)
Je ne veux pas, à ce stade de ton apprentissage, t'ouvrir d'autres horizons, mais sache qu'ils existent pour régler ce petit problème. Chaque chose en son temps.
voila la suite de mon code (j'ai nommé l'objet "quoi" de ton exemple en "CB")
If CB.Value = "Acier" Then
            Sheets("Weight").Range("A2").Select:
            ActiveCell.Value = Sheets("Listes").Range("E2")
            
        ElseIf CB.Value = "Titane" Then
            Sheets("Weight").Range("A2").Select:
            ActiveCell.Value = Sheets("Listes").Range("E3")
            
        ElseIf CB.Value = "Aluminium" Then
            Sheets("Weight").Range("A2").Select:
            ActiveCell.Value = Sheets("Listes").Range("E4")
            
       ElseIf CB.Value = "Bronze" Then
            Sheets("Weight").Range("A2").Select:
            ActiveCell.Value = Sheets("Listes").Range("E5")
        
        Else: Sheets("Weight").Range("A2").Select:
            ActiveCell.Value = ""
    End If
    
    If CB = ComboBox1 Then
        Range("D11").ClearContents:
        Range("D11") = Range("A2")
        
        ElseIf CB = ComboBox2 Then
            Range("D19").ClearContents:
            Range("D19") = Range("A2")
            
        ElseIf CB = ComboBox3 Then
            Range("K11").ClearContents:
            Range("K11") = Range("A2")
    End If

Quel est l'avantage de case sur if ?
Je me sers de la case A2 comme d'une étape pour ensuite remplir la case adaptée à la CB.
J'ai utilisé le DropButtonClick car j'ai vu sur un autre forum un utilisateur le conseiller. Ca me semblait adapté vu que je souhaite que l'utilisateur clique sur le matériau souhaitais dans la liste déroulante de la CB
Ce que je trouve très surprenant, c'est que ca n'arrive que pour la CB3 et que pour le Bronze ! J'ai du mal a comprendre la logique.
Merci pour le Ucase que je ne connaissais pas, il peut effectivement être très pratique, je me le note. Par contre, qu'est ce qu'une erreur de casse?
ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
-
l'évènement que tu as choisie intervient non à la sélection que tu viens de faire, mais ... au moment où tu cliques pour dérouler la Combo. A ce moment là, la propriété Value te retourne quoi ? ===>>> la sélection faite ... PRECEDEMMENT !
Moi, j'ai terminé.
-
J'ai appliqué ta méthode mais j'ai toujours le même soucis.

Merci pour ton aide
ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
-
Montre ce que tu as écrit.

Et, dans la foulée :
"Je me sers de la case A2 comme d'une étape pour ensuite remplir la case adaptée à la CB."
me donne l'impression de ce que tu prends par ailleurs un autre chemin tortueux. Quelle est donc "la case adaptée à la CB" ? (comment est-elle déterminée ?)
Et tu vas voir ... comme tout ton truc est très simple avec beaucoup moins de code.

Je te lirai au retour de ma partie de pêche.
Commenter la réponse de Schtroumpfette

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.