Private Sub placementUF(Obj As Object)
If Not Obj Is Nothing Then
Dim Lft As Double, top As Double, P As Object, PInsWidth As Double, PInsHeight As Double
Dim K As Double
Lft = Obj.Left: top = Obj.top: Set P = Obj.Parent ' Normalement Page, Frame ou UserForm
Do
PInsWidth = P.InsideWidth: PInsHeight = P.InsideHeight ' Le Page en est pourvu, mais pas le Multipage.
If TypeOf P Is MSForms.Page Then Set P = P.Parent ' Prend le Multipage, car le Page est sans positionnement.
K = (P.Width - PInsWidth) / 2: Lft = (Lft + P.Left + K): top = (top + P.top + P.Height - K - PInsHeight)
If TypeOf P Is Frame Then top = top - P.ScrollTop + 2: Lft = Lft - (P.Width - PInsWidth) / 2
If Not (TypeOf P Is MSForms.Frame Or TypeOf P Is MSForms.MultiPage) Then Exit Do
Set P = P.Parent
Loop
Me.Left = Lft + ((Obj.Width / 2) * Px) ' a gauche en top
Me.top = top + ((Obj.Height / 2) * Py)
End If
End Sub
Private Sub Cbn_Calculer_Click() 'tous les calculs sont effectués ici==> Plus besoin de cliquer dans les différentes cases de total.
'******************************************Calcul du Total_Club*******************************
'=f(nombre de jours Hors dimanche, formule) ==> selon Grille Tarifaire t_Tarifs_Club
'Cette boucle charge les données des frames enfants pour faire les calculs
For i = 1 To 4
If Me.Controls("Txt_DatDeb" & i) <> "" And Me.Controls("Txt_DatFin" & i) <> "" Then
Me.Controls("Text_Nb_Jours_Enfant" & i) = NbJoursHorsDimanche(CDate(Me.Controls("Txt_DatDeb" & i)), CDate(Me.Controls("Txt_DatFin" & i))) 'Nb de jours HORS dimanche
With Sheets("Données_ref").ListObjects("t_Tarifs_club") 'on récupère le tarif dans la grille
Me.Controls("Text_Tarif_Enfant" & i) = Format(.ListColumns(CStr(Me.Controls("Text_Nb_Jours_Enfant" & i))).DataBodyRange(Me.Controls("Cbx_Formule_Club" & i).ListIndex + 1), "0 €")
NbEnf = NbEnf + 1
End With
Else
Me.Controls("Text_Nb_Jours_Enfant" & i) = 0
Me.Controls("Text_Tarif_Enfant" & i) = 0
End If
Next i
'Calcul Total AVANT la remise
Me.Txt_Tot_SansRemise = CDbl(Me.Text_Tarif_Enfant1) + CDbl(Me.Text_Tarif_Enfant2) + CDbl(Me.Text_Tarif_Enfant3) + CDbl(Me.Text_Tarif_Enfant4)
'calcul de la remise fonction du nb d'enfants
Total = Me.Txt_Tot_SansRemise
Select Case NbEnf
Case 0 'ce cas ne devrait pas exister
Case 1 'pas de remise
Total = Total
Case 2 '5%
Total = 0.95 * Total
Case 3 '10%
Total = 0.9 * Total
Case 4 '15%
Total = 0.85 * Total
End Select
Me.Txt_Tot_AvecRemise = Total
'on place le total AVEC ou SANS remise dans Total_Club en fonction de l'option boutton sélectionné 'pour changer valeur par défaut(Avec Remise) aller dans l'initialize
Me.Txt_Total_Club = IIf(Me.Ob_AvantRemise, Format(Me.Txt_Tot_SansRemise, "0 €"), Format(Me.Txt_Tot_AvecRemise, "0 €"))
'************************************************************************************************
'******************************************Calcul du Total_Nat*******************************
Total = 0
For i = 1 To 4 'on récupère les 4 tarifs déjà calculés dans les frames enfants
If Me.Controls("Fr_Enfant_" & i).Visible Then
If Me.Controls("txt_Tarif" & i) = "" Then Me.Controls("txt_Tarif" & i) = 0
Total = Total + Me.Controls("txt_Tarif" & i)
End If
Next i
Me.Txt_Total_Nat = Format(Total, "0 €")
'************************************************************************************************
'*************************************Calcul du Total_Parasol &Siège*****************************
UpdateParasol 'on lance l'update pour éviter bug quand les controles sont vides
UpdateSiège
Me.Txt_Total_Par = Format(CDbl(Me.Txt_Tarif_Parasol) + CDbl(Me.Txt_Tarif_Siège), "0 €")
'************************************************************************************************
'********************************************Calcul du Total*************************************
Total = CDbl(Me.Txt_Total_Club) + CDbl(Me.Txt_Total_Nat) + CDbl(Me.Txt_Total_Par)
If Me.Txt_TOTAL <> "" Then
If Total <> CDbl(Me.Txt_TOTAL) Then
If MsgBox("le montant calculé ne correspond pas au montant Total Saisi" & Chr(10) & "Etes-vous sur de vouloir utiliser le montant saisi?", vbYesNo) = vbNo Then
Me.Txt_TOTAL = Format(Total, "0 €")
End If
End If
Else
Me.Txt_TOTAL = 0
End If
'************************************************************************************************
'********************************************Calcul du "Doit"*************************************
Me.Txt_Paiement = IIf(Me.Txt_Paiement = "", 0, Me.Txt_Paiement)
Me.Txt_Doit = Format(CDbl(Me.Txt_TOTAL) - CDbl(Me.Txt_Paiement), "0 €")
Me.Txt_Doit.Value = Format(Me.Txt_Doit.Value, "0.00 €") 'Formatage
Me.Txt_Doit.BackColor = IIf(CDbl(Txt_Doit.Value) > 0, &HEB, &HE0E0E0) 'coloration
'************************************************************************************************
End Sub
Bonjour vgendron,Hello
Je ne comprend plus trop ton projet et ta façon de procéder.. j'ai l'impression que ca change plus ou moins à chaque post.
le Total est calculé à partir des éléments que tu saisis
donc forcément, le montant dû dépend du Total et du paiement effectué
maintenant. si tu modifies entre temps le total.. pourquoi le calculer si en fait, tu y mets ce que tu veux
si tu effectues une "remise" quelconque, autant ajouter un control" Remise" et modifier le calcul de "Doit" pour en tenir compte.
le clic sur le bouton "Calculer" permet de faire tous les calculs.. donc si tu ne veux plus de ces calculs. il suffit de mettre en commentaire le/les blocs
j'ai présenté la macro de telle manière que ce soit facile de voir qu'est ce qui est calculé à quel moment avec des lignes de séparation '**********************
D'ailleurs, j'avais noté un truc étonnant dans le calcul des leçons de natation
une famille arrive avec 2 enfants
enfant 1: 4 lecons ==> 68Euros
enfant2: : 6 lecons ==> 96 Euros
Total facturé: 68+96 = 164 Euros
Par contre.. les parents vont voir que il y a un total de 6+4 leçons = 10.... pour lequel, le tarif n'est que de 134 €
pour le symbole €,
le mieux c'est de ne pas le saisir...
et laisser le formatage des textbox auto après saisie
du coup, les controls dont le tag est "Monétaire", tu les repasses en "Numérique"
pour le 3.. bah. oui. c'était le principe
selon la feuille de travail.. on recherche, on charge, et on enregistre sur la feuille de travail..
maintenant.. si quelque soit la feuille de "chargement", tu enregistres toujours dans inscriptions, il faut aller dans la macro "SaveUSF" pour modifier la feuille cible... mais la. tu vas avoir un pb de numéro de ligne cible.
Private Sub textMonétaire_Change()
Dim x$, p%
x = Replace(textMonétaire, ",", ".")
p = textMonétaire.SelStart - (x = "0") + (x Like "0?*.*") 'mémorise
textMonétaire = IIf(IsNumeric(Left(x, 1)), Format(Val(x), "0 €"), "")
textMonétaire.SelStart = p
End Sub
a ben voila on y arriveDe ton point de vue je comprend que tu ais l'impression que je change d'avis. En fait non, c'est patricktoulon qui a raison : si j'avais mieux préparé sur le papier en amont, les choses seraient plus claires.
pour le montant tu peux peut etre faire ceci
VB:Private Sub Cbn_Calculer_Click() 'tous les calculs sont effectués ici==> Plus besoin de cliquer dans les différentes cases de total. '******************************************Calcul du Total_Club******************************* '=f(nombre de jours Hors dimanche, formule) ==> selon Grille Tarifaire t_Tarifs_Club 'Cette boucle charge les données des frames enfants pour faire les calculs For i = 1 To 4 If Me.Controls("Txt_DatDeb" & i) <> "" And Me.Controls("Txt_DatFin" & i) <> "" Then Me.Controls("Text_Nb_Jours_Enfant" & i) = NbJoursHorsDimanche(CDate(Me.Controls("Txt_DatDeb" & i)), CDate(Me.Controls("Txt_DatFin" & i))) 'Nb de jours HORS dimanche With Sheets("Données_ref").ListObjects("t_Tarifs_club") 'on récupère le tarif dans la grille Me.Controls("Text_Tarif_Enfant" & i) = Format(.ListColumns(CStr(Me.Controls("Text_Nb_Jours_Enfant" & i))).DataBodyRange(Me.Controls("Cbx_Formule_Club" & i).ListIndex + 1), "0 €") NbEnf = NbEnf + 1 End With Else Me.Controls("Text_Nb_Jours_Enfant" & i) = 0 Me.Controls("Text_Tarif_Enfant" & i) = 0 End If Next i 'Calcul Total AVANT la remise Me.Txt_Tot_SansRemise = CDbl(Me.Text_Tarif_Enfant1) + CDbl(Me.Text_Tarif_Enfant2) + CDbl(Me.Text_Tarif_Enfant3) + CDbl(Me.Text_Tarif_Enfant4) 'calcul de la remise fonction du nb d'enfants Total = Me.Txt_Tot_SansRemise Select Case NbEnf Case 0 'ce cas ne devrait pas exister Case 1 'pas de remise Total = Total Case 2 '5% Total = 0.95 * Total Case 3 '10% Total = 0.9 * Total Case 4 '15% Total = 0.85 * Total End Select Me.Txt_Tot_AvecRemise = Total 'on place le total AVEC ou SANS remise dans Total_Club en fonction de l'option boutton sélectionné 'pour changer valeur par défaut(Avec Remise) aller dans l'initialize Me.Txt_Total_Club = IIf(Me.Ob_AvantRemise, Format(Me.Txt_Tot_SansRemise, "0 €"), Format(Me.Txt_Tot_AvecRemise, "0 €")) '************************************************************************************************ '******************************************Calcul du Total_Nat******************************* Total = 0 For i = 1 To 4 'on récupère les 4 tarifs déjà calculés dans les frames enfants If Me.Controls("Fr_Enfant_" & i).Visible Then If Me.Controls("txt_Tarif" & i) = "" Then Me.Controls("txt_Tarif" & i) = 0 Total = Total + Me.Controls("txt_Tarif" & i) End If Next i Me.Txt_Total_Nat = Format(Total, "0 €") '************************************************************************************************ '*************************************Calcul du Total_Parasol &Siège***************************** UpdateParasol 'on lance l'update pour éviter bug quand les controles sont vides UpdateSiège Me.Txt_Total_Par = Format(CDbl(Me.Txt_Tarif_Parasol) + CDbl(Me.Txt_Tarif_Siège), "0 €") '************************************************************************************************ '********************************************Calcul du Total************************************* Total = CDbl(Me.Txt_Total_Club) + CDbl(Me.Txt_Total_Nat) + CDbl(Me.Txt_Total_Par) If Me.Txt_TOTAL <> "" Then If Total <> CDbl(Me.Txt_TOTAL) Then If MsgBox("le montant calculé ne correspond pas au montant Total Saisi" & Chr(10) & "Etes-vous sur de vouloir utiliser le montant saisi?", vbYesNo) = vbNo Then Me.Txt_TOTAL = Format(Total, "0 €") End If End If Else Me.Txt_TOTAL = 0 End If '************************************************************************************************ '********************************************Calcul du "Doit"************************************* Me.Txt_Paiement = IIf(Me.Txt_Paiement = "", 0, Me.Txt_Paiement) Me.Txt_Doit = Format(CDbl(Me.Txt_TOTAL) - CDbl(Me.Txt_Paiement), "0 €") Me.Txt_Doit.Value = Format(Me.Txt_Doit.Value, "0.00 €") 'Formatage Me.Txt_Doit.BackColor = IIf(CDbl(Txt_Doit.Value) > 0, &HEB, &HE0E0E0) 'coloration '************************************************************************************************ End Sub [/code [/QUOTE] J'ai compris le code et à quoi il sert. Mais je préfère ta solution de remise. Du coup j'ai crée une Txt_Remise et j'ai ajouter Me.Txt_TOTAL = Format(CDbl(Me.Txt_Total_Club) + CDbl(Me.Txt_Total_Nat) + CDbl(Me.Txt_Total_Par) [U]- CDbl(Me.Txt_Remise), "0 €")[/U] J'ai même tenté un : Me.Txt_Remise = Format(Me.Txt_Remise.Value, "0 €") Mais ça bug si la case remise est vierge.
Là par contre je ne comprend pas.pour le format €
plutot que de remplacer les tags, laisse les comme ils sont
mais ajoute ce bout de code dans la module de classe cTextBox
VB:Private Sub textMonétaire_Change() Dim x$, p% x = Replace(textMonétaire, ",", ".") p = textMonétaire.SelStart - (x = "0") + (x Like "0?*.*") 'mémorise textMonétaire = IIf(IsNumeric(Left(x, 1)), Format(Val(x), "0 €"), "") textMonétaire.SelStart = p End Sub