Extraire valeur d'une colonne a partir de 2 combobox

Résolu
jeannoxxx Messages postés 6 Date d'inscription mercredi 20 juillet 2022 Statut Membre Dernière intervention 22 juillet 2022 - Modifié le 20 juil. 2022 à 09:13
vb95 Messages postés 3474 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 7 mai 2024 - 22 juil. 2022 à 15:55

bonjour a tous,

etant novice, je sollicites votre aide pour m extraire d une difficultée.

j ai un tableau de 10000 lignes avec les entetes suivants

zone                site                 batiment              ID

j'ai 2 combobox qui listent les valeurs de "site" et "batiment"

je voudrais extraire dans une textbox la valeur ID

j ai tenté le code ci-dessous mais la valeur renvoyé est "aléatoire"

Private Sub ComboBoxbatiment_Change()

'***************************affichage du noeud selon le site et la station***********************

'déclaration des variables
Dim ligne As Long

'rechercher les données dans la page bdd
Set ws = Sheets("occupation")
If Me.ComboBoxsite.ListIndex = -1 Or Me.ComboBoxbatiment.ListIndex = -1 Then Exit Sub
ligne = Me.ComboBoxsite.ListIndex + 2 & Me.ComboBoxbatiment.ListIndex + 2
Me.TextBoxnID = ws.Cells(ligne, "D")

end sub

ai-je bien fait de placer cela dans un combobox change?

j ai essayer avec Vlookup mais sans resultat.

j'arrive tres bien à partir d'une combobox mais pour 2 je cales.

En vous remerciant par avance pour votre aide.

Cdlt,

11 réponses

Whismeril Messages postés 19055 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 12 juin 2024 657
20 juil. 2022 à 09:20

Bonjour

quand on poste un code vBa (avec un B comme Basic) et qu'on choisit la coloration syntaxique adaptée à Java, ça fait une présentation bizarre... Je me suis permis de modifier ça. Et donc pour la suite, merci de choisir Basic.
 

Ton code montre que tu tentes de calculer le numéro de la ligne en fonction de l'index des combobox.

Mais comme on ne sait pas comment sont remplis les combobox, on ne peut pas savoir si cette démarche est la bonne ou pas.

Pour qu'on puisse essayer de t'aider on a besoin de voir le code qui remplit ces combobox.


Question subsidiaire, un ID est il unique, c'est à dire que 123456 ne pourra pas exister dans plusieurs bâtiments?


1
jeannoxxx Messages postés 6 Date d'inscription mercredi 20 juillet 2022 Statut Membre Dernière intervention 22 juillet 2022
20 juil. 2022 à 09:52

tout d'abord, un grand merci pour ta réponse rapide.

je suis désolé pour ma méprise pour la coloration.

pour être plus exhaustif, j ai refait un tableau

mes combobox sont remplis de la sorte:

pour la combobox site, elle va chercher le nom dans une feuille bdd qui ne contient que une occurance par site

'***************************choix du site*********************************************

'remplissage par données excel
Set ws = Sheets("bdd")
With Me.ComboBoxsite
'permet de lire les données de la ligne 2 de la colonne A jusqu'a la fin du tableau
For J = 2 To ws.Range("A" & Rows.Count).End(xlUp).Row
'remplissage du menu déroulant site
.AddItem ws.Range("A" & J)
Next J
End With

pour la comboboxbatiment

Private Sub ComboBoxsite_Change()

'************************choix de la batiment selon le site****************************
'effacer le contenu du menu déroulant des switchs
ComboBoxbatiment = Clear

'verifier qu'on a selectionné un site
If ComboBoxsite.Value <> "" Then
'aller chercher les nom des station dans occupation
Set ws_data = Worksheets("occupation")

'lire jusqu'a la derniere ligne du tableau
lstrw = ws_data.Cells(Rows.Count, 2).End(xlUp).Row
 
'On va rechercher dans la Colonne "A" et NON "C"'
Me.ComboBoxbatiment.Clear
Set MonDico = CreateObject("Scripting.Dictionary")
    For Each c In ws_data.Range("B2", "B65000")
    ' si famille alors on ajoute l'élément de la sous-famille au dictionnaire
        If c = Me.ComboBoxsite Then MonDico(c.Offset(0, 1).Value) = ""
    Next c
