[VBA] problème Filter sur ADODB
Slyt
-
slyt -
slyt -
Bonjour,
Je programme en VBA un outil qui va chercher des éléments dans plusieurs tables suivants certains critères.
L'exécution de la requête dure à elle-seule environ 20 secondes. Or je dois l'effectuer plus de 700 fois, du coupje me suis tourné vers un filtre.
J'ai donc contruit ma requête sans certains filtres. Et c'est dans la boucle (les 700 fois) que j'appelle le filtre.
mais voilà j'ai l'erreur suivante : "Erreur d'exécution 3001 : Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another".
Voici en gros ce que cela donne :
--------------------------------------------------
Dim rRequete As ADODB.Recordset
Set rRequete = New ADODB.Recordset
rRequete.CursorLocation = adUseClient
sRequete = "SELECT DISTINCT TABLE1.[CHAMP1], TABLE2.[CHAMP2], TABLE3.[CHAMP3]" & _
" FROM ((TABLE1 INNER JOIN TABLE2 ON TABLE1.[CHAMP1] = TABLE2.[CHAMP1]) INNER JOIN TABLE3 ON (TABLE2.[CHAMPx] = TABLE3.[CHAMP1])" & _
" WHERE ((TABLE1.[CHAMP6] IN ('3367','3366','3361','3310')) AND (TABLE2.[CHAMP3] IN ('00','33','60','80'))"
rRequete.Open sRequete, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
for i = 0 to 700
sValue = ' récupération de la valeur
rRequete.Filter = "(TABLE3.[CHAMPx]='" & sValue & "')" <-- Erreur à ce niveau
Do While Not rRequete.EOF
' traitement du résultat...
rRequete.MoveNext
loop
i = i+1
next i
rRequete.Close
Set rRequete = Nothing
--------------------------------------------------
j'ai peur que l'erreur vienne du fait que j'ai déjà des conditions (WHERE) dans ma requête.
J'ai essayé d'effectuer la requête sans aucune condition (WHERE) mais elle met beaucoup trop de temps.
Est-ce que vous connaissez une limite à ce sujet ?
Si non, pouvez-vous me dire d'où peut venir cette erreur ?
Merci d'avance.
Je programme en VBA un outil qui va chercher des éléments dans plusieurs tables suivants certains critères.
L'exécution de la requête dure à elle-seule environ 20 secondes. Or je dois l'effectuer plus de 700 fois, du coupje me suis tourné vers un filtre.
J'ai donc contruit ma requête sans certains filtres. Et c'est dans la boucle (les 700 fois) que j'appelle le filtre.
mais voilà j'ai l'erreur suivante : "Erreur d'exécution 3001 : Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another".
Voici en gros ce que cela donne :
--------------------------------------------------
Dim rRequete As ADODB.Recordset
Set rRequete = New ADODB.Recordset
rRequete.CursorLocation = adUseClient
sRequete = "SELECT DISTINCT TABLE1.[CHAMP1], TABLE2.[CHAMP2], TABLE3.[CHAMP3]" & _
" FROM ((TABLE1 INNER JOIN TABLE2 ON TABLE1.[CHAMP1] = TABLE2.[CHAMP1]) INNER JOIN TABLE3 ON (TABLE2.[CHAMPx] = TABLE3.[CHAMP1])" & _
" WHERE ((TABLE1.[CHAMP6] IN ('3367','3366','3361','3310')) AND (TABLE2.[CHAMP3] IN ('00','33','60','80'))"
rRequete.Open sRequete, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
for i = 0 to 700
sValue = ' récupération de la valeur
rRequete.Filter = "(TABLE3.[CHAMPx]='" & sValue & "')" <-- Erreur à ce niveau
Do While Not rRequete.EOF
' traitement du résultat...
rRequete.MoveNext
loop
i = i+1
next i
rRequete.Close
Set rRequete = Nothing
--------------------------------------------------
j'ai peur que l'erreur vienne du fait que j'ai déjà des conditions (WHERE) dans ma requête.
J'ai essayé d'effectuer la requête sans aucune condition (WHERE) mais elle met beaucoup trop de temps.
Est-ce que vous connaissez une limite à ce sujet ?
Si non, pouvez-vous me dire d'où peut venir cette erreur ?
Merci d'avance.
A voir également:
- [VBA] problème Filter sur ADODB
- Excel compter cellule couleur sans vba - Guide
- Photo filter 7 - Télécharger - Retouche d'image
- Microsoft windows search filter host - Forum Windows Vista
- Vba attendre 1 seconde ✓ - Forum VB / VBA
- Vba ouvrir un fichier excel avec chemin ✓ - Forum VB / VBA
1 réponse
Pour info, j'ai trouvé la solution à mon problème.
Et comme ça peut servir à d'autres personnes, qui sait, je prend le temps de me répondre.
Pour rappel, l'erreur était ici :
rRequete.Filter = "(TABLE3.[CHAMPx]='" & sValue & "')"
A priori, filter n'aime pas l'information TABLE3.
Il faut par conséquent paramétrer ainsi :
rRequete.Filter = "([CHAMPx]='" & sValue & "')"
Et là ça marche ! Ca me fait passer de 20s à 1s par boucle.
Merci quand même.
Et comme ça peut servir à d'autres personnes, qui sait, je prend le temps de me répondre.
Pour rappel, l'erreur était ici :
rRequete.Filter = "(TABLE3.[CHAMPx]='" & sValue & "')"
A priori, filter n'aime pas l'information TABLE3.
Il faut par conséquent paramétrer ainsi :
rRequete.Filter = "([CHAMPx]='" & sValue & "')"
Et là ça marche ! Ca me fait passer de 20s à 1s par boucle.
Merci quand même.