Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !
If Revenus Then Endettement = Charges / Revenus Else Endettement = 1
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
Option Explicit
Private WithEvents CL As ComboBoxLiées, WithEvents CA As ControlsAssociés, TVL(), LCou As Long
Private Sub UserForm_Initialize()
Set CL = New ComboBoxLiées: CL.Plage WshClients
Set CA = New ControlsAssociés: Set CA.Colonnes = CL.Colonnes
CL.Add CBxDossier, "N°Dossier" ', Format:="DO2020SL0000" ', Croissant:=False
CL.Add CBxApporteur, "Apporteur" ', "&", Croissant:=False
CA.Add CBxNom, "Nom"
CA.Add TBxPrénom, "Prénom"
CA.Add TBxAdract, "Adresse Proposant"
CA.Add TBxCP, "CP"
CA.Add TBxVille, "Ville"
CA.Add TBxTel, "Tél"
CA.Add TBxEmail, "Email"
CA.Add CBxNom2, "Nom2"
CA.Add TBxPrénom2, "Prénom2"
CA.Add TBxAdract2, "Adresse Proposant2"
CA.Add TBxCP2, "CP2"
CA.Add TBxVille2, "Ville2"
CA.Add TBxTel2, "Tél2"
CA.Add TBxEmail2, "Email2"
CA.Add TBxPAdr1, "Adr Opé"
CA.Add TBxPAdr2, "Adr Opé1"
CA.Add TBxPCP, "CP3"
CA.Add TBxPpc, "N°PC"
CA.Add TBxPdelivré, "Date Délivré PC", Format:="mmm.yy"
CA.Add TBxPDoc, "Date DOC", Format:="mmm.yy"
CA.Add TBxPDebtravaux, "Date début travaux", Format:="mmm.yy"
CA.Add TBxPPrevFintravaux, "Date prév fin de trav", Format:="mmm.yy"
CA.Add TBxTCorp, "Montant trav", Format:="0 000.00 €"
CA.Add TBxThono, "Montant Hono", Format:="0 000.00 €"
CA.Add TBxTtot, "Total", Format:="0 000.00 €"
CA.Add TBxPrecep, "PV récep av réserves levées", Format:="mmm.yy"
CA.Add TBxPRecapfact, "Récap facture déf", Format:="mmm.yy"
CA.Add TBxPAttesDo, "Attes DO Définitive", Format:="mmm.yy"
CL.CouleurSympa
CL.Actualiser
'If Not Me.ActiveControl Is FrmC Then CL.Stopper
End Sub
Private Sub CL_Change(ByVal Complet As Boolean, ByVal NbrLgn As Long)
Select Case NbrLgn
Case 1: CBnAjouter.Enabled = False: CBnModifier.Enabled = True: CBnSupprimer.Enabled = True: Exit Sub
Case 0: CBnAjouter.Enabled = True: CBnModifier.Enabled = False: CBnSupprimer.Enabled = False
Case Else: CBnAjouter.Enabled = False: CBnModifier.Enabled = False: CBnSupprimer.Enabled = False
End Select
ReDim TVL(1 To 1, 1 To CL.Colonnes.Count)
' TVL(1, 1) = WorksheetFunction.Max(CL.Colonnes("N°Dossier").DataBodyRange) + 1
' LabRevenus.Caption = "": LabCharges.Caption = "": LabEndettement.Caption = "": LabMensualité.Caption = ""
CA.ValeursDepuis TVL
End Sub
Private Sub CL_SujFltChg(ByVal CBM As ComboBoxMmbr, ByVal Filtré As Boolean)
'If Not FrmC Is Me.ActiveControl Then Exit Sub
'If Not CBM.CBx Is FrmC.ActiveControl Then Exit Sub
If Not CBM.CBx Is CBxNom Then Exit Sub
If CBM.CBx.MatchFound Or CBM.CBx.Text = "" Then Exit Sub
Dim S ' Sujet temporaire pour recherche intuitive
S = SujCBxLike(CBM.SujetFlt, "*" & CBM.CBx.Text & "*")
If IsEmpty(S) Then Exit Sub
CBM.SujetFlt = S ' Affectation du sujet temporaire.
CBM.CBx.DropDown ' Affichage de la liste
End Sub
Private Sub CL_BingoUn(ByVal Ligne As Long)
LCou = Ligne
TVL = CL.Lignes(LCou).Range.Value
' GarnirLabel
CA.ValeursDepuis TVL
End Sub
Private Sub CBnEffacer_Click()
CL.Nettoyer
End Sub
Private Sub CBnAjouter_Click()
CL.ValeursVers TVL
CA.ValeursVers TVL
TVL(1, 1) = WorksheetFunction.Max(CL.Colonnes("N°Dossier").DataBodyRange) + 1
CL.Lignes.Add.Range.Resize(, 34).Value = TVL
CL.Actualiser
End Sub
Private Sub CBnModifier_Click()
CA.ValeursVers TVL
CL.Lignes(LCou).Range.Resize(, 34).Value = TVL
End Sub
Private Sub CBnSupprimer_Click()
CL.Lignes(LCou).Delete
CL.Actualiser
End Sub
We use cookies and similar technologies for the following purposes:
Est ce que vous acceptez les cookies et ces technologies?
We use cookies and similar technologies for the following purposes:
Est ce que vous acceptez les cookies et ces technologies?