Me.ComboBoxbatiment.List = MonDico.keys


End If
End Sub

étant tout nouveau dans le monde de VBA, je n'ai peut être pas la bonne rigueur dans le codage. je suis preneur de toutes critiques constructives.

en espérant avoir apporté les éléments suffisant a la compréhension de mon problème

0
vb95 Messages postés 3474 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 7 mai 2024 169
20 juil. 2022 à 13:17

Bonjour

Ce n'est pas en se référençant aux Combobox que tu trouveras la solution .

Dans ComboboxBatiment vous indiquez le batiment par une variable de type String indiquant le batiment sélectionné.

Vous faites de même avec la ComboboxSite .

Ensuite il suffit de rechercher quel ligne du tableau a ces 2 paramètres ( Site et Batiment ) et vous trouverez L'ID .

Exemple : si le site est "bordeaux" et le batiment est "mairie" ce sont les les lignes 3 ou 4 du tableau qui donnent l'ID "b" .


0
jeannoxxx Messages postés 6 Date d'inscription mercredi 20 juillet 2022 Statut Membre Dernière intervention 22 juillet 2022
20 juil. 2022 à 13:32

grâce à mes pauvres connaissances, j ai traduit votre post en ceci mais cela ne marche pas. (je n 'arrive pas a mettre la coloration en normal alors que je sélectionne bien basic)

Private Sub ComboBoxstation_Change()

'***************************affichage du noeud selon le site et la station***********************

'déclaration des variables
Dim ligne As Long
Dim site As String
Dim station As String

site = ComboBoxsite.Value
station = ComboBoxstation.Value

'rechercher les données dans la page bdd
Set ws = Sheets("occupation")
If Me.ComboBoxsite.ListIndex = -1 Or Me.ComboBoxstation.ListIndex = -1 Then Exit Sub

For I = 2 To ws.Range("B" & Rows.Count).End(xlUp).Row

ligne = site + station
Me.TextBoxnoeud = ws.Cells(ligne, "D")
Next

End Sub
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vb95 Messages postés 3474 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 7 mai 2024 169
Modifié le 22 juil. 2022 à 01:52

Bonjour

1) Vous écrivez ligne 19 

ligne = site + station

ligne est une valeur numérique alors que station et site sont des valeurs chaine de caractères ( String en anglais ) .

C'est un peu comme si vous écriviez que 6 = "Alain" + "Jacques" 

2) C'est dans le tableau de 10000 lignes qu'il faut chercher la ligne où site et station sont égales aux 2 valeurs sélectionnées dans les 2 combobox .

Je suppose que ce tableau de 10000 lignes est contenu ici 

Set ws = Sheets("occupation")

il faut donc explorer ce tableau ligne par ligne pour trouver les valeurs identiques à celles contenues dans les Combobox

Pour récupérer la valeur d'une cellule sur une feuille Excel voir ceci : https://forums.commentcamarche.net/forum/affich-11344588-excel-vba-recuperer-la-valeur-d-une-cellule

0
dysorthographie Messages postés 95 Date d'inscription jeudi 27 janvier 2022 Statut Membre Dernière intervention 10 juin 2024 5
Modifié le 20 juil. 2022 à 20:15

Bonjour,

je te propose un solution à adapter à ta situation!

je n'es pas factorise la gestion ado! 

Private Sub UserForm_Initialize()
'***************************choix du site*********************************************

'remplissage par données excel


With CreateObject("ADODB.Connection")
     .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
               & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"""
     .Open
     Me.ComboBoxsite.Column = .Execute("SELECT  Distinct [ZONE] FROM [bdd$]").getrows
     .Close
 End With

End Sub

Private Sub ComboBoxsite_Change()

'************************choix de la batiment selon le site****************************
'effacer le contenu du menu déroulant des switchs
ComboBoxbatiment.Clear


'verifier qu'on a selectionné un site
If ComboBoxsite.Value <> "" Then
    With CreateObject("ADODB.Connection")
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                  & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"""
        .Open
        Me.ComboBoxbatiment.Column = .Execute("SELECT  Distinct [ColonneC] FROM [occupation$] Where [ZONE]='" & ComboBoxsite.Value & "'").getrows
        .Close
    End With
