quantum59
Messages postés7Date d'inscriptionmercredi 26 novembre 2008StatutMembreDernière intervention11 décembre 2008
-
7 déc. 2008 à 19:07
quantum59
Messages postés7Date d'inscriptionmercredi 26 novembre 2008StatutMembreDernière intervention11 décembre 2008
-
8 déc. 2008 à 19:14
Bonjour,
Débutant en VB et en access, j'ai créé une table et un code VBA.
Dans mon code je fais une recherche dans une table qui contient pas moins de 46000 enregistrements.
Actuellement, j'ai le code suivant qui tourne:
ISIN_in_base = False
Entreprises.MoveFirst
While Not Entreprises.EOF
With Entreprises
EntreprisesISIN = !ISIN
EntreprisesNum = !numero_euronext
tmp_ISIN = aRes(i, 1) 'valeur1 que je recherche dans la base
'controle tout les enregistrements si le code ISIN associé Euronext_Numero est deja present If ((EntreprisesNum Euronext_Numero) And (EntreprisesISIN tmp_ISIN)) Then
ISIN_in_base = True
'Debug.Print "le code ISIN " & tmp_ISIN & " avec le numero " & Euronext_Numero; " est deja present dans la base"
Entreprises.MoveLast
End If
End With
Entreprises.MoveNext
Wend
Ce code marche très bien et me dit bien si le code ISIN associé à Euronext_Numero est pésent dans ma base, seulement il contrôle les 46000 Enregistrements, afin de comparer avec les valeurs que je veux inséré dans la base.
Vous imaginez donc bien que ca prend énormément de temp a rechercher dans ma base....
Je cherche donc à optimiser mon code... qq'un peut m'aider?
merci beaucoup
A voir également:
Simplification de code pour effectuer une recherche dans une table
nhervagault
Messages postés6063Date d'inscriptiondimanche 13 avril 2003StatutMembreDernière intervention15 juillet 201137 7 déc. 2008 à 22:16
Salut
Il faut que tu passes par une requete SQL
avec le where basé sur la condition de ton if
apres tu lis seulement
le premier enregistrement et le tour est joué.
Pas besoin de lire toute la table access c'est le faire
et pour aller plus loin place des index sur les bons champs et tu auras
des performances encore meilleures;
access est fait pour faire du SQL alors pourquoi ne pas utiliser ce langage ???
quantum59
Messages postés7Date d'inscriptionmercredi 26 novembre 2008StatutMembreDernière intervention11 décembre 2008 7 déc. 2008 à 22:26
Merci pour ta réponse
euh....parce que je connais pas du tout SQL..... j'ai déjà du mal avec VBA.....
Saurais-tu m'aider pour coder ce morceau? j'ai besoin de faire une recherche en fonction de 2 champ d'une table et de comparer en fonction de 2 variables....
comment implémenter une requete SQL dans mon code VBA?
quantum59
Messages postés7Date d'inscriptionmercredi 26 novembre 2008StatutMembreDernière intervention11 décembre 2008 7 déc. 2008 à 22:38
j'ai creer une requete qui me permet de faire une recherche en fonction de mes critères, seulement je ne sais pas l'implémenter en VBA
la requete est :
SELECT Entreprises.Numero_Euronext, Entreprises.ISIN
FROM Entreprises
WHERE (((Entreprises.Numero_Euronext)=14) AND ((Entreprises.ISIN)="FR0010377127"));
ou 14 devrait être une variable1
et "FR0010377127" une variable2
j'aurais besoin que si la requete trouve un résultat, elle me mette une variable3 a true, sinon false....
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 8 déc. 2008 à 01:27
Salut
Quantum59 a raison, il ne faut charger dans le RecordSet que les enregistrements qu'il te faut, sinon la mémoire et le temps de traitement vont être énormes.
Pour ce qui est de l'insertion de variable dans une chaine :
SQL = "SELECT Numero_Euronext, ISIN " & _
" FROM Entreprises " & _
" WHERE Numero_Euronext = " & Variable1 & _
" AND ISIN = '" & Variable2 & "'"
Ici, Variable1 est une variable dimensionnée comme chiffre (Integer, Long, ...)
Si, dans ta DB , le champ Numero_Euronext est déclaré comme un texte, il faudra mettre des ' devant et derrière la variable, comme pour Variable2.
Variable2 est une variable chaine (String)
Rappel en SQL :
- Les textes doivent être encadrés par des apostrophes '
- Les dates, encadrées par des #
- Les chiffres n'ont pas besoin d'encadrement
Il n'est pas nécessaire de rappeler le nom de la table devant tous les champs s'il s'agit d'une requète sur une seule table (mais ce n'est pas gènant de les mettre)
Eviter de surcharger avec les parenthèses inutiles.
Vala
Jack, =fr MVP VB NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
quantum59
Messages postés7Date d'inscriptionmercredi 26 novembre 2008StatutMembreDernière intervention11 décembre 2008 8 déc. 2008 à 19:14
Merci à Tous pour vos réponse, ma fonction fonctionne comme je l'entend.
Si ça peux aider qq'un, je laisse mon code ci dessous:
Function Recherche_Entreprise(NomdelaTable As String, Enext_Num As Long, IsiniCSV As String) As Boolean ' fonction qui teste si l'entreprise existe deja pour le meme code euronext
On Error GoTo Proc_Exit
Recherche_Entreprise = False
Dim db As DAO.Recordset
Dim SQL As String
'Mise en forme de la requete SQL
SQL = "SELECT Numero_Euronext, ISIN " & _
"FROM " & NomdelaTable & _
" WHERE Numero_Euronext = " & Enext_Num & _
" AND ISIN = '" & IsiniCSV & "'"
' Ouverture du recordset
Set db = CurrentDb.OpenRecordset(SQL, dbOpenForwardOnly, dbReadOnly) If db.RecordCount >1 Then Recherche_Entreprise True
' Fermeture du Recordset
db.Close
Proc_Exit:
On Error Resume Next
Set db = Nothing
End Function