2 pièce(s) jointe(s)
Requêtes SQL sur fichiers .xls "fermés"
Bonjour à tous,
C'est sûrement ma première publication sur developpez.net, mais j'ai pu me renseigner sur nombre de forums existants, et je n'ai pas encore trouvé de solution à mon problème.. Je vous remercie d'avance de l'attention que vous y porterez :)
Je suis actuellement en stage en entreprise, et un de mes travaux m'a mené à explorer l'utilisation du langage SQL sur des fichiers Excel lourds, intégré au code VBA (celui-ci étant trop lent pour faire ce que je souhaite). L'entreprise dans laquelle je suis fonctionne avec des fichiers Excel depuis un moment, il n'y a donc pas de possibilité de convertir ces fichiers en BD Access, ils sont d'ailleurs trop nombreux pour que je les transforme un par un, et mon but est de développer un outil qui leur sera utile après mon départ, donc à leur portée (sous Excel).
Voici mon problème :
Un fichier .xls contient un tableau (ne commençant pas à la ligne 1 malheureusement, mais à la ligne 3). Dans ce tableau, une colonne (la 7ème, donc G) peut contenir deux valeurs (vide ou "X"), et la première colonne indique une région. J'aimerai reporter dans une TextBox d'un UserForm les valeurs des colonnes 2, 3, 4, 5 et 6 de ce tableau si la 7ème colonne contient "X", ou est vide (choix fait par l'utilisateur par des boutons d'option), et si la colonne 1 correspond au choix fait par l'utilisateur dans une ComboBox. Je connais relativement bien les langages SQL et VBA pour Excel, mais je n'ai jamais travaillé auparavant en mélangeant les deux, et le fait que le fichier soit un .xls semble compliquer la tâche..
Quand j'exécute mon code, j'ai l'erreur : Pièce jointe 484558
Voici mon code :
Code:
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| Private Sub CommandButton1_Click()
Dim Cn As ADODB.Connection
Dim Fichier As String
Dim NomFeuille As String, texte_SQL As String
Dim Rst As ADODB.Recordset
'Je travaille sur un réseau de fichier commun, tout le monde ne l'a pas installé sur le même disque, d'où la navigation par ChDir
ChDir (ThisWorkbook.Path)
ChDir ".."
ChDir ".."
'Les ComboBox permettent de déterminer le fichier que l'utilisateur veut consulter
'ComboBox1 : initiales de la région ; 2 : Département ; 4 : numéro de mois ; 5 : type de contrôle
Fichier = CurDir() & "\Source\VIGILANCE\Contrôles réalisés\" & ComboBox1.Value & "\" & ComboBox5.Value & "\Ctrl_réalisés_" & Left(ComboBox5.Value, 1) & "_" & ComboBox4.Value & "_2019.xls"
NomFeuille = "Ctrl_réalisés_" & Left(ComboBox5.Value, 1) & "_" & ComboBox4.Value & "_2019"
Set Cn = New ADODB.Connection
With Cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & Fichier & _
";Extended Properties=Excel 8.0;"
.Open 'L'erreur surligne cette ligne, mais débutant dans ce domaine, je ne vois pas comment résoudre le problème, sachant que l'extension du fichier doit rester .xls
End With
For Each bouton_conformite In Frame1.Controls
If bouton_conformite.Value Then
If bouton_conformite.Caption = "Conformes" Then
texte_SQL = "SELECT * FROM [" & NomFeuille & "$] WHERE Conformes = 'X'"
Else
texte_SQL = "SELECT * FROM [" & NomFeuille & "$] WHERE Conformes = ''"
End If
End If
Next
Set Rst = New ADODB.Recordset
Set Rst = Cn.Execute(texte_SQL)
TextBox1.Value.CopyFromRecordset Rst
Cn.Close
Set Cn = Nothing
End Sub |
Et un visuel de mon UF :
Pièce jointe 484555
Si quelqu'un aurait un indice à me donner (ou une solution) ça m'aiderait vachement !
Je sais qu'il existe d'autres solutions plus simples, mais elles nécessiteraient un temps conséquent, et le but de mon stage reste d'apprendre de nouvelles façons de faire et de me confronter à de nouveaux problèmes.
Je sais aussi qu'il y aura un problème venant du "WHERE" de ma requête, sachant que les entêtes ne se situent pas sur la première ligne du fichier, mais ce n'est pour le moment pas le problème..
J'ai copié les chemins directement depuis l'explorateur de fichier, de même pour le nom des feuilles, en remplaçant seulement les informations changeant d'un fichier à l'autre.
Merci à ceux qui auront essayé ou eu le courage de tout lire !
Et bonne journée à tous :)