Convertir une boucle VBA en requête SQL
Résolu
Phoenellion
Messages postés
131
Statut
Membre
-
Phoenellion Messages postés 131 Statut Membre -
Phoenellion Messages postés 131 Statut Membre -
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 kindle en epub - Guide
- Convertir audio en texte word - Guide
- Convertir hevc en jpg - 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