BenHarber
XLDnaute Occasionnel
Bonjour le Forum,
J’ai une question relative à l’utilisation de requête SQL avec VBA.
J’ai actuellement le type fichier Excel suivant (comporte au réel 40 000 lignes et une trentaine de colonnes)
matricule||nom||prenom||typ_absence||Date_Deb||Date_Fin||nb_Jrs
00153||DELUNE||Claire||Dispo & congés||02/06/10||05/06/10||4
00870||HIBULERE||Pat||Dispo & congés||26/08/10||31/08/10||6
00153||DELUNE||Claire||Dispo & congés||05/06/13||21/06/13||17
que je requête, sans ouvrir, avec le code VBA suivant (pêché notamment sur ce forum : merci aux contributeurs !) et qui me retourne toutes les lignes adéquates
Dim wbkDerExtr As String
Dim Cn As Object, rqst As Object
'Définit le classeur fermé servant de base de données
wbkDerExtr = ThisWorkbook.Path & "\BD\" & Dir(ThisWorkbook.Path & "\BD\" & "Abs5ans*")
cde_SQL = "SELECT * FROM [Feuil1$] WHERE typ_absence = ' Dispo & congés '"
Set Cn = CreateObject("ADODB.Connection")
With Cn
.Provider = "MSDASQL"
.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
"DBQ=" & wbkDerExtr & "; ReadOnly=True;"
.Open
End With
Set rqst = CreateObject("ADODB.Connection")
Set rqst = Cn.Execute(cde_SQL)
'------------------------------------------------------------------------------------------------
Dim monTab()
Dim nbEnr As Integer
ReDim Preserve monTab(6, nbEnr)
If rqst.EOF Then ' astuce d'après @+Thierry xld
GoTo pas1
End If
'Affectation des membres de la requête dans un tableau intermédiaire : solution fournie par Michel_xld
With rqst
.MoveFirst
Do While Not .EOF
monTab(0, nbEnr) = .Fields(0) ' matricule
monTab(1, nbEnr) = .Fields(1) 'NOM
monTab(2, nbEnr) = .Fields(2) 'Prénom
monTab(3, nbEnr) = .Fields(2) 'Type d’absence
monTab(4, nbEnr) = .Fields(3) 'Date de début d'absence
monTab(5, nbEnr) = .Fields(4) 'Date de fin d'absence
monTab(6, nbEnr) = .Fields(5) 'Durée calendaire d'absence
nbEnr = nbEnr + 1
ReDim Preserve monTab(6, nbEnr)
.MoveNext
Loop
End With
'--- Fermeture connexion ---
Cn.Close
Set Cn = Nothing
Set rqst = Nothing
‘…etc
Je souhaiterais maintenant faire une requête qui ne me retourne qu’une ligne par agent (par ex. NOM/Prénom/Nb de jours total d’absence) : est-ce possible ?
J’avais commencé une commande SQL du type
cde_SQL = "SELECT * FROM [Feuil1$] SUM(nb_Jrs) AS Duree_Totale WHERE typ_absence = ' Dispo & congés '"
Mais ça plante (je pressens bien que ça provient de mon champ ‘Duree_Totale’ qui n’existe pas dans le fichier base) et que je n’ai déclaré nulle part.
Quelqu’un aurait-il une suggestion / solution à formuler ? (attention, je ne suis pas informaticien : je risque de ne pas comprendre tout ce que vous allez me dire….)
Cordialement,
J’ai une question relative à l’utilisation de requête SQL avec VBA.
J’ai actuellement le type fichier Excel suivant (comporte au réel 40 000 lignes et une trentaine de colonnes)
matricule||nom||prenom||typ_absence||Date_Deb||Date_Fin||nb_Jrs
00153||DELUNE||Claire||Dispo & congés||02/06/10||05/06/10||4
00870||HIBULERE||Pat||Dispo & congés||26/08/10||31/08/10||6
00153||DELUNE||Claire||Dispo & congés||05/06/13||21/06/13||17
que je requête, sans ouvrir, avec le code VBA suivant (pêché notamment sur ce forum : merci aux contributeurs !) et qui me retourne toutes les lignes adéquates
Dim wbkDerExtr As String
Dim Cn As Object, rqst As Object
'Définit le classeur fermé servant de base de données
wbkDerExtr = ThisWorkbook.Path & "\BD\" & Dir(ThisWorkbook.Path & "\BD\" & "Abs5ans*")
cde_SQL = "SELECT * FROM [Feuil1$] WHERE typ_absence = ' Dispo & congés '"
Set Cn = CreateObject("ADODB.Connection")
With Cn
.Provider = "MSDASQL"
.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
"DBQ=" & wbkDerExtr & "; ReadOnly=True;"
.Open
End With
Set rqst = CreateObject("ADODB.Connection")
Set rqst = Cn.Execute(cde_SQL)
'------------------------------------------------------------------------------------------------
Dim monTab()
Dim nbEnr As Integer
ReDim Preserve monTab(6, nbEnr)
If rqst.EOF Then ' astuce d'après @+Thierry xld
GoTo pas1
End If
'Affectation des membres de la requête dans un tableau intermédiaire : solution fournie par Michel_xld
With rqst
.MoveFirst
Do While Not .EOF
monTab(0, nbEnr) = .Fields(0) ' matricule
monTab(1, nbEnr) = .Fields(1) 'NOM
monTab(2, nbEnr) = .Fields(2) 'Prénom
monTab(3, nbEnr) = .Fields(2) 'Type d’absence
monTab(4, nbEnr) = .Fields(3) 'Date de début d'absence
monTab(5, nbEnr) = .Fields(4) 'Date de fin d'absence
monTab(6, nbEnr) = .Fields(5) 'Durée calendaire d'absence
nbEnr = nbEnr + 1
ReDim Preserve monTab(6, nbEnr)
.MoveNext
Loop
End With
'--- Fermeture connexion ---
Cn.Close
Set Cn = Nothing
Set rqst = Nothing
‘…etc
Je souhaiterais maintenant faire une requête qui ne me retourne qu’une ligne par agent (par ex. NOM/Prénom/Nb de jours total d’absence) : est-ce possible ?
J’avais commencé une commande SQL du type
cde_SQL = "SELECT * FROM [Feuil1$] SUM(nb_Jrs) AS Duree_Totale WHERE typ_absence = ' Dispo & congés '"
Mais ça plante (je pressens bien que ça provient de mon champ ‘Duree_Totale’ qui n’existe pas dans le fichier base) et que je n’ai déclaré nulle part.
Quelqu’un aurait-il une suggestion / solution à formuler ? (attention, je ne suis pas informaticien : je risque de ne pas comprendre tout ce que vous allez me dire….)
Cordialement,