Pas mal ! Mais restons simple avec cette formule comme un débutant !
A partir de la formule française cela donne bien nativement pour la ligne n°9 : =IF(H9="T",L9&"_"&B9) …
• Si H est égale à T alors la concaténation est renvoyée sinon c'est la valeur FAUX.
En VBA cette valeur False doit être éliminée de la matrice (*) renvoyée par la formule via la fonction Filter.
• Cette formule étant intégrée en VBA dans une chaîne de caractères, tout guillemet de la formule doit y être doublé.
• Le classeur pouvant comporter plusieurs lignes, dans l'exemple jusqu'à la ligne n°14,
il faut adapter la formule en conséquence, du genre H9:H14 etc …
Mais comme le nombre de lignes n'est pas figé, il faudra au préalable déterminer le n° de la dernière ligne
et donc ce numéro dans la formule codée en VBA sera identifié par le caractère # par exemple,
remplacé lors de l'évaluation de la formule par le numéro réel de la dernière ligne.
• Comme la fonction VBA Filter n'accepte qu'une matrice unidimensionnelle comme une ligne par exemple,
les données étant en colonne donc en deux dimensions, il faut adapter la formule via TRANSPOSE.
De mon côté ayant ouvert l'exemple sur une version 2003 qui parfois convertit les CodeName des feuilles de calculs d'un .xlsx
- anglais vers français par exemple ou même de français à français avec une renumérotation des CodeName -
dans les codes suivants Feuil2 représente la feuille source BD et Feuil3 celle nommée T contenant la liste déroulante,
à vérifier et à adapter de votre côté si besoin …
Code alimentant la liste déroulante à placer dans le module de la feuille T :
1 2 3 4
| Friend Sub Worksheet_Activate()
V = Application.Max(Feuil2.Cells(Rows.Count, 8).End(xlUp).Row, 10)
ComboBox1.List = Filter(Feuil2.Evaluate(Replace("TRANSPOSE(IF(H9:H#=""T"",L9:L#&""_""&B9:B#))", "#", V)), False, False)
End Sub |
V contient le numéro de la dernière ligne; je n'aime pas utiliser une variable pour une unique utilisation
mais à des fins de lisibilité du code, comme j'aurais pu aussi placer la formule dans une constante …
Code lors de l'ouverture du classeur donc à placer dans le module du classeur ThisWorkbook :
1 2 3 4
| Private Sub Workbook_Open()
Feuil3.ComboBox1.Value = ""
If Me.ActiveSheet.Index = Feuil3.Index Then Feuil3.Worksheet_Activate
End Sub |
(*) Comme ne l'indique pas l'aide VBA la puissante fonction Evaluate accepte le calcul matriciel !
___________________________________________________________________________________________________________
Pour apprendre quelque chose aux gens, il faut mélanger ce qu’ils connaissent avec ce qu’ils ignorent. (Pablo Picasso)
Partager