XL 2016 Macro calcul complexe

youpi457032

XLDnaute Occasionnel
Bonjour,
Je suis à la recherche d'une macro VBA qui calculerait selon deux critères :
cours à l unité 30 euros de 1 à 4 cours
pass 5 cours à 140 euros
pass 10 cours à 250 euros
ce cours s'apelle EMS

j 'ai déjà une macro qui calcule différents tarifs
je la joins ici
[/macro]
'Macro Faite par DESVIGNE Christophe le 30/05/2019
Option Explicit
Dim acompte As Integer
Private Sub Bt1_Click()
Dim Lig&, I&
If T1 = "" Or T2 = "" Then MsgBox "Vous devez au minimum remplir le nom et le pr?nom pour pouvoir enregistrer un ?l?ve!!", vbCritical, "Manque de donn?e": Exit Sub
With Feuil5
If T1.ListIndex <> -1 Then
Lig = T1.ListIndex + 2
For I = 1 To 37
If I = 10 Or I = 11 Or I = 15 Or I = 18 Or I = 21 Then .Cells(Lig, I) = Controls("T" & I): GoTo 1
If IsNumeric(Controls("T" & I)) Then
.Cells(Lig, I) = CDbl(Controls("T" & I))
Else
.Cells(Lig, I) = Controls("T" & I)
End If
1 Next I
Else
Lig = .Range("A" & Rows.Count).End(3).Row + 1
For I = 1 To 37
If I = 10 Or I = 11 Or I = 15 Or I = 18 Or I = 21 Then .Cells(Lig, I) = Controls("T" & I): GoTo 2
If IsNumeric(Controls("T" & I)) Then
.Cells(Lig, I) = CDbl(Controls("T" & I))
Else
.Cells(Lig, I) = Controls("T" & I)
End If
2 Next I
End If
End With
Bt2_Click
End Sub
Private Sub Bt2_Click()
Unload Me
r?glement_facturation.Show 0
End Sub
Private Sub Bt3_Click()
Dim rep, rep1
If T1.ListIndex <> -1 Then
rep = MsgBox("Attention vous allez Supprimer l'?l?ve actuellement s?lectionn?, ?tes vous sur de vouloir Supprimer l'?l?ve??", vbCritical + vbYesNo, "Suppression d'un ?l?ve")
If rep = vbNo Then Exit Sub
rep1 = MsgBox("Attention vous allez Supprimer un ?l?ve??, confirmer vous la suppression, action irr?versible??", vbCritical + vbYesNo, "Confirmation de Suppression d'un ?l?ve")
If rep1 = vbNo Then Exit Sub
Feuil1.Rows(T1.ListIndex + 2).Delete Shift:=xlUp
Bt2_Click
End If
End Sub
Private Sub Bt4_Click()
Unload Me
End Sub

Private Sub edition_facture_Click()
On Error GoTo OuvertureFichierErreur
Dim MonApplication As Object
Dim MonFichier As String

Set MonApplication = CreateObject("Shell.Application")

MonFichier = "C:\Users\Christophe DESVIGNE\Desktop\Nouveau dossier\attestation de paiement.docx"

MonApplication.Open (MonFichier)

Set MonApplication = Nothing
Exit Sub
OuvertureFichierErreur:

Set MonApplication = Nothing

MsgBox "Erreur lors de l'ouverture de fichier..."
End Sub
Private Sub T1_Click()
Dim Lig&, I&
If T1.ListIndex <> -1 Then
Lig = T1.ListIndex + 2
For I = 1 To 37
Controls("T" & I) = Feuil5.Cells(Lig, I).Value
Next I
End If
Call PrixCoursAdulte

