Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Popup-Message auf Zeit (Nepomuk)

Forumthread: VBA Popup-Message auf Zeit (Nepomuk)

VBA Popup-Message auf Zeit (Nepomuk)
16.01.2022 15:34:49
Joschi
Hallo VBA-Kenner,
eigentlich hatte ich einen älteren Thread gesucht: https://www.herber.de/forum/messages/1826272.html
Doch dieser Link bringt einen Fehler 404.
Jetzt habe ich folgenden Thread gefunden: https://www.herber.de/forum/archiv/1712to1716/1715877_MsgboxTimer.html
Mein Problem 1: mit der im neuen Thread beschriebenen Technik CreateObject("WScript.Shell").Popup hatte ich früher schon das Problem, dass die Nachricht nicht nach der angegebenen Zeit verschwindet. Mit einem kleinen Test-Programm habe ich aktuell 10 Durchläufe mit jeweils 10 Sekunden Wartezeit gemacht. Die niedrigste gestoppte Zeit waren 14,566 Sekunden, die maximale Zeit unglaubliche 60,773 Sekunden. Dieses Problem hatte ich schon früher und habe deshalb den von Nepomuk in dem anfangs genannten Thread bereitgestellten API-Code (erfolgreich) iunter Excel m Einsatz.
Mein Problem 2: ich möchte diese API-Technik auch unter Word einsetzen. Doch da gibt es Probleme mit "Application.hWnd". Die Fehlermeldung: "Methode oder Datenobjekt nicht gefunden"
Wie kann ich das Word-Problem lösen?
Gruß Joschi
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Popup-Message auf Zeit (Nepomuk)
16.01.2022 16:48:40
volti
Hallo Joschi,
m.E. kannst Du die MsgBox auch ohne die Angabe der Elternfensters anwenden, also einfach 0 statt Application.hWnd einsetzen.
Oder Du nimmst den Desktop als Elternfenster (s.Beispiel). Aber da ist kein Unterschied in der Ausführung.
Code:

[Cc][+][-]

Option Explicit Private Declare PtrSafe Function GetDesktopWindow Lib "user32" () As LongPtr Private Declare PtrSafe Function MessageBoxTimeoutA Lib "user32" ( _ ByVal hwnd As LongPtr, _ ByVal lpText As String, _ ByVal lpCation As String, _ ByVal uType As Long, _ ByVal wLanguageId As Integer, _ ByVal dwMiliseconds As Long) As Long Private Const MB_TIMEOUT As Long = &H7D00 Public Sub test() Dim intReturn As Long intReturn = MessageBoxTimeoutA(GetDesktopWindow(), "Hallo", _ "TimeoutTest", vbYesNo Or vbInformation, 0, 5000) '5000 = 5 Sekunden Select Case CLng(intReturn) Case MB_TIMEOUT Debug.Print "TimeOut" Case vbOK, vbYes Debug.Print "Ok, Ja" Case vbAbort, vbCancel Debug.Print "Abrechen" Case vbNo Debug.Print "Nein" Case vbRetry Debug.Print "Wiederholen" Case Else Debug.Print intReturn End Select End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
AW: VBA Popup-Message auf Zeit (Nepomuk)
16.01.2022 17:45:26
Nepumuk
Hallo,
das würde gehen:

ThisDocument.Windows(1).Hwnd
Gruß
Nepumuk
AW: VBA Popup-Message auf Zeit (Nepumuk)
16.01.2022 17:53:45
Joschi
Hallo Karl-Heinz, hallo Nepomuk,
ich habe einen positiven Test mit "ThisDocument.Windows(1).Hwnd" gemacht. Das ist für mich die Lösung, Danke für die Unterstützung
Gruß Joschi.
Anzeige
AW: VBA Popup-Message auf Zeit (Nepumuk)
17.01.2022 07:50:58
Joschi
Nachtrag:
Ich habe inzwischen noch einen Testlauf mit der API-Version gemacht; gleiche Bedingungen wie beim "CreateObject("WScript.Shell").Popup"-Test..
Hier das Ergebnis:
minimale Wartezeit: 10,053
maximale Wartezeit: 10,111
Gruß Joschi
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige

Infobox / Tutorial

VBA Popup-Message auf Zeit


Schritt-für-Schritt-Anleitung

