Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
876to880
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
876to880
876to880
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

VBA - externe MsgBox mit SendKeys bestätigen

VBA - externe MsgBox mit SendKeys bestätigen
14.06.2007 17:22:29
Nora
Hallo Excel-Experten,
ich bin Anfänger in der Programmierung mit VBA.
VBA nutze ich nur zeitweise um kleine Schleifen in meine Excel-Berechnungen einzubauen.
Zum Problem:
Ich arbeite bei meiner Berechnung mit einer Stoffwert-Bibliothek, die als Addin in Excel eingebunden ist. Bei der Berechnung erscheinen immer wieder MsgBoxen, die manuell weggedrückt werden müssen. Bei einer Komplexen Berechnung nimmt das wahnsinnig viel Zeit Anspruch. Problem ist dabei, dass ich diese Meldungen nicht in der Routine des Addins ausschalten kann. Der Code steht mir nicht zur Verfügung.
Ich suche also nach einer Methode, der Art:
- Wenn MsgBox erscheint, dann SendKeys "{ENTER}"
- als eigene Routine, da Meldungen sehr oft auftreten
im Forum habe ich auch schon einige Beiträge ähnlicher Art gefunden, nur waren die MsgBoxen selbsterzeugt, wurden also in der vom Benutzer erstellten Routine aufgerufen.
Ich hoffe meine Frage ist verständlich formuliert. Würde mich freuen, wenn Ihr eine Lösung dazu habt, da mich das noch in den Wahnsinn treibt.
Vielen Dank schon mal im Voraus.
Viele Grüße
Nora

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA - externe MsgBox mit SendKeys bestätigen
14.06.2007 17:33:00
Chris
Servus Nora,
keine Ahnung, ob das funktioniert für externe MsgBoxen (also intern geht es nicht), aber vielleicht geht es ja mit
Application.DisplayAlerts = False
also z.B.:

Private Sub Worksheet_Activate()
Application.DisplayAlerts = False
End Sub


Gruß
Chris

AW: VBA - externe MsgBox mit SendKeys bestätigen
14.06.2007 20:27:34
Nora
Hallo Chris,
das hätte ich noch dazuschreiben sollen: die Funktion DisplayAlerts habe ich schon versucht, das klappt leider nicht.
Trotzdem danke
Nora

AW: VBA - externe MsgBox mit SendKeys bestätigen
15.06.2007 10:24:00
Nepumuk
Hallo Nora,
so geht das nicht. Denn wenn eine Msgbox aufgerufen wird, kann eigentlich kein anderes Makro mehr laufen. Es gibt aber eine Möglichkeit per API. Dazu muss eine Routine an eine DLL übergeben werden die über einen Timer aufgerufen wird. Diese sucht nach der Msgbox. Wenn sie eine gefunden hat, dann wird diese geschlossen. Damit aber nich jede Box geschlossen wird (es könnte ja noch ein anderes Programm eine aufrufen, benötige ich ein unverwechselbares Merkmal. Was steht z.B. in der Titelleiste der Box?
Gruß
Nepumuk
P.S. Ich habe aber erst morgen wieder Zeit.

Anzeige
AW: VBA - externe MsgBox mit SendKeys bestätigen
15.06.2007 10:30:22
Nora
Hallo Nepumuk,
das klingt schon mal vielversprechend. Etwas markantes in der Titelleiste der MsgBox gibt es schon "Fehler Nr. x" wobei für x verschiedene Zahlen auftreten. Wenn also der Anfang "Fehler Nr" schon genügen würde, wäre das gut.
Ich danke Dir für Deine Antwort und hoffe Du kannst mir helfen.
Viele Grüße
Nora

AW: VBA - externe MsgBox mit SendKeys bestätigen
15.06.2007 10:40:16
Nepumuk
Hallo Nora,
ja, das reicht. Aber jetzt muss ich auf eine Vorstandssitzung und nachmittags fahre ich zurück nach Berlin. Also bis morgen.
Gruß
Nepumuk

AW: VBA - externe MsgBox mit SendKeys bestätigen
15.06.2007 16:43:13
Nepumuk
Hallo Nora,
kommst du damit zurecht?
' **********************************************************************
' Modul: DieseArbeitsmappe Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call prcTimerStop
End Sub

Private Sub Workbook_Open()
    Call prcTimerStart
End Sub

' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Private Declare Function EnumWindows Lib "user32.dll" ( _
    ByVal lpEnumFunc As Long, _
    ByVal lParam As Long) As Boolean