End Sub
Private Sub T25_Change()
acompte = Val(T25) + Val(T26) + Val(T27) + Val(T28) + Val(T29)
T36.Value = acompte
End Sub
Private Sub T26_Change()
acompte = Val(T25) + Val(T26) + Val(T27) + Val(T28) + Val(T29)
T36.Value = acompte
End Sub
Private Sub T27_Change()
acompte = Val(T25) + Val(T26) + Val(T27) + Val(T28) + Val(T29)
T36.Value = acompte
End Sub
Private Sub T28_Change()
acompte = Val(T25) + Val(T26) + Val(T27) + Val(T28) + Val(T29)
T36.Value = acompte
End Sub
Private Sub T29_Change()
acompte = Val(T25) + Val(T26) + Val(T27) + Val(T28) + Val(T29)
T36.Value = acompte
End Sub
Private Sub T6_Change()
Call PrixCoursAdulte
End Sub
Private Sub T7_Change()
Call PrixCoursAdulte
End Sub
Private Sub T8_Change()
Call PrixCoursAdulte
End Sub
Private Sub T9_Change()
Call PrixCoursAdulte
End Sub
Private Sub T10_Change()
Call PrixCoursAdulte
End Sub
Private Sub T11_Change()
Call PrixCoursAdulte
End Sub
Private Sub T12_Change()
Call PrixCoursAdulte
End Sub
Private Sub T13_Change()
Call PrixCoursAdulte
End Sub
Private Sub T14_Change()
Call PrixCoursAdulte
End Sub
Private Sub T15_Change()
Call PrixCoursAdulte
End Sub
Private Sub T16_Change()
Call PrixCoursAdulte
End Sub
Private Sub T17_Change()
Call PrixCoursAdulte
End Sub
Private Sub UserForm_Initialize()

Worksheets("facturation").Range("F2:Q600").Value = Worksheets("base_MALAFRETAZ").Range("W2:AH600").Value
Worksheets("facturation").Range("A2:D600").Value = Worksheets("base_MALAFRETAZ").Range("A2:D600").Value
Worksheets("facturation").Range("E2:E600").Value = Worksheets("base_MALAFRETAZ").Range("AI2:AI600").Value

Dim aa, fin&, I&
With Feuil5
fin = .Range("A" & Rows.Count).End(3).Row
If fin < 2 Then Exit Sub
aa = .Range("A2:AI" & fin)
End With
T1.ColumnCount = 2
T1.List = aa
T4.List = Feuil2.Range("C2:C" & Feuil2.Range("C" & Rows.Count).End(3).Row).Value
For I = 6 To 17
Controls("T" & I).List = Feuil2.Range("A2:A" & Feuil2.Range("A" & Rows.Count).End(3).Row).Value
Next I
For I = 18 To 24
Controls("T" & I).List = Feuil2.Range("E2:E" & Feuil2.Range("E" & Rows.Count).End(3).Row).Value
Next I
End Sub
Private Sub PrixCoursAdulte()
Dim I, z As Integer, M As Boolean, NM As Integer, NH As Integer
Dim PEV, PCM As Integer
Dim PA, EH, NE, NEnF
Dim CA, CE As Boolean
Dim tarif As String
Dim acompte As Integer
PEV = 170 'prix cours " eveil a la danse 4/6 ans"
PCM = 180 'prix des cours mensuels
PA = Array(0, 210, 380, 530, 660) 'prix des cours adulte hebdo degressif
EH = Array(0, 190, 335, 460, 565) 'prix des cours enfants hebdo degressif a rajouter
'EMS = Array(0, 30, 140, 250)
With Worksheets("Crit?res")
For I = 6 To 17
M = False
If Controls("T" & I).ListIndex <> -1 Then
For z = 2 To .Range("G" & Rows.Count).End(xlUp).Row 'Cours mensuels
If .Range("J" & z) = Controls("T" & I) Then
tarif = "mensu"
Exit For
End If

If .Range("K" & z) = Controls("T" & I) Then 'cours adultes
tarif = "adulte"
Exit For
End If

If .Range("I" & z) = Controls("T" & I) Then 'cours enfants
tarif = "enfant"
Exit For
End If

If .Range("H" & z) = Controls("T" & I) Then 'cours eveil
tarif = "eveil"
Exit For
End If

Next

Select Case tarif

Case "mensu"
NM = NM + 1
Case "enfant"
NEnF = NEnF + 1
Case "adulte"
NH = NH + 1
Case "eveil"
NE = NE + 1
End Select

End If
Next

End With
If NH > 4 Then NH = 4
T34 = PA(NH) 'Total cours adultes
If NM > 5 Then NM = 5
T35 = NM * PCM 'total cours mensuels
T32 = NE * PEV ' total cours ?veil 4/6 ans
If NEnF > 3 Then NEnF = 3
T33.Value = EH(NEnF) 'total cours primaires / coll?ge
' calcul du total
T37.Value = (Val(T32) + Val(T33) + Val(T34.Value) + Val(T35)) - Val(T36.Value)
End Sub
[\MACRO -end ]

