Code : Sélectionner tout - Visualiser dans une fenêtre à part Sql="Select Vet.Nom,Cli.Nom From [Animaux$A1:C120] Ani "
Code : Sélectionner tout - Visualiser dans une fenêtre à part Sql="Select Vet.Nom,Cli.Nom From [Animaux$A1:C120] Ani "
Bonjour
Une question en ADODB si on travaille sur le fichier en cours, cela prend-il bien les modifications en cours ou faut-il enregistrer le fichier ?
Sinon un simple dictionnaire des deux tableaux n'aurait pas pu suffire ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 Option Base 1 Private Dico_User As New Dictionary Private Sub TextBox1_Change() If (Dico_User.Exists(TextBox1.Text)) Then Label1.Caption = Dico_User(TextBox1.Text) Else Label1.Caption = "ID non valide" End Sub Private Sub UserForm_Initialize() Dim Tabl_User As ListObject, rs As ListRows Dim Temp As Variant Dim r As Double Set Tabl_User = Worksheets("Feuil1").ListObjects("Tableau_Test") Set rs = Tabl_User.ListRows For r = 1 To rs.Count Temp = rs(r).Range.Value Dico_User.Add CStr(Temp(1, 1)), Temp(1, 2) & " " & Temp(1, 3) Next r Set Tabl_User = Nothing Set rs = Nothing End Sub![]()
Je n'ai pas réussi mais j'arrive à mes fins avec :
Et avant ça, il y a ce code, appelé avec un Combobox Change, qui reprend les valeurs du tableau pour remplir le Userform (pour la modification de l'animal)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 Sub NameFinder() Dim Cn As ADODB.Connection Dim RstC As Object, RstV As Object Dim CSql As String, VSql As String, AniID As Integer AniID = AnMyRow.Range(1).Value 'Requête SQL pour retrouver le Nom Clients en fonction des ID.Cli dans la Feuille Animal CSql = " Select Cli.Nom From [Animal$] Ani " CSql = CSql & " Left Outer Join [Client$] Cli on Ani.IDCli = Cli.ID" CSql = CSql & " Where Ani.ID = " & AniID & " " 'Requête SQL pour retrouver le Nom Vétérinaires en fonction des ID.Vet dans la Feuille Veterinaire VSql = " Select Vet.Nom From [Animal$] Ani" VSql = VSql & " Left Outer Join [Veterinaire$] Vet on Ani.IDVet = Vet.ID" VSql = VSql & " Where Ani.ID = " & AniID & " " 'Lance les requêtes Set Cn = New ADODB.Connection With Cn .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=YES;""" Set RstC = .Execute(CSql) 'Ecrit le nom du client dans la cellule XFD2 Range("XFD2").CopyFromRecordset RstC Set RstV = .Execute(VSql) 'Ecrit le nom du vétérinaire dans la cellule XFD3 Range("XFD3").CopyFromRecordset RstV .Close End With Set Cn = Nothing End Sub
Merci beaucoup pour ton aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 Private Sub CboModif_Change() If CboModif.ListIndex <> -1 Then Set AnMyRow = Range("Animaux").ListObject.ListRows(CboModif.ListIndex + 1) End If AnValuesToControls Sub AnValuesToControls() NameFinder 'Importer les données du tableau "Clients" dans le formulaire With AnMyRow 'ListRow TxtID.Value = .Range(1).Value TxtNom.Value = .Range(2).Value TxtIDCli.Value = .Range(3).Value TxtIDVet.Value = .Range(4).Value CboFam.Value = .Range(5).Value CboRace.Value = .Range(6).Value CboSexe.Value = .Range(7).Value TxtInfo.Value = .Range(8).Value End With With Sheets("Animal") CboMaitre.Value = Range("XFD2").Value CboVet.Value = Range("XFD3").Value Range("XFD2") = "" Range("XFD3") = "" End With End Sub
bonjour 78chris,
oui si le fichier dispose d'un chemin d’accès Windows???
@bonjour Al__22,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Sub test() Dim wb As Workbook Set wb = Workbooks.Add wb.SaveAs Environ("temp") & "\toto.xlsx" With wb.Sheets(1) .Range("A1") = "Champ1" .Range("A2") = "toto" End With With CreateObject("ADODB.Connection") .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & wb.FullName & ";Extended Properties=""Excel 12.0;HDR=YES;""" Set Rst = .Execute("select * from [" & wb.Sheets(1).Name & "$]") ThisWorkbook.Sheets(1).Range("A15").CopyFromRecordset Rst 'Ecrit le résultat de la requête dans la cellule A15 .Close End With End Sub
en fait une requête c'est comme un dictionnaire!, c'est moins évident de prime abord mais c'est une collection également et plus rapide!
Dernière modification par Invité ; 27/08/2018 à 11h55.
@dysorthographie
Je le savais mais je pense surtout à nos petits collègues qui eux pataugent complet quand on commence à leur parler de LINQ, ADODB, etc.![]()
RE
Merci mais tu réponds oui à la 1ère ou 2ème question ?
J'ai remarqué avec d'autres méthodes d’accès que cela accède au fichier enregistré donc si on met en même temps le fichier à jour, les modifs ne sont pas prises si le fichier n'est par enregistré.
Ce pourquoi je demandais mais je pourrais aussi tester au lieu de t'embêter![]()
@dysorthographie,
@Floyd-44
joins un fichier Excel , en prenant soin de bidonner les informations confidentiel si il y en a
Voilà la bête (sans faire de jeu de mots...:),
PIECE JOINTE Actualisée
animal.xlsm
Partager