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?
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
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
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" .
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionBonjour
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
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
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?
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!
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 .
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
Bonjour
Petite remarque : Excel n'a jamais été une base de données, c'est un tableur !
J'ai corrigé votre message .