"Indicer" une combobox [Résolu]

Signaler
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
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

4 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
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
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.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
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 ...
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é !
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
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?
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
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
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
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.