Commandes SQL dans VBA

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,
 

info69

XLDnaute Nouveau
Re : Commandes SQL dans VBA

Bonjour,

Ce n'est pas une question sur Excel mais une question sur le SQL. Change de forum :)

Essai avec un "truc" du type:

Code:
cde_SQL = "SELECT matricule, nom, prénom, SUM(nb_Jrs) AS Duree_Totale FROM [Feuil1$] GROUP BY  matricule, nom, prénom HAVING typ_absence = ' Dispo & congés' "

ou bien:
Code:
cde_SQL = "SELECT matricule, nom, prénom, SUM(nb_Jrs) AS Duree_Totale FROM [Feuil1$] WHERE typ_absence = ' Dispo & congés' GROUP BY  matricule, nom, prénom "

Et si problème, envoi ton fichier que l'on test cette requête...
++
 

BenHarber

XLDnaute Occasionnel
Re : Commandes SQL dans VBA

Bonjour info69,
Merci pour ta réponse rapide.

Les différents champs retenus dans la commande SQL (matricule, nom, prénom) sont bien alimentées dans mes variables monTab(0, nbEnr), monTab(1, nbEnr) et monTab(2, nbEnr). Seulement, quand je souhaite alimenter la variable monTab(3, nbEnr) du total de nombre de jours (Duree_Totale), j'ai le message suivant :
Erreur d'exécution '3265' Impossible de trouver l'objet dans la collection correspondant au nom ou à la référence ordinale demandée.

Peut-être aurais-je plus de facilités à me mettre à l’hébreu...?!
 

info69

XLDnaute Nouveau
Re : Commandes SQL dans VBA

Bizarre,
Faut voir le fichier, le bout de code...
Et puis l'expression : "Impossible de trouver l'objet dans la collection correspondant au nom ou à la référence ordinale demandée" - n'est pas une insulte, c'est juste que tu cherches à accéder à l’élément n°3 de la collection de champs (fields) de ton recordset qui n'existe pas...

Y a pas une boulette dans ce code?
Code:
monTab(2, nbEnr) = .Fields(2) 'Prénom
monTab(3, nbEnr) = .Fields(2) 'Type d’absence
Il faut être vigilant!

Qu'es ce qui me dit que tu ne fais pas:
Code:
monTab(2, nbEnr) = .Fields(2) 'Prénom
monTab(3, nbEnr) = .Fields(4) 'Type d’absence
:confused:
???
 

BenHarber

XLDnaute Occasionnel
Re : Commandes SQL dans VBA

Non pas de boulette mais simplement une recopie dans ce message trop rapide....

Quand à l'exemple, je vais chercher à en recréer un de toute pièces, car les fichier actuels constituent une appli impossible à transférer tel quel : ça va me demander un peu de temps....
Merci !
 

BenHarber

XLDnaute Occasionnel
Commandes SQL dans VBA [Non résolu]

Voilà 2 fichiers. Vous devez les enregistrer dans un même dossier pour que la macro fonctionne.

1) Le fichier 'Requetes' qui contient 2 onglets :
* onglet 'Requête 1' - La macro fonctionne : elle va piocher les enregistrements correspondant au code absence 'FAM' et les recopie à partir de la ligne 11
* onglet 'Requête 2' - La macro NE fonctionne PAS : j'aimerais faire la même requête mais en sommant le nombre de jours par matricule (et donc, n'avoir une ligne par matricule) : j'ai mis en bleu le résultat que je souhaiterais dans les colonnes J à O.

2) Le fichier 'Base' dans lequel ma macro va piocher les enregistrements voulus.

Avez-vous des idées ?
Merci d'avance !
BH
 

Pièces jointes

  • Requetes.xls
    79.5 KB · Affichages: 58
  • Base.xls
    38.5 KB · Affichages: 59
  • Requetes.xls
    79.5 KB · Affichages: 62
  • Base.xls
    38.5 KB · Affichages: 63
  • Requetes.xls
    79.5 KB · Affichages: 67
  • Base.xls
    38.5 KB · Affichages: 63

info69

XLDnaute Nouveau
Re : Commandes SQL dans VBA [Non résolu]

Avez-vous des idées ?
BH

Et bien, je te conseil de bien vérifier ton code après un copier/coller.
Sheets(maFeuille).Range("F" & 11 + j) = monTab(5, j) 'Durée d'absence
préférable à: Sheets(maFeuille).Range("F" & 11 + j) = monTab(7, j) 'Durée d'absence

De plus, préférer le nommage des champs:
monTab(5, nbEnr) = .Fields("DureeTotale") 'Durée d'absence

Moralité: rien ne sert de courrir il faut vérifier son code à temps...:rolleyes:
 

Pièces jointes

  • Requetes.xls
    79.5 KB · Affichages: 66
  • Requetes.xls
    79.5 KB · Affichages: 70
  • Requetes.xls
    79.5 KB · Affichages: 72

BenHarber

XLDnaute Occasionnel
Re : Commandes SQL dans VBA [Résolu]

Merci info69,
Je te dois une bougie orgueilleuse....heu ou plûtôt une fière chandelle !!

OK pour le copier-coller 'à la volée' pas vérifié .....Mais c''est surtout l'écriture ".Fields("DureeTotale")" que je n'aurais pas trouvée !

Encore merci !

Cordialement,
BH
 

Statistiques des forums

Discussions
311 725
Messages
2 081 939
Membres
101 844
dernier inscrit
pktla