End If
End Sub
0
jeannoxxx Messages postés 6 Date d'inscription mercredi 20 juillet 2022 Statut Membre Dernière intervention 22 juillet 2022
Modifié le 22 juil. 2022 à 15:51

merci beaucoup à vous deux pour vos réponses

@dysorthographie: ta solution ne m'est pas disponible au vu de mes connaissances plus que limitées en VBA et nulles en ce qui concerne Access.

j'ai bien essayé de l'appliquer en remplissant les différents champs mais cela ne fonctionne pas

@vb95:

sur tes conseils, j'ai repensé mon script en cela

Set ws = Sheets("occupation")
site = ComboBoxsite.Value
station = ComboBoxstation.Value

ComboBoxstation = Clear

For I = 2 To ws.Range("B" & Rows.Count).End(xlUp).Row

'faire la corrélation entre le site et la colonne B et D du tableau a partir de la seconde ligne
If site = ws.Cells(ligne, 2).Value & batiment = ws.Cells(ligne, 3).Value Then
Me.TextBoxnoeud = ws.Cells(ligne, "D")

End If
Next

End If

End Sub

malheureusement, il m'indique une erreur dans ws.cells(ligne,2).value.

pourriez vous m'éclairer?

0
jeannoxxx Messages postés 6 Date d'inscription mercredi 20 juillet 2022 Statut Membre Dernière intervention 22 juillet 2022
Modifié le 22 juil. 2022 à 15:52

je viens à l'instant de trouver !!!!!!!

j ai supprimé la variable ligne et je l'ai remplacé par i dans la boucle For

If site = ws.Cells(i, 2).Value & batiment = ws.Cells(i, 3).Value Then
Me.TextBoxnoeud = ws.Cells(i, "D")

et ca marche à merveille.

Merci beaucoup pour votre aide qui a su me faire découvrir et comprendre un peu plus VBA.

Bonne continuation!

0
vb95 Messages postés 3474 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 7 mai 2024 169
Modifié le 21 juil. 2022 à 18:28

Bonjour

Si cela marche à merveille tant mieux !

Mais il y a un souci à la ligne 1

If site = ws.Cells(i, 2).Value & batiment = ws.Cells(i, 3).Value Then
Me.TextBoxnoeud = ws.Cells(i, "D")

Ce n'est pas "&" qui fait la condition comme quoi le site et le batiment de la ligne correspondent aux paramètres des Combobox .

Le "&" est utilisé pour concaténer ( mettre bout à bout ) 2 chaines de caractères .

Exemple : 

Dim Nom as String = "Durand"
Dim Prenom as String = "Jacques"
Dim Personne as String = Nom & " " & Prenom 

Et Personne vaudra "Durand Jacques"

Intéresses toi aux fonctions AND et OR en VBA ( fonctions ET et OU en bon français ) . Il faut que site ET batiment soient tous les deux = aux sélections des combobox .

De plus pourquoi commencer la boucle For avec I = 2 ? Il faut prendre en compte aussi la première ligne

Une fois ces soucis réglés et que la solution te satisfait pleinement va dans ton premier message et clique sur les 3 points en fin de ce message pour mettre la solution en résolu .  


0
jeannoxxx Messages postés 6 Date d'inscription mercredi 20 juillet 2022 Statut Membre Dernière intervention 22 juillet 2022
Modifié le 22 juil. 2022 à 08:21

effectivement, j ai été trop rapide lors du copier/coller et j ai pris l'ancienne version . Cela marche uniquement avec un AND et non un &

j ai i=2 car j ai un en-tête dans ma base de données.

Un grand merci a tous et en espérant que cette expérience puisse en aider d'autres.

Bonne continuation

0
vb95 Messages postés 3474 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 7 mai 2024 169
22 juil. 2022 à 15:55

Bonjour

Petite remarque : Excel n'a jamais été une base de données, c'est un tableur !

J'ai corrigé votre message .


0
Rejoignez-nous