Registriert seit: 17.12.2019
Version(en): MS Office Professional Plus 2016
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 . Sub MsgBox3Sec()'Verweis auf MS Scripting RuntimeDim WsShellDim 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äß . Es schließt aber nicht nach 3 Sekunden, wie es sollte . Erst das Klicken von OK schließt das Fenster. Könnte es sein, dass WScript.Shell bei mir nicht läuft ? Ich habe zumindest die Vermutung . Leider reichen meine Kenntnisse auch nicht soweit, dass ich wüsste, wo ich nachsehen muss. VG Walter
00202
Nicht registrierter Gast
Hallo, probiere es mal so: 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:1 Nutzer sagt Danke an Gast für diesen Beitrag 28
• ClevEx
Registriert seit: 17.12.2019
Version(en): MS Office Professional Plus 2016
Hallo Case, danke für die schnelle Hilfe. Deine VBA-Anweisungen macht das, was ich mir vorgestellt habe . Das Fenster verschwindet nach der angegebenen Zeit, wenn ich keinen Button gedrückt habe. Super! Viele Grüße ClevEx
Registriert seit: 16.08.2017
Version(en): Alle
(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 wäre es nicht hilfreich, das Handle vom Fenster auf die Application zu setzen: MessageBoxTimeOut(Application.hWnd, "Nach 5 Sekunden weg..
00202
Nicht registrierter Gast
Hallo, in dem Fall unerheblich.
Registriert seit: 16.08.2017
Version(en): Alle
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 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 , 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
Registriert seit: 08.05.2014
Version(en): Office 2010, Office 365, Office 365 Betakanal
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 Awardshttps://de.excel-translator.de/translator :: Online Excel-Formel-Übersetzer :: Funktionen :: Fehlerwerte :: Argumente :: Tabellenbezeichner
00202
Nicht registrierter Gast
Hallo Jeanie, ich versuche mal deine Fragen und unberechtigten Anschuldigungen zu beantworten: 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": 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]
Registriert seit: 18.10.2020
Version(en): 365
29.05.2021, 12:09
(Dieser Beitrag wurde zuletzt bearbeitet: 29.05.2021, 12:32 von Warkings.)
Offiziell, also in der Doku, gibt es die Funktion MessageBoxTimeOut gar nicht SCNR Oder habe ich da was übersehen Und wie so oft hätte der TS ja auch mal selber goggeln können https://stackoverflow.com/questions/4274...eout-value
Registriert seit: 16.08.2017
Version(en): Alle
Also wenn aus einer grünen Flasche kein "Gin" rauskommt - na wie blöd aber auch 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 ) Glaubt nicht alles was ihr lest !
|