"Indicer" une combobox

Résolu
Schtroumpfette - 11 oct. 2013 à 10:14
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur 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

4 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 11/10/2013 à 11:28
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
0
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
11 oct. 2013 à 11:49
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 ...
0
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é !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
11 oct. 2013 à 11:56
ton code n'est pas "agressif". Il est celui d'un débutant qui cherche à s'en sortir par lui-même, quitte à devoir ensuite perfectionner.
Je suis toujours content de voir qu'un effort, même maladroit, est fait.
Tu es donc sympathique.
0
Ce n'est pas toujours évident d'apprendre un langage sans support ! Il me manque des connaissances je pense basiques, j'espère qu'avec l'expérience je pourrais combler les manques.
Et merci beaucoup pour ton aide, je comprends ta démarche, j'espère que ca m'aidera à progresser
J'ai appliqué ton code, ca me semble parfait, mais j'ai remarqué que pour la CB3 (et elle uniquement) une des valeurs de ma liste n'est pas prise en compte.
Concrètement, ma liste contient : Acier, Titane, Aluminium, Bronze, et uniqement pour la CB3 lorsque je séléctionne Bronze, sa masse vol n'est pas mise dans la case ! Celle de la séléction précedente reste (alors que je demande un clearcontents de la case par sécurtié)
Saurais-tu dire pourquoi ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 11/10/2013 à 13:16
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.
0
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?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 11/10/2013 à 15:10
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é.
0
Rejoignez-nous