Création d'un msgbox

JULIEN -  
NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Dans le cadre d'un cours d'informatique, je dois créer un fichier excel avec des macros et autre...

S'agissant d'un programme de gestion de stocks, dans un premier temps, je voudrais qu'à l'ouverture de mon document, un msgbx apparaisse en indiquant "bienvenue, veuillez préciser si vous êtes client ou administrateur"

Il faudrait que sous ce texte 2 "boutons" apparaissent : client et administrateur, et que ça n'ouvre pas la même page excel selon que l'utilisateur est client ou administrateur.

J'arrive bien à créer mon msg box mais je ne peux que cliquer sur Ok, je n'arrive pas à créer les options ...

Pouvez vous m'aider SVP

3 réponses

  1. NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention   387
     
    Soit tu utilise les paramètres de MsgBox pour afficher plus de boutons (standards évidemment).
    Soit tu fais ta propre UserForm.
    0
  2. hcp7kuz Messages postés 238 Date d'inscription   Statut Membre Dernière intervention   23
     
    Salut, j'ai trouver cette page http://www.mdf-xlpages.com/modules/publisher/item.php?itemid=42 mais après l'avoir testé, une erreur persiste et la cause de celle-ci m'est encore obscure...

    Sinon, pour contourner le problème tu peux demander si l'utilisateur est admisatrateur, comme ici :

            If MsgBox("Bienvenue, êtes vous administrateur ?", vbYesNo, "Bienvenue") = vbYes Then
                'Si l'utilisateur appuie sur le bouton oui
                '...
            Else
                'Si l'utilisateur appuie sur le bouton non
                '...
            End If


    hcp7kuz
    0
    1. Utilisateur anonyme
       
      Bonjour hcp7kuz,
      Tu n'as pas indiqué quelle est l'erreur qui persiste, mais comme j'ai suivi
      ton lien, peut-être est-elle due à ce qui est noté tout en bas de la page :
      rubrique « Remarques importantes ! » ? Bien sûr, si tu l'as déjà lu,
      ce présent message est sans objet.  😉
      Cordialement.  😊
      0
      1. hcp7kuz Messages postés 238 Date d'inscription   Statut Membre Dernière intervention   23 > Utilisateur anonyme
         
        Merci de ta remarque albkan, mais j'avais bien lu cette rubrique, et l'erreur ne venait pas de là.

        J'ai refait quelques recherches à l'instant, et j'ai trouvé l'erreur, et je l'ai corrigé.

        Le MsgBox s'affiche bien, sauf que les boutons ne sont pas personnalisés, peut-être ce code ne marche-t-il que pour des versions antérieurs de Excel ? Le mystère persiste...

        hcp7kuz
        0
      2. Utilisateur anonyme > hcp7kuz Messages postés 238 Date d'inscription   Statut Membre Dernière intervention  
         
         
        Bonjour hcp7kuz,

        Tu as écris : « Le MsgBox s'affiche bien, sauf que les boutons ne sont pas
        personnalisés
        ».

        Voici le tout début de la rubrique « Remarques importantes ! » :
        «
        Curieusement, les tests de cette procédure à base d'API Windows ne fonctionnent
        pas lorsqu'on lance le code directement depuis l'éditeur VBE. Dans ce cas, les
        boutons afficheront invariablement leur valeur par défaut (c'est à dire "Oui" et
        "Non"). Il convient donc de lancer vos tests depuis l'interface Excel (comme le fera
        l'utilisateur de votre projet) et non depuis l'éditeur de code VBA.
        »

        Donc il me semble que la citation de la rubrique explique ton problème, non ?
        Si ça affiche invariablement "Oui" et "Non" depuis Microsoft Visual Basic,
        les boutons ne sont donc pas personnalisés, comme tu l'as signalé. Tu dois
        donc, pour que ça marche, exécuter la macro depuis la feuille Excel.

        Mais si ce n'est pas ça, alors oui, effectivement, ça vient d'autre chose,
        et le mystère persiste...

        Cordialement.  😊
         
        0
      3. hcp7kuz Messages postés 238 Date d'inscription   Statut Membre Dernière intervention   23 > Utilisateur anonyme
         
        Boujour Albkan,

        Encore merci pour ta remarque, car, comme tu as pu le remarquer, j'étais dans le feu de l'action, et j'en ai malencontreusement oublié ladite rubrique. Il est vrai que, lorsque que l'on exécute le code depuis l'interface excel, tout marche beaucoup mieux !

        JULIEN, voici donc la fonction MsgBoxPerso, servant à afficher une MsgBox avec des boutons personnalisables. Ajoute déjà un module (insertion > module), dans lequel tu vas coller ce code :

        Option Explicit
        
        Public Declare Function SetWindowsHookEx& Lib "USER32" Alias "SetWindowsHookExA" _
                (ByVal idHook&, ByVal lpfn&, ByVal hmod&, ByVal dwThreadId&)
        Public Declare Function GetCurrentThreadId& Lib "kernel32" ()
        Public Declare Function CallNextHookEx& Lib "USER32" _
                (ByVal hHook&, ByVal CodeNo&, ByVal wParam&, ByVal lParam&)
        Public Declare Function GetWindow& Lib "USER32" (ByVal hWnd&, ByVal wCmd&)
        Public Declare Function SetWindowText& Lib "USER32" Alias "SetWindowTextA" _
                (ByVal hWnd&, ByVal lpString$)
        Public Declare Function UnhookWindowsHookEx& Lib "USER32" (ByVal hHook&)
        Public msgHook&
        Public TitreBtn$(1 To 2)
         
        Public Function MsgBoxPerso(Prompt$, Optional Title$, Optional Icon&, Optional Caption1$ = "Oui", _
            Optional Caption2$ = "Non", Optional Cancel As Boolean = False) As Byte
        Dim Rep%, hInstance&
            TitreBtn(1) = Caption1
            TitreBtn(2) = Caption2
            msgHook = SetWindowsHookEx(5, AddressOf CaptionBoutons, hInstance, GetCurrentThreadId())
            Rep = MsgBox(Prompt, Icon + IIf(Cancel, vbYesNoCancel, vbYesNo), Title)
            MsgBoxPerso = Application.Max(Rep - 5, 0)
            Erase TitreBtn
        End Function
         
        Public Function CaptionBoutons&(ByVal nCode&, ByVal wParam&, ByVal lParam&)
        Dim hWndChild&
          If nCode < 0 Then
            CaptionBoutons = CallNextHookEx(msgHook, nCode, wParam, lParam)
            Exit Function
          End If
          If nCode = 5 Then
            hWndChild = GetWindow(wParam, 5)
            Call SetWindowText(hWndChild, TitreBtn(1))
            hWndChild = GetWindow(hWndChild, 2)
            Call SetWindowText(hWndChild, TitreBtn(2))
            UnhookWindowsHookEx msgHook
          End If
          CaptionBoutons = False
        End Function


        Ensuite, pour utiliser la fonction, colle ce code :
            Dim Rep As Byte
            
            'A remplacer par : Rep = MsgBoxPerso("Bienvenue, êtes-vous client ou administrateur ?", "Bienvenue", vbQuestion, "Client", "Administrateur", True)
            '    si tu veux afficher le bouton annuler
            Rep = MsgBoxPerso("Bienvenue, êtes-vous client ou administrateur ?", "Bienvenue", vbQuestion, "Client", "Administrateur")
            
            Select Case Rep
            Case 0
                'ici le traitement (éventuel) si Annulation
                '...
            Case 1
                'ici le traitement si l'utilisateur clique sur le bouton Client
                '...
            Case 2
                'ici le traitement si l'utilisateur clique sur le bouton Administrateur
                '...
            End Select


        Et, au risque de répéter, cela ne marche que depuis l'interface excel !

        Cdlt

        hcp7kuz
        0
    2. NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention   387
       
      Si par bouton personnalisés tu veux dire des boutons qui portent un nom que tu définit, oui, ce ne sera pas possible avec MsgBox, il te faudra forcément faire une UserForm personnalisée.
      0
  3. Julien LE RAY
     
    Merci, à tous pour vos réponses qui me sont tès utiles. j'ai réussi à créer l'userform avec les botuons que je souhaite. il faut maintenant que j'arrive à le faire disparaitre une fois que j'ai cliqué... Je vais essayer avec la foction if then...
    0
    1. hcp7kuz Messages postés 238 Date d'inscription   Statut Membre Dernière intervention   23
       
      Boujour Julien LE RAY,

      As-tu testé la fonction que jai donné plus haut ? Elle fonctionne parfaitement, lorsqu'elle est utilisé correctement, tu n'as pas besoin d'utiliser d'UserForm, et elle fonctionne exactement comme un MsgBox classique, à quelques exceptions près.

      hcp7kuz
      0
    2. NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention   387
       
      Pour cacher la UserForm : :
      Unload MaUserForm
      ou
      MaUserForm.Hide
      0
      1. hcp7kuz Messages postés 238 Date d'inscription   Statut Membre Dernière intervention   23 > NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Désolé NHenry, mais pourquoi s'obstiner à utiliser une UserForm alors que la solution, proposée un peu plus haut, est celle demandée ?
        0
    3. NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention   387
       
      L'avantage de la Userform est qu'après il pourra faire plus de chose avec.
      Ta solution semble fonctionnelle (je ne peux pas tester, je n'ai pas M$ Office sur ma machine), mais elle est difficilement compréhensible par un débutant.

      Je privilégie une solution simple avec un code à faire.

      Après, je suis d'accord avec toi, ta solution peut être intéressante.
      0