Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1284to1288
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
Inhaltsverzeichnis

Makro mit App.OnTime läuft nicht

Makro mit App.OnTime läuft nicht
01.11.2012 15:48:47
Albert
Hallo Fachleute,
ich habe folgendes Makro von Nepumuk zur Verfügung gestellt bekommen:
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 Const GC_CLASSNAME_EXPLORER = "CabinetWClass" 'ExploreWClass
'Private Const GC_CLASSNAME_FIREFOX = "MozillaUIWindowClass" 'Funktioniert nicht
Private Const GC_CLASSNAME_INTERNETEXPLORER = "IEFrame"
Private Function WindowCallBack(ByVal lngHwnd As Long, ByVal lngParam As Long) As Boolean
Dim strClassName As String * 256
Dim lngReturn As Long
lngReturn = GetClassName(lngHwnd, strClassName, 256)
Select Case Left$(strClassName, lngReturn)
Case GC_CLASSNAME_EXPLORER
MsgBox "Close Windows Explorer"
' Case GC_CLASSNAME_INTERNETEXPLORER
'     MsgBox "Internetexplorer schließen"
' Case GC_CLASSNAME_FIREFOX
'     MsgBox "Firefox ist geöffnet"
End Select
WindowCallBack = True
End Function
Public Sub OA1()
Call EnumWindows(AddressOf WindowCallBack, ByVal 0&)
End Sub
Ich möchte dieses nun zeitverzögert starten und benutze dafür folgende Anweisung:
Public Sub CD2()
Application.OnTime Now + TimeValue("00:00:30"), "OA1"
End Sub
Es tritt nun folgendes Problem auf: wenn ich OA1 direkt starte -> Funktion einwandfrei:
Wenn ich es jedoch über CD2 starte kommt folgende sinngemäße Fehlermeldung: "OA1 in dieser Arbeitsmappe nicht verfügbar oder alle Makros wurden deaktiviert"
Wer weiß Rat?
Albert

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro mit App.OnTime läuft nicht
01.11.2012 15:52:16
Hajo_Zi
Hallo Albert,
ich würde den Makros nicht gerade eine Zellbezeichnung als Name geben.

AW: Makro mit App.OnTime läuft nicht
01.11.2012 16:50:32
Albert
Hallo Hajo,
danke für die Info. Ich habe die Makros umgetauft in OAp1 und Count2, Ergebnis ist leider das Selbe - Makro läuft unter Count2 nicht.
Albert

AW: Makro mit App.OnTime läuft nicht
01.11.2012 17:16:15
Nepumuk
Hallo Albert,
die Prozedur welche du per OnTime-Methode aufrufst muss in ein Standardmodul.
Ich habe mir gerade mal Firefox auf einem virtuellen Rechner installiert und dabei festgestellt dass die den Klassennamen geändert haben. Der neue Name ist "MozillaWindowClass".
Gruß
Nepumuk

Anzeige
AW: Makro mit App.OnTime läuft nicht
01.11.2012 18:18:13
Albert
Hallo Nepumuk,
vielen Dank für Deine Geduld und Deinen Einsatz. Firefox wird nun als offene Anwendung erkannt, den Aufruf Deines Makros per OnTime schaffe ich jedoch nicht. Ich habe ein neues Modul eingefügt, und nur in dieses Modul das folgende Makro eingefügt.
Option Explicit
Sub Count2()
Application.OnTime Now + TimeValue("00:00:03"), "OAp1"
End Sub
OAp1 ist Dein Startmakro dass in einem anderen Modul liegt:
Sub OAp1()
Call EnumWindows(AddressOf WindowCallBack, ByVal 0&)
End Sub
Wenn ich OAP1 über "Worksheet_selectionChange" aufrufe funktioniert es auch. Es wäre nur gut, dass der Anwender Zeit hat den Windows Explorer zu schließen, bevor die Meldung erscheint - deshalb möchte ich das Makro zeitversetzt aufrufen.
Vielleicht hast Du auch hierfür eine Lösung.
Wie kann ich Klassennamen auslesen, für den Fall dass ich Deinen Code nochmals erweitern müsste?
Danke
Albert

Anzeige
AW: Makro mit App.OnTime läuft nicht
01.11.2012 18:43:46
Nepumuk
Hallo Albert,
der Prozedurname ist immer noch eine Zelladresse. Mit Call wie im Worksheet_SelectionChange-Event kannst du so eine Prozedur aufrufen, aber nicht mit OnTime (auch in einer OnAction-Eigenschaft oder per Run-Methode kannst du eine Prozedur mit dem Namen einer Zelle-Adresse nicht aufrufen).
Die Klassennamen aller sichtbaren Fenster bekommst du so:
Option Explicit

Private Declare Function EnumWindows Lib "user32.dll" ( _
    ByVal lpEnumFunc As Long, _
    ByVal lParam As Long) As Boolean
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 GetClassName Lib "user32.dll" Alias "GetClassNameA" ( _
    ByVal hwnd As Long, _
    ByVal lpClassName As String, _
    ByVal nMaxCount As Long) As Long
Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" ( _
    ByVal hwnd As Long, _
    ByVal nIndex As Long) As Long

Private Const GWL_STYLE = (-16)
Private Const WS_VISIBLE = &H10000000
Private Const WS_BORDER = &H800000

Private llngRow As Long

Public Sub Start()
    llngRow = 1
    Columns("A:C").ClearContents
    With Range("A1:C1")
        .Value = Array("Hwnd", "Klasse", "Caption")
        .Font.Bold = True
    End With
    Call EnumWindows(AddressOf WindowCallBack, ByVal 0&)
    Columns("A:C").AutoFit
    Tabelle1.Sort.SortFields.Clear
    Tabelle1.Sort.SortFields.Add Key:=Columns(2)
    With Tabelle1.Sort
        .SetRange Columns("A:C")
        .Header = xlYes
        .MatchCase = False
        .Apply
    End With
End Sub

Private Function WindowCallBack(ByVal pvlngHwnd As Long, ByVal pvlngParam As Long) As Long
    Dim strCaption As String, strClassName As String
    Dim lngReturn As Long, lngStyle As Long
    lngStyle = GetWindowLong(pvlngHwnd, GWL_STYLE)
    If Cbool(lngStyle And (WS_VISIBLE Or WS_BORDER)) Then
        strClassName = Space$(256)
        lngReturn = GetClassName(pvlngHwnd, strClassName, 256)
        lngReturn = GetWindowTextLength(pvlngHwnd)
        strCaption = Space$(lngReturn)
        Call GetWindowText(pvlngHwnd, strCaption, lngReturn + 1)
        llngRow = llngRow + 1
        Cells(llngRow, 1).Resize(1, 3) = Array(pvlngHwnd, Trim$(strClassName), strCaption)
    End If
    WindowCallBack = 1
End Function

Gruß
Nepumuk

Anzeige
Herzliches Dankeschön!!!
01.11.2012 19:27:40
Albert
Hallo Nepumuk,
vielen lieben Dank, ich habe mir noch nie angesehen, wie viele Spalten es in der neuen Excelversion gibt und deshalb einfach nicht bedacht, dass ich noch immer eine Zelladresse verwende.
Jetzt funktioniert dank Deiner Hilfe alles Bestens. Auch Danke für den Code zum Auslesen der Klassennamen.
LG
Albert

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige