Microsoft 365 Userform avec liste déroulante et réslutat

ExcLnoob

XLDnaute Occasionnel
Bonjour,

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

Merci d'avance pour votre support.
 

Pièces jointes

  • Classeur1.xlsm
    26.7 KB · Affichages: 35
Solution
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...

bbb38

XLDnaute Accro
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
 

Pounet95

XLDnaute Occasionnel
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 ?
 

Pièces jointes

  • Classeur1 modifié.xlsm
    28.7 KB · Affichages: 28

ExcLnoob

XLDnaute Occasionnel
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!
 

Pounet95

XLDnaute Occasionnel
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 ?
 

ExcLnoob

XLDnaute Occasionnel
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...
 

Pounet95

XLDnaute Occasionnel
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
 

Pièces jointes

  • Classeur1 modifié.xlsm
    40.3 KB · Affichages: 13

ExcLnoob

XLDnaute Occasionnel
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!!
 

Pièces jointes

  • Classeur1 modifié.xlsm
    38.9 KB · Affichages: 12

Pounet95

XLDnaute Occasionnel
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
 

bbb38

XLDnaute Accro
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
 

Pièces jointes

  • ExcLnoob.xlsm
    35.8 KB · Affichages: 24

ExcLnoob

XLDnaute Occasionnel
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
 

ExcLnoob

XLDnaute Occasionnel
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
 

Pounet95

XLDnaute Occasionnel
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
 

Discussions similaires

Statistiques des forums

Discussions
315 109
Messages
2 116 311
Membres
112 716
dernier inscrit
jean1234