MsgBox Personnalisé : Erreur arguments

Résolu/Fermé
VincentDu Messages postés 6 Date d'inscription lundi 26 mars 2018 Statut Membre Dernière intervention 30 mars 2018 - 30 mars 2018 à 16:31
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 - 30 mars 2018 à 23:07
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

cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
Modifié le 30 mars 2018 à 16:43
Bonjour,

comme ceci:

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



0
VincentDu Messages postés 6 Date d'inscription lundi 26 mars 2018 Statut Membre Dernière intervention 30 mars 2018
30 mars 2018 à 17:36
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
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
Modifié le 30 mars 2018 à 18:02
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à


0
VincentDu Messages postés 6 Date d'inscription lundi 26 mars 2018 Statut Membre Dernière intervention 30 mars 2018
30 mars 2018 à 18:19
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
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
30 mars 2018 à 18:45
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
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
Modifié le 30 mars 2018 à 18:43
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


0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
30 mars 2018 à 18:47
Bonjour,

Merci eriiic de ce complément d'information

@+
0
VincentDu Messages postés 6 Date d'inscription lundi 26 mars 2018 Statut Membre Dernière intervention 30 mars 2018
30 mars 2018 à 19:35
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.
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
Modifié le 30 mars 2018 à 23:12
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
0