MsgBox Personnalisé : Erreur arguments [Résolu/Fermé]

Signaler
Messages postés
6
Date d'inscription
lundi 26 mars 2018
Statut
Membre
Dernière intervention
30 mars 2018
-
Messages postés
23421
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
11 août 2020
-
Bonjour,

Récemment, j'ai cherché à créer des MsgBox personnalisés pour Excel 2007 (et dernières versions si possible)
Par mes recherches internet, j'ai trouvé le code suivant


Option Explicit

' Pour obtenir une MsgBox personnalisée dans votre propre projet VBA :
' ------------------------------------------------------------------
' - Copiez (ou importez) tout d'abord le présent module de code dans votre projet VBA.
' - Puis, dans votre propre code, il suffit d'appeler la fonction MsgBox comme suit :
'
' varReponse = MsgBoxPerso(prompt [, title] [, icon] [, caption1] [, caption2] [, cancel ])
'
'
' Comme pour une MsgBox 'classique', seul l'argument message est obligatoire :
' --------------------------------------------------------------------------
' prompt : chaîne de caractères correspondant au texte à afficher
' title : [facultatif] chaîne de caractères représentant le titre
' icon : [facultatif] valeur identique que pour une MsgBox classique
' constantes : vbCritical, vbQuestion, vbExclamation ou vbInformation
' caption1 : [facultatif] chaîne de caractères correspondant au titre du bouton n°1
' caption2 : [facultatif] chaîne de caractères correspondant au titre du bouton n°2
' cancel : [facultatif] affiche un bouton Annuler dans la boîte de dialogue si = True
'
'
' Valeur de retour :
' ----------------
' Le choix de l'utilisateur est renvoyé sous forme d'une valeur (type Byte) de 0 à 2 :
'
' 0 : l'utilisateur a cliqué sur le bouton Annuler
' 1 : l'utilisateur a cliqué sur le bouton n° 1
' 2 : l'utilisateur a cliqué sur le bouton n° 2
'
'===============================================================================================

Private Declare Function SetWindowsHookEx& Lib "USER32" Alias "SetWindowsHookExA" _
(ByVal idHook&, ByVal lpfn&, ByVal hmod&, ByVal dwThreadId&)
Private Declare Function GetCurrentThreadId& Lib "kernel32" ()
Private Declare Function CallNextHookEx& Lib "USER32" _
(ByVal hHook&, ByVal CodeNo&, ByVal wParam&, ByVal lParam&)
Private Declare Function GetWindow& Lib "USER32" (ByVal hWnd&, ByVal wCmd&)
Private Declare Function SetWindowText& Lib "USER32" Alias "SetWindowTextA" _
(ByVal hWnd&, ByVal lpString$)
Private Declare Function UnhookWindowsHookEx& Lib "USER32" (ByVal hHook&)
Private msgHook&
Private TitreBtn$(1 To 2)

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

Private 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


Mais plus loin, en utilisant MsgBoxPerso, apparaît le message "Erreur de compilation : Nombre d'arguments incoorect ou affectation de propriété incorrecte" en surlignant ce que vous verrez souligné dans le second code :

Je voulais ainsi savoir, d'où venait le problème exactement. Voici ce que j'ai écrit dans mon modèle ensuite :


Sub Bouton 2()
'
' Nomination des Dim
'
Dim MessageBox As String
Dim Rep As Byte
Dim Rep1Bis As Byte
Dim Rep2 As Byte
Dim Rep2Bis1 As Byte
Dim Rep2Bis2 As Byte
Dim Rep2Bis3 As Byte
Dim Rep2Bis4 As Byte
Dim Rep2Bis5 As Byte

MessageBox = "Que voulez-vous faire ?"
Rep = MsgBoxPerso(MessageBox, "Title", vbQuestion, "Caption1", , , True)
Rep1Bis = MsgBoxPerso("Prompt", "Title", , "Caption1", "Caption2", True)
Etc...


Merci d'avance,

3 réponses

Messages postés
6871
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
11 août 2020
537
Bonjour,

comme ceci:

 Dim varReponse
 varReponse = MsgBoxPerso("Exemple", "MsgBox perso", vbInformation)
