Messagebox selbstständig schließend nach 10 Sekunden
#1
69 Hallo,

ich versuche ein Makro zu basteln, dass eine Messagebox automatisch nach 10 Sekunden selbstständig schließt. Warum mach' ich das? Ich starte manchmal Makros und gehe dann einer NICHT-computernotwendigen Tätigkeit nach. Dann soll das Makro nach der Abarbeitung der Hauptaufgabe auch die Exceldatei schließen. Weiterhin möchte ich einige Exceldateien um dieses selbstschließende Nachrichtenfenster erweitern. Dann könnte ich bestimmte Annahmen bei NICHT-click von Yes oder auch Nein treffen und das Makro weiterlaufen lassen.
Ich habe schon einige Makros dahingehend gefunden. Doch leider laufen sie nicht. Und ich erkenne nicht warum. Hoffentlich könnt ihr mir helfen 22 .

Sub MsgBox3Sec()
'Verweis auf MS Scripting Runtime
Dim WsShell
Dim intText As Integer
    Set WsShell = CreateObject("WScript.Shell")
    intText = WsShell.Popup("Diese Meldung wird nach 3 Sekunden geschlossen.", 3, "Dezenter Hinweis für " & Application.UserName & ":")
'Die "3" in der letzten Zeile gibt die Öffnungsdauer in Sekunden an.
End Sub



Das Makro startet ordnungsgemäß 63 . Es schließt aber nicht nach 3 Sekunden, wie es sollte Angry . Erst das Klicken von OK schließt das Fenster.
Könnte es sein, dass WScript.Shell bei mir nicht läuft Huh ? Ich habe zumindest die Vermutung 92 . Leider reichen meine Kenntnisse auch nicht soweit, dass ich wüsste, wo ich nachsehen muss. 

VG
Walter
Top
#2
Hallo, 19

probiere es mal so: 21

Code:
Option Explicit
Private Declare PtrSafe Function MessageBoxTimeOut Lib "user32.dll" Alias "MessageBoxTimeoutA" _
    (ByVal hWnd As Long, ByVal lpText As String, ByVal lpCation As String, _
    ByVal uType As Long, ByVal wLanguageId As Integer, ByVal dwMiliseconds As Long) As Integer
Public Sub Main()
    Dim lngTMP As Long
    lngTMP = MessageBoxTimeOut(0, "Nach 5 Sekunden weg...", "TimeOut", vbYesNo Or vbInformation, 0, 5000)  '5000 = 5 Sekunden
    Debug.Print lngTMP
End Sub
[-] Folgende(r) 1 Nutzer sagt Danke an Gast für diesen Beitrag:
  • ClevEx
Top
#3
Hallo Case,

danke für die schnelle Hilfe.  23
Deine VBA-Anweisungen macht das, was ich mir vorgestellt habe 21 . Das Fenster verschwindet nach der angegebenen Zeit, wenn ich keinen Button gedrückt habe. 28

Super!

Viele Grüße
ClevEx
Top
#4
(25.05.2021, 12:11)@Case schrieb:
Code:
Option Explicit
Private Declare PtrSafe Function MessageBoxTimeOut Lib "user32.dll" Alias "MessageBoxTimeoutA" _
    (ByVal hWnd As Long, ByVal lpText As String, ByVal lpCation As String, _
    ByVal uType As Long, ByVal wLanguageId As Integer, ByVal dwMiliseconds As Long) As Integer
Public Sub Main()
    Dim lngTMP As Long
    lngTMP = MessageBoxTimeOut(0, "Nach 5 Sekunden weg...", "TimeOut", vbYesNo Or vbInformation, 0, 5000)  '5000 = 5 Sekunden
    Debug.Print lngTMP
