Optimisation traitement recordset
J'ai un tableau excel de Clients avec leur date d'inscription et le montant de transactions le jour de l'inscription.
Client |
Inscription_Date |
TransactionAmount |
6580194354 |
01/09/2016 |
|
6591569785 |
01/09/2016 |
|
6580522050 |
01/09/2016 |
|
6580672633 |
01/09/2016 |
|
6590493203 |
01/09/2016 |
|
6590316048 |
01/09/2016 |
|
6580107441 |
02/09/2016 |
|
6580671133 |
02/09/2016 |
|
6580642995 |
02/09/2016 |
|
6592965155 |
03/09/2016 |
|
6590818648 |
03/09/2016 |
|
Je dois remplir la colonne 3 avec le montant de la première transaction effectuée par chaque client le jour de l'inscription (si une transaction n'est pas faite le jour de la transaction, je ne la considère pas).
Pour cela, j'ai une base de données Access avec toutes les transactions client, sur laquelle je fais mes requêtes.
Etape 1 - J'établis la liste de mes clients
Code:
1 2 3 4 5 6 7 8 9 10 11
|
'Je récupère la plage qui contient les clients
Set myRange_client = ActiveSheet.Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row)
'Pour chaque client
For Each cell_client In myRange_client
'Je concatène l'ensemble des MSISDN dans une chaine (attention, la liste commence par une virgule qu'il faut retirer
Listeclient = Listeclient & ",'" & cell_client.Value & "'"
'Je passe à l'inscription suivante pour évluer le montant du cash-in
Next cell_client
'Je supprime la virgule en début de liste de Pdv
Listeclient = Mid$(Listeclient, 2) |
Etape 2 : Je fais une requête pour charger un recordset qui contient les transactions des clients
Code:
1 2 3 4 5 6
|
'Je configure la requête SQL
strSql = "SELECT DISTINCT Client, Date, TransactionAmount FROM TransactionsClient WHERE Status Like 'Transaction Success' AND Payee IN (" & Listeclient & ") Order by Date;"
'Je lance la requête
Set rs = cn.Execute(strSql) |
ETape 3 : Je parcours ma liste de client pour affecter le montant de la transaction qui a été effectuée le jour de l'inscription grâce à une recherche sur mon recordset
Le code m'a été souflé par dysorthographie hier, il marche bien.
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
For Each cell In myRange_client
rs.MoveFirst
rs.Filter = "[" & rs(0).Name & "] ='" & .Cells(cell.Row, "A").Value & "' AND [" & rs(1).Name & "] ='"&.Cells(cell.Row, "B").Value&&'"
If rs.EOF = False Then
'S'il y a une transaction le jour de l'inscription pour le client en cours, j'inscris le montant dans la ligne
.Cells(cell.Row, "D").Value = rs(2)
Else
'S'il n'y a pas de transaction le jour de l'inscription pour le client en cours, j'inscris 0
.Cells(cell.Row, "D").Value = 0
End If
Next cell |
L'ensemble du code fonctionne mais il prend plus de 8H.
Est-ce qu'il y a une méthode qui pourrait me permettre d'obtenir un traitement bien plus rapide ?