donc l'idée, c'est de compléter cette macro avec le calcul des cours EMS
Je l'associerai à un contrôle T38, comme j'ai associé les autres cours adultes, enfants, mensuels….etc...
seul difficulté, je ne peux pas mettre un simple EMS = Array (0, 30, 140,250), puisque que chaque cours de 1 à 4 cours doit aussi être calculer à l'unité (soit 120 euros max pour 4 cours max). Dès qu'on passe à 5 cours prix de 140 euros, et forfait 10 cours 250 euros.
Excemple si un élève prend :
1 cours : 30 euros
2 cours 60...., 3 cours 90, 4 cours...120.
5 cours : pass à 140 euros
6 cours : pass à 140 + 1 cours à 30 euros
8 cours : pass à 140 + 3 cours à 30 euros
10 cours pass à 250 euros
12 cours pass à 250 euros + 2 cours à 30
15 cours pass à 250 + pass à 5 cours….
etc.… pour la logique du calcul...
comment mettre en forme ce calcul VBA ?
bien evidemment je rajouterai un contrôle Text (userform) pour renseigner le nombre de cours (exemple T40)
Merci
 

youpi457032

XLDnaute Occasionnel
Bonjour Pierrejean
merci de ta vitesse de réponse !
J'ai ouvert ton fichier…. Comment ca fonctionne le calcul ???
personnellement j'aimerai que les resultats s'affiche dans un textbox de mon userform. Puisque j'additionne tous les prix des cours en fonction del leur grille tarifaire. Peux-tu m'aider ?
 

pierrejean

XLDnaute Barbatruc
Re
Tu mets la fonction dans un module
Ensuite dans le textbox_change du textbox_nb qui reçoit le nbre de cours EMS tu mets
Textbox_tot_ems=tarif_ems(textbox_nb)
Textbox_tot_ems etant le textbox ou tu veux avoir le tarif correspondant au nbre de cours ems
 

youpi457032

XLDnaute Occasionnel
Bonjour Pierrejean
merci de ta vitesse de réponse !
J'ai ouvert ton fichier…. Comment ca fonctionne le calcul ???
personnellement j'aimerai que les resultats s'affiche dans un textbox de mon userform. Puisque j'additionne tous les prix des cours en fonction del leur grille tarifaire. Peux-tu m'aider ?
dans ton exemple a 15 cours, le prix n'est pas juste. C'est 250 (pass 10 cours ) + 140 (pass 5 cours ) = 390 et non 375 ….
on calcul toujours le prix le plus favorable….
il me faut une macro qui repère le nombre de cours . si 5 cours, pass 5 cours, si 10 cours pass 10 cours)
exemple : si 17 cours = prix pass 10 cours + pass prix 5 cours + 2 cours à l'unité
si 22 cours = prix 2 fois pass 10 cours + 2 cours à l'unité.

la macro doit pouvoir repérer ces multiples de 10 et 5
 

youpi457032

XLDnaute Occasionnel
dans ton exemple a 15 cours, le prix n'est pas juste. C'est 250 (pass 10 cours ) + 140 (pass 5 cours ) = 390 et non 375 ….
on calcul toujours le prix le plus favorable….
il me faut une macro qui repère le nombre de cours . si 5 cours, pass 5 cours, si 10 cours pass 10 cours)
exemple : si 17 cours = prix pass 10 cours + pass prix 5 cours + 2 cours à l'unité
si 22 cours = prix 2 fois pass 10 cours + 2 cours à l'unité.

la macro doit pouvoir repérer ces multiples de 10 et 5
 

pierrejean

XLDnaute Barbatruc
Re
Il n'eut pas été inutile de le dire avant !!!!
C'est ici qu'il faut mentionner les remises en fonction des nbres
remise = Array(5, 10, 15, 20, 25, 30)
v_remise = Array(10, 50, 60, 70, 110)
a partir de 5 10
a partir de 10 50
a partir de 15 60 (50+10)
a parir de 20 70( 60+10)
 

Discussions similaires

Réponses
4
Affichages
189

Statistiques des forums

Discussions
312 025
Messages
2 084 751
Membres
102 653
dernier inscrit
kulas11