Um eine VBA Popup-Message zu erstellen, die nach einer bestimmten Zeit automatisch verschwindet, kannst Du die MessageBoxTimeoutA-API verwenden. Hier ist ein einfacher Schritt-für-Schritt-Leitfaden:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu starten.
  2. Füge ein neues Modul ein: Rechtsklick auf "VBAProject" > Einfügen > Modul.
  3. Kopiere den folgenden Code in das Modul:
Option Explicit

Private Declare PtrSafe Function GetDesktopWindow Lib "user32" () As LongPtr
Private Declare PtrSafe Function MessageBoxTimeoutA Lib "user32" ( _
    ByVal hwnd As LongPtr, _
    ByVal lpText As String, _
    ByVal lpCaption As String, _
    ByVal uType As Long, _
    ByVal wLanguageId As Integer, _
    ByVal dwMilliseconds As Long) As Long

Private Const MB_TIMEOUT As Long = &H7D00

Public Sub ShowPopup()
    Dim intReturn As Long
    intReturn = MessageBoxTimeoutA(GetDesktopWindow(), "Hallo", "TimeoutTest", vbYesNo Or vbInformation, 0, 5000) ' 5000 = 5 Sekunden

    Select Case CLng(intReturn)
        Case MB_TIMEOUT
            Debug.Print "TimeOut"
        Case vbOK, vbYes
            Debug.Print "Ok, Ja"
        Case vbAbort, vbCancel
            Debug.Print "Abbrechen"
        Case vbNo
            Debug.Print "Nein"
        Case vbRetry
            Debug.Print "Wiederholen"
        Case Else
            Debug.Print intReturn
    End Select
End Sub
  1. Schließe den VBA-Editor und führe den Code über F5 aus.

Häufige Fehler und Lösungen

  • Nachricht verschwindet nicht nach der angegebenen Zeit: Wenn die Popup-Nachricht nicht nach der eingestellten Zeit verschwindet, stelle sicher, dass die API korrekt deklariert ist. Überprüfe auch die Parameter in der MessageBoxTimeoutA-Funktion.

  • Fehlermeldung bei Verwendung in Word: Wenn Du die Popup-Nachricht in Word verwenden möchtest und die Fehlermeldung "Methode oder Datenobjekt nicht gefunden" auftritt, versuche 0 anstelle von Application.hWnd zu verwenden.


Alternative Methoden

Eine Alternative zur Verwendung von MessageBoxTimeoutA ist die CreateObject("WScript.Shell").Popup Methode. Beachte jedoch, dass dies in einigen Excel-Versionen möglicherweise nicht die gewünschte Funktionalität bietet.

Beispiel für die Verwendung:

Sub ShowWScriptPopup()
    CreateObject("WScript.Shell").Popup "Deine Nachricht", 5, "Titel", 64 ' 5 Sekunden anzeigen
End Sub

Praktische Beispiele

Hier sind einige praktische Beispiele für die Verwendung von Popup-Nachrichten in Excel:

  1. Einfache Bestätigungsnachricht:

    Sub ConfirmAction()
       Dim response As VbMsgBoxResult
       response = MsgBox("Möchtest Du fortfahren?", vbYesNo + vbQuestion, "Bestätigung")
       If response = vbYes Then
           ' Aktion durchführen
       End If
    End Sub
  2. Timeout für eine wichtige Nachricht: Verwende die oben beschriebenen API-Funktionen, um eine wichtige Nachricht mit einem Timeout anzuzeigen.


Tipps für Profis

  • Nutze die Debug.Print-Funktion, um Informationen über die Popup-Nachricht im Direktfenster auszugeben. Dies kann hilfreich sein, um sicherzustellen, dass die Logik korrekt funktioniert.
  • Experimentiere mit verschiedenen uType-Werten, um unterschiedliche Popup-Styles zu testen.

FAQ: Häufige Fragen

1. Wie kann ich den Text im Popup ändern? Du kannst den Text im MessageBoxTimeoutA-Aufruf ändern, indem Du den lpText Parameter anpasst.

2. Funktioniert der Code auch in anderen Office-Anwendungen? Ja, aber die Verwendung von Application.hWnd könnte in Word problematisch sein. Probiere stattdessen ThisDocument.Windows(1).Hwnd oder 0.

3. Gibt es Einschränkungen bei der Zeit, die ich einstellen kann? Ja, die maximale Zeit für das Timeout ist in der Regel auf 32767 Millisekunden (ca. 32 Sekunden) begrenzt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige