Convertir une boucle VBA en requête SQL
Résolu
Phoenellion
Messages postés
116
Date d'inscription
Statut
Membre
Dernière intervention
-
Phoenellion Messages postés 116 Date d'inscription Statut Membre Dernière intervention -
Phoenellion Messages postés 116 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous,
je me mets à Access car Excel ne suffit hélas plus. Du coup, je bute quant à la convertion de cette boucle en une requête SQL car elle est un peu particulière.
Elle s'exécute sur un classeur ou il y a le détail de toutes les ventes avec chaque quantité vendue et chaque date de vente. Chaque article apparaît donc plus d'une fois.
L'objectif est de :
- ne garder que la dernière date de vente pour chaque article
- faire le cumul des ventes uniquement pour le mois en cours et si l'article enregistre des ventes pour ce mois.
Exemple, nous sommes en février 2012 :
si l'article n'a pas fait de ventes en février 2012, je garde simplement la dernière date à la quelle il a été vendu.
si l'article a été vendu au cours de février 2012, je fais le total des ventes uniquement pour février 2012 (j'égnore les ventes antérieurs) et je garde sa dernière date de vente.
Je ne connais rien au SQL, et je suis bien incapable de le faire, mais je serai très reconnaissant si quelqu'un pouvait juste m'indiquer quelles sont les commandes à utiliser, car je ne veux pas non plus demander qu'on fasse tout le boulot à ma place.
Merci d'avance
@+
Phoe
je me mets à Access car Excel ne suffit hélas plus. Du coup, je bute quant à la convertion de cette boucle en une requête SQL car elle est un peu particulière.
Dim TabEntrée(), TabSortie() As Variant xlApp.Cells.Sort Key1:=xlApp.Cells(1, 1), order1:=xlAscending, Header:=xlYes ColMax = xlApp.Cells(1, 1).End(xlToRight).Column TabEntrée = xlApp.Range(xlApp.Cells(1, 1), xlApp.Cells(LigMax, ColMax)).Value ReDim TabSortie(LigMax, ColMax) As Variant x2 = 0 For x1 = 1 To UBound(TabEntrée, 1) - 1 If Not TabEntrée(x1 + 1, 1) = TabEntrée(x1, 1) Then TabSortie(x2, 0) = TabEntrée(x1 + 1, 1) TabSortie(x2, 2) = TabEntrée(x1 + 1, 3) x = x1 + 1 Do While Month(TabEntrée(x, 3)) = Mois And Year(TabEntrée(x, 3)) = Année If x = x1 + 1 Then TabSortie(x2, 1) = 0 If TabSortie(x2, 1) = 0 And Not TabEntrée(x + 1, 1) = TabEntrée(x, 1) And Not TabEntrée(x - 1, 1) = TabEntrée(x, 1) Then TabSortie(x2, 1) = TabSortie(x2, 1) + TabEntrée(x, 2) Exit Do End If If TabEntrée(x + 1, 1) = TabEntrée(x, 1) Or TabEntrée(x - 1, 1) = TabEntrée(x, 1) Then TabSortie(x2, 1) = TabSortie(x2, 1) + TabEntrée(x, 2) End If If Not TabEntrée(x + 1, 1) = TabEntrée(x, 1) Then Exit Do x = x + 1 Loop x2 = x2 + 1 End If Next x1
Elle s'exécute sur un classeur ou il y a le détail de toutes les ventes avec chaque quantité vendue et chaque date de vente. Chaque article apparaît donc plus d'une fois.
L'objectif est de :
- ne garder que la dernière date de vente pour chaque article
- faire le cumul des ventes uniquement pour le mois en cours et si l'article enregistre des ventes pour ce mois.
Exemple, nous sommes en février 2012 :
si l'article n'a pas fait de ventes en février 2012, je garde simplement la dernière date à la quelle il a été vendu.
si l'article a été vendu au cours de février 2012, je fais le total des ventes uniquement pour février 2012 (j'égnore les ventes antérieurs) et je garde sa dernière date de vente.
Je ne connais rien au SQL, et je suis bien incapable de le faire, mais je serai très reconnaissant si quelqu'un pouvait juste m'indiquer quelles sont les commandes à utiliser, car je ne veux pas non plus demander qu'on fasse tout le boulot à ma place.
Merci d'avance
@+
Phoe
A voir également:
- Convertir une boucle VBA en requête SQL
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Convertir epub en kindle - Guide
- Convertir youtube en mp3 avec audacity - Guide
- Convertir kindle en epub - Guide
- Convertir audio en texte word - Guide
1 réponse
Bonjour à tous.
N'étant pas très doué avec Access, j'ai contourné le problème autrement.
J'ai directement passé la table access en variable tableau, puis en adaptant le code initial, j'ai pu obtenir le résultat escompté. pour ceux que ça intéresserait, voici mon code :
A partir de là, toute opération est possible. Et contrairement à ce que l'ont pourrait penser, c'est très rapide.
3 500 000 enregistrements chargés en 30 secondes (core i7, 4Go).
@+
Phoe
N'étant pas très doué avec Access, j'ai contourné le problème autrement.
J'ai directement passé la table access en variable tableau, puis en adaptant le code initial, j'ai pu obtenir le résultat escompté. pour ceux que ça intéresserait, voici mon code :
Dim TabEntrée, TabSortie As Variant Dim DetFact As Recordset Set DetFact = CurrentDb.OpenRecordset("Prépa_DetFact") Dim Row, x1, x2, x As Long Dim Mois, Année As Integer Mois = 2 Année = 2012 ReDim TabEntrée(DetFact.RecordCount, 3) 'Chargement de la table Prépa_DetFact DetFact.MoveFirst x = 1 For x = 1 To DetFact.RecordCount If DetFact("NART") <> "" Then TabEntrée(x, 0) = DetFact("NART") TabEntrée(x, 1) = DetFact("QTE") TabEntrée(x, 2) = DetFact("DATFACT") End If DetFact.MoveNext Next x
A partir de là, toute opération est possible. Et contrairement à ce que l'ont pourrait penser, c'est très rapide.
3 500 000 enregistrements chargés en 30 secondes (core i7, 4Go).
@+
Phoe