Private Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" ( _
    ByVal hwnd As Long, _
    ByVal lpClassName As String, _
    ByVal nMaxCount As Long) As Long
Private Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" ( _
    ByVal hwnd As Long, _
    ByVal lpString As String, _
    ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32.dll" Alias "GetWindowTextLengthA" ( _
    ByVal hwnd As Long) As Long
Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" ( _
    ByVal hwnd As Long, _
    ByVal wIndx As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
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 PostMessage Lib "user32.dll" Alias "PostMessageA" ( _
    ByVal hwnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    ByRef lParam As Any) As Long

Private Const GC_CLASSNAMEMSEXCEL = "XLMAIN"
Private Const GC_CLASSNAMEMSDIALOGS = "#32770"

Private Const GWL_STYLE = -&H10

Private Const WS_VISIBLE = &H10000000
Private Const WS_BORDER = &H800000

Private Const WM_CLOSE = &H10

Private llngxlhWnd As Long

Public Sub prcTimerStart()
    llngxlhWnd = FindWindow(GC_CLASSNAMEMSEXCEL, Application.Caption)
    SetTimer llngxlhWnd, 0&, 500&, AddressOf prcTimer
End Sub

Public Sub prcTimerStop()
    KillTimer llngxlhWnd, 0&
End Sub

Private Sub prcTimer(ByVal hwnd As Long, ByVal nIDEvent As Long, _
        ByVal uElapse As Long, ByVal lpTimerFunc As Long)

    EnumWindows AddressOf fncWindows, ByVal 0&
End Sub

Private Function fncWindows(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
    Dim strCaption As String, strClassname As String
    Dim lngStyle As Long, lngReturn As Long
    strClassname = String$(255, "0")
    lngReturn = GetClassName(hwnd, strClassname, 255&)
    strClassname = Left$(strClassname, InStr(1, strClassname, Chr(0)) - 1)
    If strClassname = GC_CLASSNAMEMSDIALOGS Then
        lngStyle = GetWindowLong(hwnd, GWL_STYLE) And (WS_VISIBLE Or WS_BORDER)
        lngReturn = GetWindowTextLength(hwnd)
        If lngStyle = (WS_VISIBLE Or WS_BORDER) And lngReturn <> 0 Then
            strCaption = Space(lngReturn)
            GetWindowText hwnd, strCaption, lngReturn + 1
            If Left$(strCaption, 10) = "Fehler Nr." Then PostMessage hwnd, WM_CLOSE, 0&, 0&
        End If
    End If
    fncWindows = True
End Function

Das Programm läuft parallel zu deinem und schließt jede Msgbox mit dieser Caption.
Gruß
Nepumuk

Anzeige
AW: VBA - externe MsgBox mit SendKeys bestätigen
15.06.2007 22:26:14
Nora
Hallo Nepumuk,
klasse, dass Du Dich sogar heute noch darum gekümmert hast. Hab nun erst einmal versucht den Code in ein Modul bzw. den ersten Teil in die Arbeitsmappe reinzukopieren. Leider werden mir Syntaxfehler bei den
Private Declare Function für
GetClassName: stoppt bei lpClassName (Erwartet Listentrennzeichen)
FindWindow: stoppt bei lpWindowName (Erwartet Listentrennzeichen)
SetTimer: stoppt bei uElapse (Erwartet Listentrennzeichen)
KillTimer: stoppt bei hwnd (Erwartet Listentrennzeichen)
Sub prcTimer
stoppt bei uElapse (Erwartet Listentrennzeichen)
Dim strCaption as String (Erwartet Anweisungsende)
Dim lngStyle as Long (Erwartet Anweisungsende)
If strClassname = ... Then (Erwartet Anweisungsende)
If lngStyle = ... Then (Erwartet Anweisungsende)
If Left$(strCaption,10)... then Postmessage (hwnd...) (Erwartet Anweisungsende)
Bei den drei If-Anweisungen gibt es nur zwei schließende End If. Ist das richtig so?
Woher kommen die Syntax-Fehler? Kann es daran liegen, dass ich zu Hause Excel 2002 nutze?
Viele Grüße
Nora

Anzeige
Korrektur
15.06.2007 22:39:50
Nora
Habe durch einfaches Neu-Eingeben von Leerzeichen die Syntaxfehler beseitigen können.
Probiere gerade das Programm durch laufen zu lassen. Wollte zunächst die Arbeitsmappe schließen, da ja erst bei Neustart Dein Programm aktiviert wird, wenn ich das richtig verstehe.
Da kommt aber ein Hinweis "Function oder Variable erwartet" bei Call prcTimerStop
Habe leider keine Ahnung was das bedeuten soll
Grüße
Nora

AW: Korrektur
16.06.2007 07:48:00
Nepumuk
Hallo Nora,
kann ich nicht nachvollziehen, irgendwas ist beim kopieren des Codes schief gelaufen. Ich habe ihn jetzt mal selbst aus dem Beitrag in eine neue Mappe kopiert. Null Problemo. An deiner Excelversion kann das aber nicht liegen. Kopier das ganz einfach nochmal, aber in aller Ruhe. Du muss wegen mir nicht nervös werden :-)
Gruß
Nepumuk

