Option Explicit
'*****************************************************************************************************
'Pose des questions si tu ne comprends pas.
' En gros:
' TableUnique mets, comme son nom l'indique, dans un tableau unique, l'un derrière l'autre, toutes les lignes de facturation préexistantes puis derrière toutes les lignes de commandes, en ajoutant devant une colonne 0 supplémentaire avec 0 pour les factures existantes et 1 pour les lignes de commandes.
' Gigogne réorganise tout ça en le classant, comme demandé à la fin lors de son appel, sur la colonne 1 qui est l'identification de la commande dans les 2 tableaux initiaux. Il renvoie ça dans une collection d'objets de type SsGr. Ceux ci ont une propriété Id qui est la valeur de ce critère de regroupement, donc la réf commande, et une propriété Co qui est à son tour une collection. Chaque membre de cette dernière collection est une table à une dimension de toutes les valeurs d'une ligne de détail. On a donc pour chaque réf commande d'abord l'ancienne ligne de facturation, si elle existait déjà, avec Détail(0) = 0, ensuite un certain nombre de lignes de commandes, toutes avec Détail(0) = 1, mais ça on n'a pas besoin de le tester: si ce n'est pas l'ancienne ligne de facture, c'est forcément une des lignes de commande. Est-ce que tu comprends mieux le processus d'exploration à deux niveaux de l'ensemble ?
' Dans le code joint au poste #382 tu utilise TR(LR, 8) alors qu'il n'est même plus calculé correctement vu que l'instruction qui calculait ce cumul tu l'as mise après, à un endroit complètement idiot, au lieu de la laisser dans la boucle de traitement de toutes les lignes détail des commandes, où elle était la seule à devoir y rester.
'Détail(12) est le montant de la ligne de commande. On doit additionner sur TR(LR, 8) les montants de toutes les lignes de commande associées à la réf. commande, donc celui de chacune d'elles en les parcourant toutes, l'une après l'autre. Mais c'est la seule chose à faire à chaque ligne de commande ! Tes infos des dernière colonnes, il ne faut les mettre qu'une fois, à la fin, pour la ligne de facture en cours d'élaboration, seulement quand on a fini de cumuler en TR(LR, 8) les montants de toutes les lignes de commande, et qu'on y a donc obtenu le montant total. C'est à dire après le End If et le Next Détail, mais avant le Next RefCmd. On ne peut donc plus garder le Next Détail, RefCmd, qui était une contraction de Next Détail suivi de Next RefCmd, parce qu'il y a ces instructions pour les colonnes de fin à mettre entre le Next Détail qui termine la petite boucle interne d'exploration de toutes les lignes de commande attachées au RefCmd et le Next RefCmd qui termine la grande boucle de chaque ligne de factur
'******************************************************************************************************
Private Sub Worksheet_Activate()
Dim Données As Collection, TR(), LR&, RefCmd As SsGr, Détail, PremièreLigne As Boolean
Dim DatTrv As Date
Set Données = Gigogne(TableUnique(Me.ListObjects(1), WshSuivCmd), 1)
'Set Données = Gigogne(TableUnique(Me, WshSuivCmd), 1)
ReDim TR(1 To Données.Count, 1 To 21)
For Each RefCmd In Données
LR = LR + 1
TR(LR, 1) = RefCmd.Id ' Identification de la commande
PremièreLigne = True
For Each Détail In RefCmd.Co
If Détail(0) = 0 Then
Rem. Report des infos manuelles de la ligne de facturation qui existait déjà. TR(LR, col. fact) = Détail(col. fact)
TR(LR, 9) = Détail(9)
TR(LR, 10) = Détail(10)
TR(LR, 11) = Détail(11)
TR(LR, 12) = Détail(12)
TR(LR, 13) = Détail(13)
TR(LR, 14) = Détail(14)
DatTrv = TR(LR, 13) + 31
TR(LR, 15) = DateSerial(Year(DatTrv), Month(DatTrv) + 1, 0)
Else
If PremièreLigne Then
Rem. Reproduction des informations de la commande. TR(LR, col. fact) = Détail(col. commande)
TR(LR, 2) = Détail(2)
TR(LR, 3) = Détail(3)
TR(LR, 4) = Détail(4)
TR(LR, 5) = Détail(5)
TR(LR, 6) = Détail(6)
TR(LR, 7) = Détail(7)
PremièreLigne = False: End If
Rem. Cumul en colonne 8 du montant de cette ligne de commande, que ce soit la première ou non :
TR(LR, 8) = TR(LR, 8) + Détail(14)
End If: Next Détail
TR(LR, 16) = TR(LR, 8) + TR(LR, 11)
TR(LR, 17) = Int(TR(LR, 16) * 20 + 0.5) / 100 'TR(LR, 17) = TR(LR, 16) * 20 / 100 modif pour arrondi
TR(LR, 18) = TR(LR, 16) + TR(LR, 17)
Next RefCmd
'End If: Next Détail, RefCmd
With Me.ListObjects("TblSuivisFacturation")
If LR < .ListRows.Count Then .ListRows(LR + 1).Range _
.Resize(.ListRows.Count - LR).Delete xlShiftUp
'.DataBodyRange.Resize(LR).Value = TR'pour recalculer la feuille complète
.DataBodyRange.Resize(LR, 18).Value = TR 'pour recalculer les 18première colonne
End With
End Sub