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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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)
Le code m'a été souflé par dysorthographie hier, il marche bien.
L'ensemble du code fonctionne mais il prend plus de 8H.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Est-ce qu'il y a une méthode qui pourrait me permettre d'obtenir un traitement bien plus rapide ?
Partager