Microsoft 365 MsgBox

Tioneb_h

XLDnaute Nouveau
Bonjour,

Y-a-t’il moyen de centrer la fenêtre du "MsgBox" sur la page Excel qui est ouverte et non pas sur le centre de l'écran ? 🤔

voici mon code au cas où :

VB:
Private Sub CommandButton5_Click()
 
Dim reponse As Integer

reponse = MsgBox("     Verrouiller les Prix Unitaires ?", vbQuestion + vbYesNoCancel, "     Copier / Coller vers un autre fichier")

If reponse = vbCancel Then
Cancel = True

ElseIf reponse = vbYes Then Call VerrouillerCopierColler

ElseIf reponse = vbNo Then Call CopierColler

End If
End Sub


Merci d'avance, 😉
Benoît
 

bouchard

XLDnaute Nouveau
Bonjour Benoit,
non, la fonction Msgbox ne permet pas de la positionner à l'écran.
Une solution, pas très simple, serait de se créer un formulaire qui reprend l'apparence du Msgbox et qui pourait être positionné là où l'on souhaite.
Cdlt
 

Phil69970

XLDnaute Barbatruc
Bonjour @Tioneb_h
Edit Bonjour @bouchard

Je te propose le fichier de cette discussion fait par quelques pointures d'excel


Attention il faudra rajouter Ptrsafe si tu as une version excel 64 bits comme moi

Merci de ton retour

@Phil69970
 

patricktoulon

XLDnaute Barbatruc
bonjour
allez pour le fun
tu reprends mon exemple de msgbox temporisé avec settimer qui agit en addressof et tu remplace le tempo par un repositionnement
comme ça vite fait je dirais
au lieu d'appeler le msgbox ( msgbox(blablabla))
tu l'appelle de la même manière mais par msgboxpos(blablabla)
tester la sub "test2"
VB:
'***************************************************************************************************************************
'**********************************************************************************
' __        _____  ___   .  ___         _____  ___             ___
'|__|  /\     |   |   |  | |     | /      |   |   | |   | |   |   | |\  |
'|    /__\    |   |---   | |     |/\      |   |   | |   | |   |   | | \ |
'|   /    \   |   |   \  | |___  |  \     |   |___| |___| |__ |___| |  \|
'
'***********************************************************************************
'                                                   COLLECTION BOITE DE DIALOGUE PERSO                                                  *                              COLLECTION BOX OF PERSONAL DIALOGUE                                                                *
'                                                     le vrai msgbox repositionnable                                                           *                                       The calendar Control                                                                      *
'Auteur: patricktoulon sur exceldownload                                                                                                *Author: patricktoulon on exceldownload                                                                                           *
'date version:18/04/2023
'version 1.0
'***************************************************************************************************************************

Option Explicit
#If VBA7 Then
    Private Declare PtrSafe Function SetTimer Lib "user32.dll" (ByVal hwnd As LongPtr, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As Long
    Private Declare PtrSafe Function KillTimer Lib "user32.dll" (ByVal hwnd As LongPtr, ByVal nIDEvent As Long) As Long
    Private Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    Dim x As LongPtr
#Else
    Private Declare Function SetTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    Private Declare Function KillTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
    Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Dim x As Long
#End If
Dim MsgBoxTitle$
Dim timerID&
Function msgboxPos(message As String, Optional style As VbMsgBoxStyle = vbOKOnly, Optional titre As String = "message")
    Dim Response$
    MsgBoxTitle = titre
    timerID = SetTimer(0, 0, 100, AddressOf repositionneMsgbox)
    Response = MsgBox(message, style, titre)
    msgboxPos = Response
End Function
Sub repositionneMsgbox()
    Dim posLeft&, PosTop&
    With Application
        posLeft = Int((.Left + ((.Width - 220) / 2)) * (4 / 3)) + 20
        PosTop = Int((.Top + ((.Height - 150) / 2)) * (4 / 3))
    End With
    x = FindWindow(vbNullString, MsgBoxTitle)
    SetWindowPos x, -1, posLeft, PosTop, 220, 150, &H0
    On Error Resume Next
    If timerID <> 0 Then KillTimer 0, timerID: timerID = 0:
End Sub


'exemple de simple msgbox d'avertissement
Sub test2()
    msgboxPos "coucou tout lemonde", vbOK + vbInformation, "messageTest"
End Sub

c'é bo la vie non?
a perfectionner:
par exemple avec api getwindowrect le rectangle du message pour avoir les vrai dimmentions d'orrigine
ici je l'impose a 220 de large et 150 de haut

faut pas m'en vouloir j'ai fait ça en 10 minutes
;)
 

Pièces jointes

  • msgbox positionné.xlsm
    16.3 KB · Affichages: 10

Tioneb_h

XLDnaute Nouveau
Bonjour @Tioneb_h
Edit Bonjour @bouchard

Je te propose le fichier de cette discussion fait par quelques pointures d'excel


Attention il faudra rajouter Ptrsafe si tu as une version excel 64 bits comme moi

Merci de ton retour

@Phil69970
Bonjour,

Je suis débutant dans Excel... je n'ai jamais utilisé UserForm 😇. Je vais approfondir la chose.
Merci à vous,

