VBA et SQL

nak

XLDnaute Occasionnel
Bonjour à tous,

Je suis toujours sur mon projet de base Excel avec un fichier qui me sert pour saisir les enregistrements et un second qui me sert à stocker les enregistrements.

Je suis arriver à adapter le code d'exportation pour les fichiers XLSX.

Aujourd'hui, je me concentre sur la récupération des données (selon condition).

Dans un premier temps j'aimerais adapter le code SQL de l'ami Habitude pour importer à partir d'un XLSX.

Le code fonctionnel pour XLS:
VB:
Sub extractionValeurCelluleClasseurFerme()
    Application.ScreenUpdating = False: Range("A11").Resize(Range("A" & 2 ^ 20).End(xlUp).Row, 20).ClearContents
    Donnee = Range("F4").Value: Set Source = New ADODB.Connection
    Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.Path & "\base.xls" & ";Extended Properties=""Excel 8.0;HDR=Yes;"";"
    Range("A11").CopyFromRecordset Source.Execute("SELECT * FROM [Feuil1$] WHERE Donnée_2= '" & Donnee & "'")
    Source.Close
    Set Source = Nothing
    Application.ScreenUpdating = True
End Sub

J'ai essayé de l'adapter pour du XLSX mais cela ne veut pas:
VB:
Sub extractionValeurCelluleClasseurFermeXLSX()
    Application.ScreenUpdating = False: Range("A11").Resize(Range("A" & 2 ^ 20).End(xlUp).Row, 20).ClearContents
    Donnee = Range("F4").Value: Set Source = New ADODB.Connection
    Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\base.xlsx" & ";Extended Properties=""Excel 12.0;HDR=Yes;"";"
    Range("A11").CopyFromRecordset Source.Execute("SELECT * FROM [Feuil1$] WHERE Donnée_2= '" & Donnee & "'")
    Source.Close
    Set Source = Nothing
    Application.ScreenUpdating = True
End Sub

Avez-vous une idée, une proposition ?


Dans un second temps, j'aimerais pouvoir ajouter une condition. Mais impossible, même avec AND:
VB:
Range("A11").CopyFromRecordset Source.Execute("SELECT * FROM [Feuil1$] WHERE Donnée_2= '" & Donnee & "'" & Donnée_4 = "'" & Donnee2 & "'")

Merci

A+
 
Dernière édition:

nak

XLDnaute Occasionnel
Re : VBA et SQL

Bonsoir,

J'ai trouvé la solution pour mon défaut de connexion au fichier XLSX ! Il suffisait de supprimer le provider OLEDB.4.0.

VB:
Sub extractionValeurCelluleClasseurFermeXLSX()
    Application.ScreenUpdating = False: Range("A11").Resize(Range("A" & 2 ^ 20).End(xlUp).Row, 20).ClearContents
    Donnee = Range("F4").Value: Set Source = New ADODB.Connection
    Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\base.xlsx" & ";Extended Properties=""Excel 12.0;HDR=Yes;"";"
    Range("A11").CopyFromRecordset Source.Execute("SELECT * FROM [Feuil1$] WHERE Donnée_2= '" & Donnee & "'")
    Source.Close
    Set Source = Nothing
    Application.ScreenUpdating = True
End Sub


Du coup il me reste à intégrer une deuxième donnée dans mon SELECT FROM.
Là j'ai vraiment du mal, je ne trouve pas d'exemple...

Pouvez-vous m'aider SVP ?

Merci
 

Pièces jointes

  • saisie-filtreSQL-v2.zip
    37.6 KB · Affichages: 19

nak

XLDnaute Occasionnel
Re : VBA et SQL

Bon, je n'arrive à rien... :(

Code:
Sub extractionValeurCelluleClasseurFerme2()
    Application.ScreenUpdating = False: Range("A11").Resize(Range("A" & 2 ^ 20).End(xlUp).Row, 20).ClearContents
    Donnee = Range("F4").Value: Set Source = New ADODB.Connection
    Donnee2 = Range("F5").Value
    Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.Path & "\base.xls" & ";Extended Properties=""Excel 8.0;HDR=Yes;"";"
    Range("A11").CopyFromRecordset Source.Execute("SELECT * FROM [Feuil1$] WHERE Donnée_2= '" & Donnee & "'" And Donnée_4 = "'" & Donnee2 & "'")
    Source.Close
    Set Source = Nothing
    Application.ScreenUpdating = True
End Sub

Mon
Code:
("SELECT * FROM [Feuil1$] WHERE Donnée_2= '" & Donnee & "'" And Donnée_4 = "'" & Donnee2 & "'")
me pose problème. Pourtant les différents tuto montrent bien l'utilisation du AND...
Lorsque je rajoute des parenthèses c'est le même problème...

Et dire qu'après je veux pouvoir extraire les données entre deux dates. :) C'est pas gagné ! lol

Merci
 

Habitude

XLDnaute Accro
Re : VBA et SQL

Dans un second temps, j'aimerais pouvoir ajouter une condition. Mais impossible, même avec AND:
VB:
Range("A11").CopyFromRecordset Source.Execute("SELECT * FROM [Feuil1$] WHERE Donnée_2= '" & Donnee & "'" & Donnée_4 = "'" & Donnee2 & "'")

Bonjour

Il manque le AND dans ton code

VB:
Range("A11").CopyFromRecordset Source.Execute("SELECT * FROM [Feuil1$] WHERE Donnée_2= '" & Donnee & "' AND Donnée_4 = "'" & Donnee2 & "'")
 

nak

XLDnaute Occasionnel
Re : VBA et SQL

ça marche !

VB:
Range("A11").CopyFromRecordset Source.Execute("SELECT * FROM [Feuil1$] WHERE Donnée_2= '" & Donnee & "' And Donnée_4 = '" & Donnee2 & "'")

J'avais mis un " de trop après donnée_4 ! ça tien vraiment à rien ! :)

Une nouvelle victoire ! Maintenant je vais tester avec des dates... aïe!

Merci

A+
 

nak

XLDnaute Occasionnel
Re : VBA et SQL

Et re bonsoir !

Ce soir grosse avancée, pour ceux que ça intéresse je vous mets le code pour extraire l'intervalle entre deux dates :

VB:
Sub extractionValeurIntervalleXLSX()
    Application.ScreenUpdating = False: Range("A11").Resize(Range("A" & 2 ^ 20).End(xlUp).Row, 20).ClearContents
    Debut = Range("E7").Value: Set Source = New ADODB.Connection
    Fin = Range("F7").Value
    Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\base.xlsx" & ";Extended Properties=""Excel 12.0;HDR=Yes;"";"
    Range("A11").CopyFromRecordset Source.Execute("SELECT * FROM [Feuil1$] WHERE Donnée_3 BETWEEN #" & Format(Debut, "m/d/yyyy hh:mm:ss") & "# And #" & Format(Fin, "m/d/yyyy hh:mm:ss") & "#")
    Source.Close
    Set Source = Nothing
    Application.ScreenUpdating = True
End Sub

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 294
Messages
2 086 895
Membres
103 404
dernier inscrit
sultan87