MsgBox varReponse



Messages postés
6
Date d'inscription
lundi 26 mars 2018
Statut
Membre
Dernière intervention
30 mars 2018

Bonjour,

J'aimerai bien tester avec ce code, mais en revenant sur mon PC chez moi (qui a une version 2010 et 64 bits), une nouvelle erreur est apparue plus haut dans le code en disant que celui-ci ne fonctionne pas avec les versions 64Bits, et qu'il faut le mettre à jour pour continuer.

La partie mise en rouge :
Private Declare Function SetWindowsHookEx& Lib "USER32" Alias "SetWindowsHookExA" _
(ByVal idHook&, ByVal lpfn&, ByVal hmod&, ByVal dwThreadId&)
Private Declare Function GetCurrentThreadId& Lib "kernel32" ()
Private Declare Function CallNextHookEx& Lib "USER32" _
(ByVal hHook&, ByVal CodeNo&, ByVal wParam&, ByVal lParam&)
Private Declare Function GetWindow& Lib "USER32" (ByVal hWnd&, ByVal wCmd&)
Private Declare Function SetWindowText& Lib "USER32" Alias "SetWindowTextA" _
(ByVal hWnd&, ByVal lpString$)
Private Declare Function UnhookWindowsHookEx& Lib "USER32" (ByVal hHook&)


Comment faire ?

Merci d'avance,

Vincent
Messages postés
6871
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
11 août 2020
537
Je ne vois pas l’intérêt d'une telle démarche, alors qu'il y a de MsgBox programmés qui font la même chose

https://www.excel-pratique.com/fr/vba/boites_de_dialogue.php

Et si l'on veut a tout prix avoir son MsgBox perso, il suffit d'utiliser une UserForm et la paramétrer!

Je suis sous Windows 10 en 64 bits et Excel 2007, cela fonctionne, donc ton problème vient d’ailleurs

Voilà


Messages postés
6
Date d'inscription
lundi 26 mars 2018
Statut
Membre
Dernière intervention
30 mars 2018

Les MsgBoxperso me permettraient de changer les noms des boutons à l'intérieur, les nommer comme je le souhaite.

Pour ce qui est du UserForm, c'est la forme de celui-ci qui je trouve moins ergonomique que le MsgBox, et si on peut avoir la même forme, alors je ne sais pas le paramétrer.

Cordialement,
Vincent
Messages postés
6871
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
11 août 2020
537
voici un exemple de ce que l'on peut faire avec une UserForm, tu me diras la différence avec une MsgBox classique!

https://www.cjoint.com/c/HCEqSebJ81Q

@+ Le Pivert
Messages postés
23421
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
11 août 2020
6 284
Bonjour,

c'est ta version d'office qui est 64 bits.
On ne doit l'installer que si on est obligé, même si windows est en 64 bits.
Donc si tu n'as aucune raison impérative d'avoir excel 64 bits, désinstalle pour installer la version 32 bits.
eric


En essayant continuellement, on finit par réussir. 
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Messages postés
6871
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
11 août 2020
537
Bonjour,

Merci eriiic de ce complément d'information

@+
Messages postés
6
Date d'inscription
lundi 26 mars 2018
Statut
Membre
Dernière intervention
30 mars 2018

Re-bonjour,

Merci des infos, tout compte fait je vais rester sur 64 et m'approprier l'UserForm, comme ça pas de soucis d'adaptabilité si je lance le fichier sur un excel 32 bits.

Je met en résolu malgré tout car en soit la réponse a été donnée.
Messages postés
23421
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
11 août 2020
6 284
Tu es bien au courant que sur office 64 bits aucune macro utilisant des ActiveX ne pourront jamais fonctionner ?
Ces composants sont en 32 bits et ne seront jamais adaptés.
Autrement dit beaucoup de macros, il ne te restera que celles n'utilisant que les composants Formulaire très limités.

Si tu persistes malgré tout, si tu modifies pour que l'UF tourne en 64 bits, il ne tournera plus en 32 bits.
Il faut tester la version et utiliser des directives de compilation différentes pour chaque version si tu veux que ça reste compatible.
Maintenant c'est toi qui voit.
eric