Benoît
 

Tioneb_h

XLDnaute Nouveau
bonjour
allez pour le fun
tu reprends mon exemple de msgbox temporisé avec settimer qui agit en addressof et tu remplace le tempo par un repositionnement
comme ça vite fait je dirais
au lieu d'appeler le msgbox ( msgbox(blablabla))
tu l'appelle de la même manière mais par msgboxpos(blablabla)
tester la sub "test2"
VB:
'***************************************************************************************************************************
'**********************************************************************************
' __        _____  ___   .  ___         _____  ___             ___
'|__|  /\     |   |   |  | |     | /      |   |   | |   | |   |   | |\  |
'|    /__\    |   |---   | |     |/\      |   |   | |   | |   |   | | \ |
'|   /    \   |   |   \  | |___  |  \     |   |___| |___| |__ |___| |  \|
'
'***********************************************************************************
'                                                   COLLECTION BOITE DE DIALOGUE PERSO                                                  *                              COLLECTION BOX OF PERSONAL DIALOGUE                                                                *
'                                                     le vrai msgbox repositionnable                                                           *                                       The calendar Control                                                                      *
'Auteur: patricktoulon sur exceldownload                                                                                                *Author: patricktoulon on exceldownload                                                                                           *
'date version:18/04/2023
'version 1.0
'***************************************************************************************************************************

Option Explicit
#If VBA7 Then
    Private Declare PtrSafe Function SetTimer Lib "user32.dll" (ByVal hwnd As LongPtr, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As Long
    Private Declare PtrSafe Function KillTimer Lib "user32.dll" (ByVal hwnd As LongPtr, ByVal nIDEvent As Long) As Long
    Private Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    Dim x As LongPtr
#Else
    Private Declare Function SetTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    Private Declare Function KillTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
    Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Dim x As Long
#End If
Dim MsgBoxTitle$
Dim timerID&
Function msgboxPos(message As String, Optional style As VbMsgBoxStyle = vbOKOnly, Optional titre As String = "message")
    Dim Response$
    MsgBoxTitle = titre
    timerID = SetTimer(0, 0, 100, AddressOf repositionneMsgbox)
    Response = MsgBox(message, style, titre)
    msgboxPos = Response
End Function
Sub repositionneMsgbox()
    Dim posLeft&, PosTop&
    With Application
        posLeft = Int((.Left + ((.Width - 220) / 2)) * (4 / 3)) + 20
        PosTop = Int((.Top + ((.Height - 150) / 2)) * (4 / 3))
    End With
    x = FindWindow(vbNullString, MsgBoxTitle)
    SetWindowPos x, -1, posLeft, PosTop, 220, 150, &H0
    On Error Resume Next
    If timerID <> 0 Then KillTimer 0, timerID: timerID = 0:
End Sub


'exemple de simple msgbox d'avertissement
Sub test2()
    msgboxPos "coucou tout lemonde", vbOK + vbInformation, "messageTest"
End Sub

c'é bo la vie non?
a perfectionner:
par exemple avec api getwindowrect le rectangle du message pour avoir les vrai dimmentions d'orrigine
ici je l'impose a 220 de large et 150 de haut

faut pas m'en vouloir j'ai fait ça en 10 minutes
;)
Bonjour,

Merci de votre retour... je vais voir pour appliquer le code dans mon fichier.

Bien à vous,
Benoît
 

bouchard

XLDnaute Nouveau
Bonjour Benoit.
pour un début ,pourquoi pas au plus simple, sans appel au API ni aux bibliothèques,
je te propose un formulaire simple et une fonction MsgboxXY

Code:
Public vrep
Function MsgBoxXY(Vmessage, vtitre, vx, vy)
UfMs.Tmessage = Vmessage
UfMs.Caption = vtitre
UfMs.Tx = vx
UfMs.Ty = vy
UfMs.Show
MsgBoxXY = vrep
End Function
Et dans le formulaire, je gère trois évènements
Code:
Private Sub CbAnnul_Click()
vrep = "Oui"
Unload UfMs
End Sub

Private Sub CBok_Click()
vrep = "Non"
Unload UfMs
End Sub

Private Sub UserForm_Activate()
UfMs.Left = Application.Left + Val(Tx)
UfMs.Top = Application.Top + Val(Ty)
End Sub
Voici le fichier.
Cdlt
 

Pièces jointes

  • FicTest.xlsm
    18.1 KB · Affichages: 2

patricktoulon

XLDnaute Barbatruc
re
bonjour @bouchard
et si le msgbox doit gerer autre chose que (oui/non) ;)

et si on se donne la peine de chercher




https://excel-downloads.com/threads...ai-msgbox-de-vba-temporise-supprime.20048141/

 
Dernière édition:

bouchard

XLDnaute Nouveau
Bonne remarque!
je pense que même un débutant qui se donne la peine d'approfondir ce code, sans difficulté, va pouvoir faire évoluer le formulaire et ses évènements. En posant la question, il prouve qu'il est déjà intéressé et motivé.

Bon apprentissage Benoit.
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 328
Membres
103 180
dernier inscrit
Vcr