End Sub
Nur als Nachfrage Smile
wäre es nicht hilfreich, das Handle vom Fenster auf die Application zu setzen:
MessageBoxTimeOut(Application.hWnd, "Nach 5 Sekunden weg..
Top
#5
Hallo, 19

in dem Fall unerheblich.
Top
#6
Und wer entscheidet dies, welches Fenster das Parent Fenster ist?
Wo was modal ist
Oder gehst du davon aus, dass jeder weiß, was dieser Parameter überhaupt bedeutet
Oder weiß du überhaupt selbst, was dieser bedeutet Smile 
Ich gestehe, ich habe dabei meine Zweifel. Und entschuldige mich gleich, wenn du nicht zu denjenigen gehörst, welche Elemente der Windows API nicht nur kopieren ohne sie zu verstehen.

Es gibt m.E. meines Erachtens  nur wenige im Forum/Newsgroups Raum (z.B. Michael Schwimmer) die über den Tellerrand blicken.
(Ich zähle mich nicht dazu, auch wenn ich mich verzweifelt in Dan Appleman's Windows API versucht habe Sad , aber zumindest habe ich mich damit beschäftigt)

Hast du es mal ausprobiert, wie sich das verhält mit den unterschiedlichen Handles
Wie Excel was zulässt oder überhaupt was überhaupt ein Windows Handle ist.

Ein Select Case ist halt nicht alles Smile
Top
#7
Moin,

ich mische mich jetzt mal ein, wenn's ok ist. Hwnd = 0 ist der Desktop (immer so), man kommt also an das Excel-Fenster dran.
Application.hWnd setzt es auf das Excel-Fenster, man kommt also nicht an das Excel-Fenster dran. Das wäre jetzt auch meine
Empfehlung, wenn auch nicht zwingend.

Gruß
Microsoft Excel Expert · Microsoft Most Valuable Professional (MVP) :: 2011-2019 & 2020-2022 :: 10 Awards
https://de.excel-translator.de/translator :: Online Excel-Formel-Übersetzer :: Funktionen :: Fehlerwerte :: Argumente :: Tabellenbezeichner
Top
#8
Hallo Jeanie, 19

ich versuche mal deine Fragen und unberechtigten Anschuldigungen zu beantworten: 21

Du:
Und wer entscheidet dies, welches Fenster das Parent Fenster ist?
Antwort:
In meinem Beispiel ich.

Du:
Wo was modal ist?
Antwort:
In meinem Beispiel ich (ByVal uType As Long)

Du:
Oder gehst du davon aus, dass jeder weiß, was dieser Parameter überhaupt bedeutet?
Antwort:
Nein.

Du:
Oder weißt du überhaupt selbst, was dieser bedeutet?
Antwort:
Ja.

Du:
Ich gestehe, ich habe dabei meine Zweifel. Und entschuldige mich gleich, wenn du nicht zu denjenigen gehörst, welche Elemente der Windows API nicht nur kopieren ohne sie zu verstehen.
Antwort:
Ich verstehe sie. Entschuldigung nicht angenommen.

Du:
Hast du es mal ausprobiert, wie sich das verhält mit den unterschiedlichen Handles?
Antwort:
Ja.

Du:
Wie Excel was zulässt oder überhaupt was überhaupt ein Windows Handle ist?
Antwort:
Ja - und ich weiß was ein Handle ist.

Du:
Ein Select Case ist halt nicht alles.
Antwort:
Ein grünes Fläschchen ist ohne Meister überflüssig.

Nach allem bleibe ich bei meiner Aussage, dass es in diesem Fall unerheblich ist. Bei dieser (in meinen Augen überflüssigen) Diskussion bekommt man den Eindruck, als ob der Unterschied zwischen "Application.hWnd" und "0" die Verschiebung der Erdachse zur Folge hat. Oder eine globale Hungersnot.

Für Entscheidender halte ich den Parameter "uType": 21

Code:
Option Explicit
Private Declare PtrSafe Function MessageBoxTimeOut Lib "user32.dll" Alias "MessageBoxTimeoutA" _
    (ByVal hWnd As Long, ByVal lpText As String, ByVal lpCation As String, _
    ByVal uType As Long, ByVal wLanguageId As Integer, ByVal dwMiliseconds As Long) As Integer
Public Sub Main_1()
    Dim lngTMP As Long
    lngTMP = MessageBoxTimeOut(0, "Nach 5 Sekunden weg...", "TimeOut", 0, 0, 5000)  '5000 = 5 Sekunden
End Sub
' ByVal uType As Long
' vbApplicationModal = 0
' Der Benutzer muss auf das Meldungsfenster reagieren, bevor er die Arbeit in dem durch den hWnd-Parameter identifizierten Fenster fortsetzt.
' Der Benutzer kann jedoch zu den Fenstern anderer Threads wechseln und in diesen Fenstern arbeiten.
' Abhängig von der Hierarchie der Fenster in der Anwendung kann der Benutzer möglicherweise zu anderen Fenstern innerhalb des Threads wechseln.
' Alle untergeordneten Fenster des übergeordneten Elements des Meldungsfensters werden automatisch deaktiviert, Popup-Fenster jedoch nicht.
' vbApplicationModal ist der Standardwert, wenn vbSystemModal nicht angegeben ist.

Public Sub Main_2()
    Dim lngTMP As Long
    lngTMP = MessageBoxTimeOut(0, "Nach 5 Sekunden weg...", "TimeOut", 4096, 0, 5000)  '5000 = 5 Sekunden
End Sub
' ByVal uType As Long
' vbSystemModal = 4096
' Wie vbApplicationModal, außer dass das Meldungsfenster den Stil TOPMOST hat.
' Es bleibt also im Vordergund, auch wenn ich andere Fenster anklicke. Dieses Flag hat keine Auswirkung auf die Möglichkeit des Benutzers, mit anderen Fenstern
' als denen zu interagieren, die mit hWnd verknüpft sind.

Public Sub Main_3()
    Dim lngTMP As Long
    lngTMP = MessageBoxTimeOut(Application.hWnd, "Nach 5 Sekunden weg...", "TimeOut", 0, 0, 5000)  '5000 = 5 Sekunden
End Sub
' Mann kann die Konstanten natürlich auch im Kopf deklarieren
' Private Const TrallalaUNDHoppsassa = &H1000&
' und dann die Bezeichnung im Makro verwenden

Public Sub Main_4()
    Dim lngTMP As Long
    lngTMP = MessageBoxTimeOut(Application.hWnd, "Nach 5 Sekunden weg...", "TimeOut", 4096, 0, 5000)  '5000 = 5 Sekunden
End Sub

Public Sub Main_5()
    Dim lngTMP As Long
    lngTMP = MessageBoxTimeOut(0, "Nach 5 Sekunden weg...", "TimeOut", 4 + 4096, 0, 5000)  '5000 = 5 Sekunden
End Sub
' 4 + 4096
' Parameter können kombiniert werden
' Hier wird vbYesNo = 4 die Schaltflächen Ja und Nein angezeigt UND vbSystemModal = 4096 das Fenster an das System gebunden.
[attachment=38968]
Top
#9
Offiziell, also in der Doku, gibt es die Funktion MessageBoxTimeOut gar nicht SCNR
Oder habe ich da was übersehen 19

Und wie so oft hätte der TS ja auch mal selber goggeln können
https://stackoverflow.com/questions/4274...eout-value
Top
#10
Also wenn aus einer grünen Flasche kein "Gin" rauskommt - na wie blöd aber auch  22

Und wenn jemand meint, dass es vollkommen egal ist ob ein Dialog modal oder non modal sich zum Fenster öffnet, dann ist die Flasche halt leer (und wird sie vermutlich auch bleiben)

Und für alle anderen die hier mitlesen: es ist ganz wichtig, sich damit zu beschäftigen, denn es entscheidet, ob man noch in Excel arbeiten kann oder einen solchen Dialog erst schließen muss.
Seit Excel 2013 ist dies leider sehr viel komplexer geworden, da sich hier etwas von MDI zu SDI gewandelt hat. (Multi Document Interface - Single Document Interface), was die Modalität erheblich erschwert hat.

Leider hat MS hier vollkommen versagt bei der Umstellung. So schön es für den Anwender ist, mit mehreren Fenstern in Excel zu arbeiten so blöd ist es für Entwickler (außer natürlich für diejenigen, welchen das - wie gelesen - eh am ... vorbei geht 95 )

Glaubt nicht alles was ihr lest !
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste