Thema Datum  Von Nutzer Rating
Antwort
30.12.2020 14:01:09 Gast91257
NotSolved
30.12.2020 14:10:49 Mackie
NotSolved
Rot MsgBox mit eigenem Icon und eigener Buttonbeschriftung anzeigen
30.12.2020 14:35:41 volti
NotSolved
30.12.2020 14:39:38 volti
NotSolved
30.12.2020 14:56:21 Gast64367
NotSolved

Ansicht des Beitrags:
Von:
volti
Datum:
30.12.2020 14:35:41
Views:
523
Rating: Antwort:
  Ja
Thema:
MsgBox mit eigenem Icon und eigener Buttonbeschriftung anzeigen
Hallo Otto,

das Ändern der Buttontexte und der Icons in einer MsgBox sind normalerweise nicht möglich.
Man kann sich aber so eine Msgbox mit diesen Funktionalitäten z.B. in einer Userform nachbauen, wie schon von Mackie angeführt.

Aber wenn wir ein paar API-Funktionen bemühen, kann das auch durchaus mit der Excel-internen Msgbox realisiert werden.
Mit den u.a. Funktionen lässt sich bequem eine Msgbox mit 1 bis 3 individuell geschrifteten Buttons erstellen.
Als Besonderheit wird nach Klick auf einen Button der Buttontext und keine Nummer zurückgegeben.

Das Icon kann anhand der ID aus einer Ressourcendatei (z.B. Shell32.dll) aus den dort vorhandenen, vordefinierten Icons entnommen werden.
Oder man holt es aus einer Ico-Datei. Mit einem Imageeditor (z.B. auch Paint) kann man sich selbst Icons malen. s. u.a. Beispiel

Hat man erst das Handle der Msgbox, kann man diese nun auch für CountDowns, Timeout nach bestimmter Zeit oder Laufschriften einsetzen.

Hier ein Beispiel aus meiner Bastelkiste:

Code:
 
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58  
' Excel-MsgBox mit eigenem Button und Icon aus Ico-Datei versehen Private Declare PtrSafe Function SetTimer Lib "user32" ( _         ByVal hwnd As LongPtrByVal nIDEvent As LongPtr, _         ByVal uElapse As LongByVal lpTimerFunc As LongPtrAs LongPtr Private Declare PtrSafe Function KillTimer Lib "user32" ( _         ByVal hwnd As LongPtrByVal nIDEvent As LongPtrAs Long Private Declare PtrSafe Function FindWindowA Lib "user32" ( _         ByVal lpClassName As StringByVal lpWindowName As StringAs LongPtr Private Declare PtrSafe Function SetDlgItemTextA Lib "user32" ( _         ByVal hDlg As LongPtrByVal nIDDlgItem As LongByVal lpString As StringAs Long Private Declare PtrSafe Function LoadImageA Lib "user32" ( _         ByVal hInst As LongPtrByVal lpsz As String, _         ByVal un1 As LongByVal n1 As LongByVal n2 As LongByVal un2 As LongAs LongPtr Private Declare PtrSafe Function SendDlgItemMessageA Lib "user32" ( _         ByVal hDlg As LongPtrByVal nIDDlgItem As LongByVal wMsg As Long, _         ByVal wParam As LongPtrByVal lParam As LongPtrAs LongPtr          Dim hTimer As LongPtr Dim gsPfad  As String, gsCaption As String, sBtns(5As String Function MsgBoxEx(sText As StringOptional sBtnText As String = "OK", _          Optional ByVal vbStyle As LongOptional sCaption As String, _          Optional sIconPfad As StringAs String   Dim sBtnArr() As String, iOffset As Integer      gsCaption = sCaption: gsPfad = sIconPfad              ' Parameter global setzen      vbStyle = vbStyle And &HFFFF8                         ' Buttonteil abtrennen   sBtnArr = Split(sBtnText, ",")   Select Case UBound(sBtnArr)                           ' Buttonstyle setzen   Case 0: vbStyle = vbStyle Or vbOKOnly:   sBtns(2) = sBtnArr(0): iOffset = 1   Case 1: vbStyle = vbStyle Or vbOKCancel: sBtns(1) = sBtnArr(0): sBtns(2) = sBtnArr(1)   Case 2: vbStyle = vbStyle Or vbAbortRetryIgnore:           sBtns(3) = sBtnArr(0): sBtns(4) = sBtnArr(1): sBtns(5) = sBtnArr(2)   End Select      hTimer = SetTimer(0&0&25AddressOf SetIconButtontext)   MsgBoxEx = Replace(sBtns(MsgBox(sText, vbStyle, gsCaption) + iOffset), "&", "") End Function Private Sub SetIconButtontext() ' Setzt die Button-Texte und das Icon individuell   Dim hwnd As LongPtr, iBtn As Integer   KillTimer 0&, hTimer                                  ' Timer löschen   hwnd = FindWindowA("#32770", gsCaption)               ' Handle der DlgBox ermitteln ' &H170=STM_SETICON,  &H1=IMAGE_ICON,  40=Breite, Höhe,  &H10=LR_LOADFROMFILE   If gsPfad <> "" Then _   SendDlgItemMessageA hwnd, 20&H170LoadImageA(0&, gsPfad, &H14040&H10), 0   For iBtn = 1 To 5SetDlgItemTextA hwnd, iBtn, sBtns(iBtn): Next iBtn End Sub Sub Aufruftest()   MsgBox (MsgBoxEx("Bitte wähle die Schlumpfaktion aus!", "Schlumpfe &aus,Schlumpfe &ein", _           vbInformation, "Schlumpftest", "C:\ControlApp\schlumpf.ico")) End Sub
 
_________ viele Grüße Karl-Heinz

 


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
30.12.2020 14:01:09 Gast91257
NotSolved
30.12.2020 14:10:49 Mackie
NotSolved
Rot MsgBox mit eigenem Icon und eigener Buttonbeschriftung anzeigen
30.12.2020 14:35:41 volti
NotSolved
30.12.2020 14:39:38 volti
NotSolved
30.12.2020 14:56:21 Gast64367
NotSolved