Schtroumpfette
-
11 oct. 2013 à 10:14
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 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.
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 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és18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 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.
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 ?
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?
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é.