Anzeige
AW: VBA - externe MsgBox mit SendKeys bestätigen
14.06.2007 17:41:00
Tino
Hallo,
versuche es mal mit dieser Funktion.

Function fensterabfrage(FensterName As String) As Boolean
On Error GoTo Fehler
AppActivate FensterName
fensterabfrage = True
Fehler:
fensterabfrage = False
End Function



Sub versuch()
If fensterabfrage(Fenstername) = True Then
'Application.SendKeys Anweisung
End If
End Sub


gruss
tino

hat noch was gefeht, sorry
14.06.2007 17:44:00
Tino
Hallo,
habe in der

Function noch etwas vergessen!


Function fensterabfrage(FensterName As String) As Boolean
On Error GoTo Fehler
AppActivate FensterName
fensterabfrage = True
Exit Function
Fehler:
fensterabfrage = False
End Function



Sub versuch()
If fensterabfrage = True Then
'Application.SendKeys Anweisung
End If
End Sub


Gruss
Tino

Anzeige
AW: hat noch was gefeht, sorry
14.06.2007 20:30:00
Nora
Hallo Tino,
ich danke Dir für Deine Mühe. Ich werde den Code nachher mal austesten, und werde berichten ob er mir hilft. Bis dahin
Nora

AW: hat noch was gefeht, sorry
15.06.2007 09:43:54
Nora
Hallo Tino,
habe Deinen Code getestet. Leider bekomme ich ihn noch nicht zum laufen, da wenn ich den Funktionsaufruf in meine Prozedur einfüge die Fehlermeldung "Argument nicht optional" erscheint. Ich poste mal meinen Code:

Public Function fensterabfrage (FensterName as String) As Boolean
FensterName = "Fehler"
On Error GoTo Fehler
AppActivate FensterName
fensterabfrage = True
Exit Function
Fehler:
fensterabfrage =False
End Function


-----


Public Sub MeineProzedur
If fensterabfrage = True Then
SendKeys ("ENTER")
End If


Ist meine Interpretation von FensterName richtig? Oder verursacht das den Fehler? Weiß auch den
Titel des Fensters nicht genau (im Titel steht "Fehler Nr. 1", aber ob das auch der Name der Anwendung ist auf die AppActivate zugreifen soll, weiß ich nicht)
Grüße
Nora

Anzeige
AW: hat noch was gefeht, sorry
15.06.2007 17:34:00
Tino
Hallo,
du musst in der Sub bei
If fensterabfrage = True
noch einen Namen mitgeben!
Bsp.
If fensterabfrage("NameFensterTitel") = True
Gruss
Tino

311 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige