Je me tourne vers vous car malgré mes efforts, je sèche... Je fais donc appel à des experts!
En espérant que vous puissiez m'aider...
Je m'explique :
Je cherche désespérément à créer un simulateur pour des utilisateurs.
J'ai un onglet excel avec tous mes tarifs et quelques formules afin de calculer un coût moyen avec un taux de variabilité selon les fournisseurs.
Je souhaiterai créer un bouton déclenchant un UserForm avec tous les scénarios possibles et que cela me donne un résultat selon le nombre de jours choisis et selon les choix appliqués. Que cela remplisse la bonne ligne comme actuellement avec la formule et pouvoir via une MEFC mettre la ligne en gras. En complément j'aimerai que l'utilisateur ne puisse pas déclencher le calcul s'il n'a pas rempli tous les champs et qu'il y ai un message d'erreur selon le champ non-rempli.
En gros, que l'UserForm marche comme le mini-tableau en cellule O16 (malgré qu'il manque la MEFC et le message d'erreur...)
J'ai déja créer le bouton ouvrant l'UserForm avec les champs à remplir, mais là, je bloque. De plus, je souhaiterai que le champ "Nbr de jours" soit libre comme en P16
J'espère avoir été clair, que cela vous interessera et que vous pourrez m'aider !
En PJ un tableau pour exemple
Bonjour,
Ca fait plaisir d'avoir un retour. Ce n'est hélas pas toujours le cas !
Le principal est que la base soit posée et que l'appropriation se fasse.
La cellule à cibler est celle de la colonne M ligne "ligPays"
Pour cela j'ai modifié ligpays en ligpays(3) et créé une variable cible de type Range
Reste à la faire "ressortir" dans le tableau
Bonne continuation
PS : le module 3 ne sert à rien: il a été créé lors d'un enregistrement de macro. Il peut être supprimé.
VB:
Option Explicit
Dim strPays As String
Dim strType As String
Dim strMoteur As String
Dim strFournisseur(3) As String
Dim nbJours As Integer
Sub Calculs()
Dim strPays As String
Dim ligPays(3) As Long...
Bonjour ExcLnoob, le forum,
La présentation des tarifs est-elle figée ?
Dans le cas contraire, je pense qu’il serait préférable de présenter le tableau par pays (mais mes pensées sont souvent farfelues).
Cordialement,
Bernard
Bonsoir,
Pour le USF, quelque chose de "simple" juste pour montrer la faisabilité.
Le combobox jours a été remplacé par un textbox
Pour le résultat faut expliciter la formule de calcul
A suivre ?
Bonsoir Pounet95,
Merci beaucoup!!!! C'est super!
Maintenant effectivement il faut implémenter la formule.
J'ai la formule dans la cellule P20 qui elle-même fait référence à la formule dans I5:I9 mais je ne sais pas comment la traduire en VBA.
Peut-être faire référence à l'USF dans la formule avec génération du résultat dans la TextBox "Fournisseur" ? Mais cela impliquerai de traduire la formule de la cellule P20 en VBA avec référence à la cellule ?
Une idée ?
Merci encore!
Re,
En fait, je ne comprends pas bien la formule !
C'est une formule matricielle, je ne m'en suis jamais servi. J'utilise XL2016, et certaines fonctions de Office365 ne me "parlent" pas.
Ce que je voudrais c'est de comprendre quelle est la démarche pour arriver au résultat indiqué.
Il me semble comprendre qu'il faille prendre le coût total moyen mini en colonne M pour le pays sélectionné.
C'est cela ?
Re bonsoir,
Dans la colonne L il y a touts les schéma possibles du "mini tableau" (D'ailleurs petite coquille entre Portugal et Belgique... J'ai inversé les pays...)
De ce fait, la formule en P20 génère le coût journalier choisi et calcule le coût total moyen de chaque fournisseur (+5%) en fonction des données renseignées dans le "mini tableau" (remplacé par l'USF) tout en remplissant les cellules vides (Coût véhicules choisi; Nombre de jours de location; Coût location pour le schéma selectionné), calcule par rapport au nombre de jours le Coût moyen carburant et une fois qu'elle a généré ce coût total moyen pour chaque fournisseur compare les 3 données et affiche le nom du plus compétitif.
Je sais pas si j'ai été clair...
Bonjour,
Si j'ai bien compris, ..... à confirmer !
J'ai rajouté une feuille (paramètres ) qui contient les listes pour les combobox ( propriété RowSource )
et un peu modifié le look du userform
A tester donc
Bonjour,
Merci pour la réponse
Je viens de tester, c'est beau! Je me suis permis de rajouter le retrait de la croix rouge via une macro trouvée en farfouillant (En effet, je souhaite que les utilisateurs quitte via le bouton "Stop" seulement)
En tout cas le résultat y est! Merci!!
J'ai modifié la fin du module 1 (j=1 par j=i) sinon celui-ci me renvoyez toujours EuropCar, maintenant c'est ok. J'ai également adapter l'USF avec Unload Me plutot que Hide sur le bouton Stop.
Cela me permets de Reset le simulateur à la fermeture tout en gardant le résultat affiché.
Du coup comment faire pour qu'une nouvelle simulation supprime l'ancienne sur le tableau ?
Là, le simulateur se remet à zéro à chaque fermeture mais le tableau affiche toujours la dernière simulation ce qui de mon point de vue rend le tableau moins lisible plus l'on fait de simulation.
J'ai bien trouvé une macro mais celle-ci supprime les données à la fermeture du simulateur...
En parallèle, lors du résultat, n'est ciblé que le tableau Hertz. Serait-il possible de cibler la cellule du résultat du simulateur ?
L'onglet paramètre, c'est pour simplifier le code si je comprends bien ? On fait référence à l'onglet plutôt que d'écrire les listes dans la macro.
Egalement, puis-je supprimer le module 2 ? Celui-ci me met une erreur de syntaxe et cela semble fonctionner quand même.
Beaucoup de texte, beaucoup de questions...
En tout cas merci beaucoup pour votre aide!!
Re
J'ai trouvé comment remettre à zéro à l'ouverture!
J'ai inséré Sheets("Feuil1").Range("Cellules ciblés").ClearContents dans l'USF
Ne reste qu'à cibler la cellule et mettre en forme
Bonjour,
Ca fait plaisir d'avoir un retour. Ce n'est hélas pas toujours le cas !
Le principal est que la base soit posée et que l'appropriation se fasse.
La cellule à cibler est celle de la colonne M ligne "ligPays"
Pour cela j'ai modifié ligpays en ligpays(3) et créé une variable cible de type Range
Reste à la faire "ressortir" dans le tableau
Bonne continuation
PS : le module 3 ne sert à rien: il a été créé lors d'un enregistrement de macro. Il peut être supprimé.
VB:
Option Explicit
Dim strPays As String
Dim strType As String
Dim strMoteur As String
Dim strFournisseur(3) As String
Dim nbJours As Integer
Sub Calculs()
Dim strPays As String
Dim ligPays(3) As Long
Dim CoûtMoyenTot(3) As Double
Dim CoûtMoyenMIN As Double
Dim i As Integer 'indice de boucle
Dim j As Integer 'idem
Dim cible As Range 'cellule cible
strFournisseur(1) = "RentaCar"
strFournisseur(2) = "EuropeCar"
strFournisseur(3) = "Hertz"
On Error Resume Next
Application.CutCopyMode = False
With UserForm1
strPays = .Controls("combo_Pays").Value
strMoteur = .Controls("combo_Moteur").Value
strType = .Controls("combo_Type").Value
nbJours = Val(.Controls("txt_nb_Jours").Text)
End With
'pour chaque Loueur,mettre à jour la ligne correspondant au Pays
For i = 1 To 3
Range("Tarifs_" & strFournisseur(i)).Select
ligPays(i) = Selection.Find(What:=strPays, After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Row
'Mettre les valeurs dans les cellules correspondantes au pays
'Coût véhicule choisi en fonction du carburant moteur
Select Case strMoteur
Case "Essence"
'et en fonction du type Berline ou Coupé
If strType = "Berline" Then
Range("I" & ligPays(i)) = Range("C" & ligPays(i))
Else
Range("I" & ligPays(i)) = Range("D" & ligPays(i))
End If
Case "Electrique"
'et en fonction du type Berline ou Coupé
If strType = "Berline" Then
Range("I" & ligPays(i)) = Range("E" & ligPays(i))
Else
Range("I" & ligPays(i)) = Range("F" & ligPays(i))
End If
Case "Diesel"
'et en fonction du type Berline ou Coupé
If strType = "Berline" Then
Range("I" & ligPays(i)) = Range("G" & ligPays(i))
Else
Range("I" & ligPays(i)) = Range("H" & ligPays(i))
End If
End Select
'Nombre de jours de location
Range("J" & ligPays(i)) = nbJours
'Récupère le coût moyen
CoûtMoyenTot(i) = Range("M" & ligPays(i))
Next i
'Meilleure offre
'Le MIN de chacune des valeurs MIN du coût moyen total des loueurs
CoûtMoyenMIN = 99999
For i = 1 To 3
If CoûtMoyenTot(i) < CoûtMoyenMIN And CoûtMoyenTot(i) > 0 Then
CoûtMoyenMIN = CoûtMoyenTot(i)
j = i
Set cible = Range("M" & ligPays(j))
End If
Next i
UserForm1.Controls("lbl_Loueur").Caption = strFournisseur(j) & " " & Format(CoûtMoyenMIN, "€ ####.00")
'Cellule cible à mettre en forme
cible.Select
End Sub
Bonjour ExcLnoob, Pounet95, le forum,
Une autre solution à tester.
Dans le formulaire, j’ai ajouté le Coût moyen du carburant pour une journée. Actuellement, celui-ci est fixe.
Lorsque le coût véhicule choisi est égal à 0, j’ai remplacé celui-ci par 5 000, afin que le Coût moyen total soit très élevé. A revoir pour la présentation.
Cordialement,
Bernard
Bonjour,
Ca fait plaisir d'avoir un retour. Ce n'est hélas pas toujours le cas !
Le principal est que la base soit posée et que l'appropriation se fasse.
La cellule à cibler est celle de la colonne M ligne "ligPays"
Pour cela j'ai modifié ligpays en ligpays(3) et créé une variable cible de type Range
Reste à la faire "ressortir" dans le tableau
Bonne continuation
PS : le module 3 ne sert à rien: il a été créé lors d'un enregistrement de macro. Il peut être supprimé.
VB:
Option Explicit
Dim strPays As String
Dim strType As String
Dim strMoteur As String
Dim strFournisseur(3) As String
Dim nbJours As Integer
Sub Calculs()
Dim strPays As String
Dim ligPays(3) As Long
Dim CoûtMoyenTot(3) As Double
Dim CoûtMoyenMIN As Double
Dim i As Integer 'indice de boucle
Dim j As Integer 'idem
Dim cible As Range 'cellule cible
strFournisseur(1) = "RentaCar"
strFournisseur(2) = "EuropeCar"
strFournisseur(3) = "Hertz"
On Error Resume Next
Application.CutCopyMode = False
With UserForm1
strPays = .Controls("combo_Pays").Value
strMoteur = .Controls("combo_Moteur").Value
strType = .Controls("combo_Type").Value
nbJours = Val(.Controls("txt_nb_Jours").Text)
End With
'pour chaque Loueur,mettre à jour la ligne correspondant au Pays
For i = 1 To 3
Range("Tarifs_" & strFournisseur(i)).Select
ligPays(i) = Selection.Find(What:=strPays, After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Row
'Mettre les valeurs dans les cellules correspondantes au pays
'Coût véhicule choisi en fonction du carburant moteur
Select Case strMoteur
Case "Essence"
'et en fonction du type Berline ou Coupé
If strType = "Berline" Then
Range("I" & ligPays(i)) = Range("C" & ligPays(i))
Else
Range("I" & ligPays(i)) = Range("D" & ligPays(i))
End If
Case "Electrique"
'et en fonction du type Berline ou Coupé
If strType = "Berline" Then
Range("I" & ligPays(i)) = Range("E" & ligPays(i))
Else
Range("I" & ligPays(i)) = Range("F" & ligPays(i))
End If
Case "Diesel"
'et en fonction du type Berline ou Coupé
If strType = "Berline" Then
Range("I" & ligPays(i)) = Range("G" & ligPays(i))
Else
Range("I" & ligPays(i)) = Range("H" & ligPays(i))
End If
End Select
'Nombre de jours de location
Range("J" & ligPays(i)) = nbJours
'Récupère le coût moyen
CoûtMoyenTot(i) = Range("M" & ligPays(i))
Next i
'Meilleure offre
'Le MIN de chacune des valeurs MIN du coût moyen total des loueurs
CoûtMoyenMIN = 99999
For i = 1 To 3
If CoûtMoyenTot(i) < CoûtMoyenMIN And CoûtMoyenTot(i) > 0 Then
CoûtMoyenMIN = CoûtMoyenTot(i)
j = i
Set cible = Range("M" & ligPays(j))
End If
Next i
UserForm1.Controls("lbl_Loueur").Caption = strFournisseur(j) & " " & Format(CoûtMoyenMIN, "€ ####.00")
'Cellule cible à mettre en forme
cible.Select
End Sub
Bonjour,
Merci ca marche!!
Par contre j'ai transposé le code dans mon fichier source mais je n'arrive pas à faire référence à la feuille Paramètres et n'ai donc aucune liste dans mes Combobox
Je craque!!
Me manque plus que ça à mon avis
Bonsoir,
Pour mettre les listes dans les combobox, remplacer le code actuel par celui-ci dessous
Les noms des listes dans la feuille Paramètres ont été créés manuellement.Pour les créer automatiquement, ajouter la sub et la fonction ci-dessous dans le module
Dans le Thisworkbook, évènement Open
Code:
Private Sub Workbook_Open()
MAJ_Listes_Combo
End Sub[
'----------------------------------------------------------------
' Remplacer dans l'évènement Initialize de l'USF
'----------------------------------------------------------------
Private Sub UserForm_Initialize()
'Mettre les noms des Listes utilisées dans les combobox
With combo_Pays
.RowSource = "PaysLoc"
.ListIndex = -1
End With
With combo_Moteur
.RowSource = "Carburant"
.ListIndex = -1
End With
With combo_Type
.RowSource = "TypeAuto"
.ListIndex = -1
End With
txt_nb_Jours.Text = ""
lbl_Loueur.Caption = ""
End Sub
'----------------------------------------------------------
' A mettre dans le module
'----------------------------------------------------------
Sub MAJ_Listes_Combo()
Dim derLig As Long
Dim rng As Range
Dim nomRng As String
With Sheets("Paramètres Listes")
'Liste Pays en colonne A
derLig = .Range("A10000").End(xlUp).Row
Set rng = .Range("A2:A" & derLig)
nomRng = "PaysLoc"
MAJ_Plage nomRng, rng
'Liste Carburant en colonne C
derLig = .Range("C10000").End(xlUp).Row
Set rng = .Range("C2:C" & derLig)
nomRng = "Carburant"
MAJ_Plage nomRng, rng
'Liste Type Auto en colonne E
derLig =. Range("E10000").End(xlUp).Row
Set rng =.Range("E2:E" & derLig)
nomRng = "TypeAuto"
MAJ_Plage nomRng, rng
End With
End Sub
Function MAJ_Plage(strNom As String, plgRng As Range)
On Error Resume Next
ThisWorkbook.Names.Delete strNom
ThisWorkbook.Names.Add Name:=strNom, RefersTo:=plgRng
End Function