Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Excel-Datei nicht im Projekt-Explorer


Betrifft: Excel-Datei nicht im Projekt-Explorer von: Andreas K
Geschrieben am: 26.09.2019 15:40:55

Hallo zusammen,

ich bin VBA-Neuling und versuche mich gerade an einer Programmierung. Ich versuche per VBA einen Prozess im SAP abzuarbeiten.
Bei der Abarbeitung des Projektcodes werden durch das SAP 2 Excel-Dateien gespeichert und relativ kurzfristig geöffnet (ca. 3-5 Sek. nach dem Speichern).
Ich hätte erwartet, dass die Dateien dann im Projekt-Explorer zu sehen sind, die ich dann ansprechen kann. Selbst nachdem der Code vollständig durchlaufen ist, sind die Dateien, obwohl geöffnet, nicht im Projekt-Explorer zu sehen.
Schließe ich die Datei und öffne diese, ist diese im Projekt-Explorer zu sehen. Welche Möglichkeiten habe ich nun, einerseits die Dateien zu schließen, aber auch andererseits eine Datei anzusprechen, damit der Inhalt in eine andere Auswertung kopiert werden kann?
Ich bedanke mich im Voraus und wünsche einen schönen Tag :)

Gruß
Andi

  

Betrifft: Was ist der Projekt-Explorer ? (owT) von: EtoPHG
Geschrieben am: 26.09.2019 15:46:35




  

Betrifft: AW: Was ist der Projekt-Explorer ? (owT) von: Andreas K
Geschrieben am: 26.09.2019 15:52:20

hier, das meine ich, heißt das nicht so?

Ich habe das Problem, dass, weil die Datei da nicht aufgeführt wird, aber bereits offen ist, kann ich diese ja nicht aktivieren oder ansprechen... oder?


  

Betrifft: Doch das heisst schon so, von: EtoPHG
Geschrieben am: 26.09.2019 17:42:56

Andreas,

Aber ich hab das nicht erwartet. Ich kenne deine SAP-Code nicht, nimmt aber an, dass dieser in einer anderen Excelinstanz abgearbeitet wird, wie die Instanz, in der deine Arbeitsmappe geöffnet ist. Oder ich müsste deinen 'SAP-Code' mal sehen. Du siehst im Projekt-Explorer nur Arbeitsmappen (neben ev. Add-Ins), die du entweder manuell oder über VBA Code programmatisch geöffnet hast.

Allerdings ist mir dein Anliegen noch unklar. Vielleicht kannst du genauere Details zu deinen Vorstellungen/Anforderungen liefern?

Gruess Hansueli


  

Betrifft: AW: Doch das heisst schon so, von: Andreas K
Geschrieben am: 26.09.2019 19:07:36

Es soll aus SAP eine Datei als Tabellenkalkulation gespeichert werden. Nachdem SAP eine Datei speichert, wird diese mit einem Versatz von wenigen Sekunden auch automatisch geöffnet. Ich möchte nun, dass erst abgewartet wird, bis die Datei geöffnet ist, damit diese wieder geschlossen werden kann (bei einer anderen Datei werde ich warten müssen, bis die Datei geöffnet wurde, anschließend soll der Inhalt einer Spalte kopiert und woanders eingefügt werden, anschließend Datei wieder schließen). Ich komme nicht mehr weiter - so nervig!
Ich befürchte, weil die 2 Dateien aus SAP gespeichert und geöffnet werden, erkennt der Projekt Explorer beide Dateien nicht. Ich kann diese dann auch nicht ansprechen?!

Hier der Code, inkl. Zeilen vom SAP-Recorder sowie auch einige Versuche von mir, die aber _ irgendwie nicht klappten... :( objSess.findById("wnd[1]/usr/ctxtDY_PATH").Text = "J:\Test\Test" objSess.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = "Input_Query_Masse1.xlsx" objSess.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 18 objSess.findById("wnd[1]/tbar[0]/btn[11]").press geladen = False Do For Each wb In Workbooks If wb.Name = "Input_Query_Masse1.xlsx" Then geladen = True Next wb Loop Until geladen = True End

Function 
Sub DateiSchließen_ohne_speichern() ' Datei schließen Workbooks("Input_Query_Masse1.xlsx"). _
Close SaveChanges:=False End 
Sub 
Function ProcessRow1(iRow) Dim lineitems As Long Dim W_Tagesdatum Dim W_QuellID ' Workbooks(„ _
Input_Query_Masse1.xlsx“).Close ' Set objWorkbook1 = Workbooks(Input_Query_Masse1.XLSX) ' Call objWorkbook1.Close ' Set objWorkbook1 = Workbooks(Input_Query_Masse1.XLSX) 'Open("J:\Kundenservice\Verbrauchsabrechnung\Abrechnung\MOS Billing\Durchführung MOSB\Input_Query_Masse1.XLSX") ' Call objWorkbook1.RefreshAll ' Call objWorkbook1.Close(SaveChanges:=True) ' Set objWorkbook1 = Nothing



  

Betrifft: Nachrichten/Anfragen/Vorschau Struktur.... von: EtoPHG
Geschrieben am: 27.09.2019 08:12:30

Hallo Andreas,

Zu deinem neuem Beitrag:
Ich kann deinem Kauderwelsch nicht folgen.
Versuche doch dein Informationen besser zu strukturieren. Die Forumssoftware stellt dafür, wenn auch einfache, so doch genügend, Mittel zur Verfügung. Zudem gibt es den [Vorschau] Button, mit dem die Lesbarkeit und Struktur nochmals überprüft werden kann, bevor der Beitrag definitiv im Forum landet. Ich frage mich öfter, warum das nicht benutzt wird.

Zum Problem:

  • Nepumuk hat Dir unten einen Code zum Ausfindigmachen der XL-Instanz gepostet.

  • Ein weiterer Ansatz: Wenn Dir die abgelegten Dateinamen, bzw. Verzeichnisse zur bekannt sind, kann ggf. Code aufgebaut werden, der mit diesen Informationen letztere weiterverarbeitet.


  • Gruess Hansueli


      

    Betrifft: AW: Nachrichten/Anfragen/Vorschau Struktur.... von: Andreas K
    Geschrieben am: 27.09.2019 08:54:54

    Guten Morgen,

    ja, tut mir leid. Das ist absolut unübersichtlich! Sorry! Ich hatte das gestern Abend am Handy gemacht, ging ja voll daneben :(

    Obwohl der u.s. Code für einen VBA Erfahrenen wohl ein komplett chaotischen Aufbau hat, scheint er fast zu funktionieren. Das einzige Problem, das ich habe, ist "lediglich", dass die zwei Dateien, die über SAP erstellt werden (Input_Query_Masse1.xlsx und Kontrolle1.xlsx) nicht im Projekt-Explorer erkannt werden und daher auch nicht geschlossen werden... muss ich diese irgendwie vorher "aktivieren"?!

    Also den Code von Nepumuk hatte ich irgendwie total übersehen! Sorry... Bedeutet das, ich baue diesen ein und mein letzter Befehl, alle Dateien bis auf die mit dem Makro zu schließen, wird für alle Excel-Dateien durchgeführt? Das scheint ein richtig dicker Befehl zu sein ;)


    Also hier der gesamte Code:

    Option Explicit
    Public SapGuiAuto, WScript, msgcol
    Public objGui As GuiApplication
    Public objConn As GuiConnection
    Public objSess As GuiSession
    Public objSBar As GuiStatusbar
    Public objSheet As Worksheet
    Public objSheet1 As Worksheet
    Public objSheet2 As Worksheet
    Public wb As Workbook
    Public geladen As Boolean
    Dim W_System
    Dim iCtr As Integer
    Dim objWorkbook As Workbook
    Dim objWorkbook1 As Workbook
    Dim objWorkbook2 As Workbook
    Dim objWorkbook3 As Workbook
    ' Dim liWs As Integer
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


    Function Attach_Session(iRow, Optional mysystem As String) As Boolean
    Dim il, it
    Dim W_conn, W_Sess

    ' Entsprechendes System prüfen
    ' Zelle A4 (XXX System, YYY Mandant)
    If mysystem = "" Then
    W_System = ActiveSheet.Cells(iRow, 1)
    Else
    W_System = mysystem
    End If

    ' Wenn bereits Module vorhanden, beende aktuelle Funktion
    If W_System = "" Then
    Attach_Session = False
    Exit Function
    End If

    ' Wenn die Session Objekt ist nicht leer, nehme die aktive Session (gehe von der richtigen Session aus)
    If Not objSess Is Nothing Then
    If objSess.Info.SystemName & objSess.Info.Client = W_System Then
    Attach_Session = True
    Exit Function
    End If
    End If

    ' Wenn keine Verbinbdung, setze Objekte
    If objGui Is Nothing Then
    Set SapGuiAuto = GetObject("SAPGUI")
    Set objGui = SapGuiAuto.GetScriptingEngine
    End If

    ' Schaue alle SAP Module durch und prüfe, welches System ist das gleiche mit der korrekten Transaktion
    For il = 0 To objGui.Children.Count - 1
    Set W_conn = objGui.Children(il + 0)
    For it = 0 To W_conn.Children.Count - 1
    Set W_Sess = W_conn.Children(it + 0)
    If W_Sess.Info.SystemName & W_Sess.Info.Client = W_System Then
    Set objConn = objGui.Children(il + 0)
    Set objSess = objConn.Children(it + 0)
    Exit For
    End If
    Next
    Next

    ' Wurde nichts gefunden, kommt die Fehlermeldung
    If objSess Is Nothing Then
    MsgBox "richtiges System? " + W_System + " mit Transaktion ", vbCritical + vbOKOnly
    Attach_Session = False
    Exit Function
    End If

    ' Schalte Script ein
    If IsObject(WScript) Then
    WScript.ConnectObject objSess, "on"
    WScript.ConnectObject objGui, "on"
    End If

    ' Maximiere die Session
    Set objSBar = objSess.findById("wnd[0]/sbar")
    objSess.findById("wnd[0]").Maximize
    Attach_Session = True


    End Function


    Public Sub StartProcessing()
    
    Dim W_Obj1, W_Obj2, W_Obj3, W_Obj4, iRow
    Dim W_Func
    Dim W_Src_Ord
    Dim W_Ret As Boolean
    
    ' Mit System verbunden? Zelle A4
    W_Ret = Attach_Session(4)
    If Not W_Ret Then
        MsgBox "Nicht mit System verbunden"
        GoTo MyEnd
    End If
    
    ' Rufe Funktion ProcessRow auf
            Call Massenanforderung
            Call Query1
            Call Massenabrechnung
            Call Sleep1
            Call AlleSchliessen
                
    MyEnd:
    ' Setze alles zurück, Speicher freisetzen
        Set objSess = Nothing
        Set objGui = Nothing
        Set SapGuiAuto = Nothing
        
        MsgBox "Script erledigt", vbInformation + vbOKOnly
           
    End Sub
    Function Massenanforderung()
    Set objSheet = ThisWorkbook.Worksheets("Script")

    ' Setzt den Status-Text auf "führt aus..."
    objSheet.Cells(9, 4) = "führt aus..."

    ' SAP Script hier
    objSess.findById("wnd[0]").Maximize
    objSess.findById("wnd[0]/tbar[0]/okcd").Text = "/nFKKBIXBIP_M"
    objSess.findById("wnd[0]").sendVKey 0
    objSess.findById("wnd[0]/usr/cmbPROBCL").Key = "4"
    objSess.findById("wnd[0]/usr/cmbPROBCL").SetFocus
    objSess.findById("wnd[0]/tbar[1]/btn[8]").press
    objSess.findById("wnd[1]/tbar[0]/btn[0]").press

    ' SAP Meldung wird ausgegeben in Spalte 5 (iRow, 5)
    objSheet.Cells(9, 5) = objSBar.Text

    ' Setzt den Status auf erledigt
    objSheet.Cells(9, 4) = "erledigt"

    End Function
    Function Query1()
    Dim W_Tagesdatum
    Dim W_QuellID
    Set objSheet1 = ThisWorkbook.Worksheets("Hilfstabelle")

    ' Setzt den Status-Text auf "führt aus..."
    objSheet.Cells(11, 4) = "führt aus..."

    ' Abrechnungssperrgrund
    W_Tagesdatum = objSheet.Cells(1, 5)

    ' SAP Script hier
    objSess.findById("wnd[0]").Maximize
    objSess.findById("wnd[0]/tbar[0]/okcd").Text = "/nsa38"
    objSess.findById("wnd[0]").sendVKey 0
    objSess.findById("wnd[0]/usr/ctxtRS38M-PROGRAMM").Text = "AQP0SYSTQV000025MOSB_MASSE1==="
    objSess.findById("wnd[0]/usr/ctxtRS38M-PROGRAMM").caretPosition = 31
    objSess.findById("wnd[0]/tbar[1]/btn[18]").press
    objSess.findById("wnd[1]").sendVKey 4
    objSess.findById("wnd[2]/usr/cntlALV_CONTAINER_1/shellcont/shell").SelectedRows = "0"
    objSess.findById("wnd[2]/usr/cntlALV_CONTAINER_1/shellcont/shell").DoubleClickCurrentCell
    objSess.findById("wnd[1]/tbar[0]/btn[0]").press
    objSess.findById("wnd[0]/tbar[1]/btn[8]").press
    objSess.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").PressToolbarContextButton "&MB_EXPORT"
    objSess.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").SelectContextMenuItem "&XXL"
    objSess.findById("wnd[1]/usr/ctxtDY_PATH").Text = "J:\Durchführung"
    objSess.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = "Input_Query_Masse1.xlsx"
    objSess.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 18
    objSess.findById("wnd[1]/tbar[0]/btn[11]").press

    ' SAP Meldung wird ausgegeben in Spalte 5 (iRow, 5)
    objSheet.Cells(11, 5) = objSBar.Text

    ' Setzt den Status auf erledigt
    objSheet.Cells(11, 4) = "erledigt"

    ' Zuerst Hilfstabelle Inhalt löschen
    objSheet1.Range("A1:D999999").ClearContents

    ' Datei "Output" öffnen und aktualisieren
    Set objWorkbook = Workbooks.Open("J:\Durchführung\Output.xlsx")
    Call objWorkbook.RefreshAll
    Set objWorkbook = Nothing

    ' Kopieren Quellvorgangs-ID aus Output
    Sheets("Gesamt ohne Fehler").Range("C2:C999999").Copy

    ' Einfügen in Zieldatei
    objSheet1.Range("A1:A999999").PasteSpecial

    ' Quellvorgangs-ID
    W_QuellID = objSheet1.Range("A1:A999999")


    End Function

    Function Massenabrechnung()
    Dim W_Tagesdatum
    Dim W_QuellID
    Set objSheet = ThisWorkbook.Worksheets("Script")
    Set objSheet1 = ThisWorkbook.Worksheets("Hilfstabelle")

    ' Setzt den Status-Text auf "führt aus..."
    objSheet.Cells(12, 4) = "führt aus..."

    ' Abrechnungssperrgrund
    W_Tagesdatum = objSheet.Cells(1, 5)

    ' SAP Script hier
    objSess.findById("wnd[0]").Maximize
    objSess.findById("wnd[0]/tbar[0]/okcd").Text = "/nFKKBIX_M"
    objSess.findById("wnd[0]").sendVKey 0
    objSess.findById("wnd[0]/tbar[1]/btn[17]").press
    objSess.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").SelectedRows = "0"
    objSess.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").DoubleClickCurrentCell
    objSess.findById("wnd[0]/usr/ctxtP_BILLDT").Text = W_Tagesdatum
    objSess.findById("wnd[0]/usr/ctxtP_BILLDT").SetFocus
    objSess.findById("wnd[0]/usr/ctxtP_BILLDT").caretPosition = 10
    objSess.findById("wnd[0]").sendVKey 0
    objSess.findById("wnd[0]/tbar[1]/btn[6]").press
    objSess.findById("wnd[1]/usr/ssub%_SUBSCREEN_FREESEL:SAPLSSEL:1105/btn%_%%DYN001_%_APP_%-VALU_PUSH").press
    objSess.findById("wnd[2]/tbar[0]/btn[16]").press
    objSess.findById("wnd[2]/tbar[0]/btn[24]").press
    objSess.findById("wnd[2]/tbar[0]/btn[8]").press
    objSess.findById("wnd[1]/tbar[0]/btn[11]").press
    objSess.findById("wnd[0]/tbar[1]/btn[8]").press
    objSess.findById("wnd[1]/tbar[0]/btn[0]").press

    ' SAP Meldung wird ausgegeben in Spalte 5 (iRow, 5)
    objSheet.Cells(12, 5) = objSBar.Text

    ' Setzt den Status auf erledigt
    objSheet.Cells(12, 4) = "erledigt"

    ' Setzt den Status-Text auf "führt aus..."
    objSheet.Cells(13, 4) = "führt aus..."

    ' SAP Script hier
    objSess.findById("wnd[0]").Maximize
    objSess.findById("wnd[0]/tbar[0]/okcd").Text = "/nFKKBIXBIT_MON"
    objSess.findById("wnd[0]").sendVKey 0
    objSess.findById("wnd[0]/tbar[1]/btn[17]").press
    objSess.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").SelectedRows = "0"
    objSess.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").DoubleClickCurrentCell
    objSess.findById("wnd[0]/usr/ctxtBITCRDAT-HIGH").Text = W_Tagesdatum
    objSess.findById("wnd[0]/usr/ctxtBITCRDAT-HIGH").SetFocus
    objSess.findById("wnd[0]/usr/ctxtBITCRDAT-HIGH").caretPosition = 10
    objSess.findById("wnd[0]").sendVKey 0
    objSess.findById("wnd[0]/tbar[1]/btn[8]").press
    objSess.findById("wnd[0]/usr/cntlMON_CONTROL/shellcont/shell").PressToolbarButton "&MB_VARIANT"
    objSess.findById("wnd[1]/usr/cntlGRID/shellcont/shell").CurrentCellRow = 0
    objSess.findById("wnd[1]/usr/cntlGRID/shellcont/shell").SelectedRows = "0"
    objSess.findById("wnd[1]/usr/cntlGRID/shellcont/shell").ClickCurrentCell
    objSess.findById("wnd[0]/usr/cntlMON_CONTROL/shellcont/shell").PressToolbarContextButton "&MB_EXPORT"
    objSess.findById("wnd[0]/usr/cntlMON_CONTROL/shellcont/shell").SelectContextMenuItem "&XXL"
    objSess.findById("wnd[1]/usr/ctxtDY_PATH").Text = "J:\Durchführung"
    objSess.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = "Kontrolle1.xlsx"
    objSess.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 14
    objSess.findById("wnd[1]/tbar[0]/btn[11]").press

    ' SAP Meldung wird ausgegeben in Spalte 5 (iRow, 5)
    objSheet.Cells(13, 5) = objSBar.Text

    ' Setzt den Status auf erledigt
    objSheet.Cells(13, 4) = "erledigt"

    ' Datei "Kontrolle" öffnen und löschen
    Set objWorkbook2 = Workbooks.Open("J:\Durchführung\Kontrolle.xlsx")
    Set objSheet2 = objWorkbook2.Worksheets("Tabelle1")
    ' Set objWorkbook2 = Nothing
    objSheet2.Range("A2:C999999").ClearContents

    ' Kopieren Abrechnungsbelege
    ' Sheets("Gesamt ohne Fehler").Range("C2:C999999").Copy
    ' Workbooks(„Kontrolle1.xlsx“).Range(A2:A999999")

    ' Einfügen in Zieldatei
    ' objSheet1.Range("A1:A999999").PasteSpecial

    ' Quellvorgangs-ID
    ' W_QuellID = objSheet1.Range("A1:A999999")
    End Function
    Function Sleep1()
    Call Sleep(10000)
    End Function
    Function AlleSchliessen()
    Dim Wkb As Workbook
    For Each Wkb In Workbooks
    If Wkb.Name <> ThisWorkbook.Name And Wkb.Name <> "MOSB Automatismus.xlsm" Then
    Wkb.Close SaveChanges:=True
    End If
    Next Wkb

    End Function


      

    Betrifft: AW: Was ist der Projekt-Explorer ? (owT) von: Nepumuk
    Geschrieben am: 26.09.2019 17:49:08

    Hallo Andreas,

    SAP öffnet die Datei in einer eigenen Application. Schau mal in den Taskmanager da findest du zwei Excel-Prozesse. Der Zugriff auf diese Application ist möglich, aber nicht ohne.

    Option Explicit

    Private Declare Function GetClassNameA Lib "user32.dll" ( _
        ByVal hwnd As Long, _
        ByVal lpClassName As String, _
        ByVal nMaxCount As Long) As Long
    Private Declare Function EnumWindows Lib "user32.dll" ( _
        ByVal lpEnumFunc As Long, _
        ByVal lParam As Long) As Boolean
    Private Declare Function EnumChildWindows Lib "user32.dll" ( _
        ByVal hWndParent As Long, _
        ByVal lpEnumFunc As Long, _
        ByVal lParam As Long) As Long
    Private Declare Sub IIDFromString Lib "ole32.dll" ( _
        ByVal lpsz As String, _
        ByRef lpiid As GUID)
    Private Declare Sub AccessibleObjectFromWindow Lib "oleacc.dll" ( _
        ByVal hwnd As Long, _
        ByVal dwId As Long, _
        ByRef riid As GUID, _
        ByRef ppvObject As Any)

    Private Type GUID
        Data1 As Long
        Data2 As Integer
        Data3 As Integer
        Data4(0 To 7) As Byte
    End Type

    Private Const GC_CLASSNAMEEXCEL = "XLMAIN"
    Private Const GC_CLASSNAMEEXCEL7 = "EXCEL7"
    Private Const IID_EXCELWINDOW = "{00020893-0000-0000-C000-000000000046}"
    Private Const OBJID_NATIVEOM = &HFFFFFFF0

    Private lalngChildHwnd() As Long, lialngChildCount As Long
    Private lalngMainHwnd() As Long, lialngMainCount As Long

    Private Function GetApplications() As Application()
        
        Dim ialngIndex As Long, ialngCount As Long
        Dim udtGuid As GUID
        Dim objWindow As Window
        Dim aobjTempApplications() As Application
        
        'Alle lokalen Variablen zuruecksetzen
        Erase lalngChildHwnd
        lialngChildCount = 0
        Erase lalngMainHwnd
        lialngMainCount = 0
        
        'Konvertiere die IID des Excel-Window-Objektes in die GUID-Struktur
        Call IIDFromString(StrConv(IID_EXCELWINDOW, vbUnicode), udtGuid)
        
        'Callback Aufruf um alle Fenster zu klassifizieren
        Call EnumWindows(AddressOf EnumWindowsProc, ByVal 0&)
        
        'Schleife ueber alle gefundenen Parent-Excelfenster
        For ialngIndex = LBound(lalngMainHwnd) To UBound(lalngMainHwnd)
            
            'Callback Aufruf um alle Child-Fenster der
            'entsprechenden Parent-Fenster zu durchlaufen
            Call EnumChildWindows(lalngMainHwnd(ialngIndex), _
                AddressOf EnumChildWindowsProc, ByVal 0&)
            
        Next
        
        'Schleife ueber die jeweils ersten gefundenen Window-Fenster
        For ialngIndex = LBound(lalngChildHwnd) To UBound(lalngChildHwnd)
            
            'Hole ueber die Zugriffsnummer das entsprechende Window-Objekt
            Call AccessibleObjectFromWindow(lalngChildHwnd(ialngIndex), _
                OBJID_NATIVEOM, udtGuid, objWindow)
            
            'Wenn das Objekt gefunden wurde setze einen Verweis
            'auf dessen Application-Objekt in das Array
            If Not objWindow Is Nothing Then
                
                Redim Preserve aobjTempApplications(ialngCount)
                Set aobjTempApplications(ialngCount) = objWindow.Application
                ialngCount = ialngCount + 1
                
            End If
        Next
        
        'Array an die Funktionsvariable uebergeben
        GetApplications = aobjTempApplications
        
    End Function

    Private Function EnumWindowsProc( _
            ByVal pvlngHwnd As Long, _
            ByVal pvlnglParam As Long) As Long

        
        'Callback Funktion um alle Fenster zu durchlaufen
        
        'Wenn ein Excelfenster gefunden wurde schreibe dessen Handle in das Array
        If ClassName(pvlngHwnd) = GC_CLASSNAMEEXCEL Then
            
            Redim Preserve lalngMainHwnd(lialngMainCount)
            lalngMainHwnd(lialngMainCount) = pvlngHwnd
            lialngMainCount = lialngMainCount + 1
            
        End If
        
        EnumWindowsProc = 1
        
    End Function

    Private Function EnumChildWindowsProc( _
            ByVal pvlngHwnd As Long, _
            ByVal pvlnglParam As Long) As Long

        
        'Callback Funktion um alle Child-Fenster zu durchlaufen
        
        'Wenn ein Window-Fenster im Excel-Fenster gefunden wurde schreibe
        'dessen Handle in das Array und verlasse die Callback-Prozedur
        If ClassName(pvlngHwnd) = GC_CLASSNAMEEXCEL7 Then
            
            Redim Preserve lalngChildHwnd(lialngChildCount)
            lalngChildHwnd(lialngChildCount) = pvlngHwnd
            lialngChildCount = lialngChildCount + 1
            
            EnumChildWindowsProc = 0
            
        Else
            
            EnumChildWindowsProc = 1
            
        End If
    End Function

    Private Function ClassName( _
            ByVal pvlngHwnd As Long) As String

        
        'Funktion zum Ermitteln des Klassennames
        
        Dim strClassName As String * 256
        Dim lngReturn As Long
        
        'Lese den Klassenname des Handles
        lngReturn = GetClassNameA(pvlngHwnd, strClassName, Len(strClassName))
        
        'Klassenname an die Funktionsvariable uebergeben
        ClassName = Left$(strClassName, lngReturn)
        
    End Function

    Public Sub Test()
        
        'Testprozedur die in allen Instanzen alle Tabellen in allen Mappen durchsucht
        
        Dim aobjApplications() As Application
        Dim ialngIndex As Long
        Dim objWorkbook As Workbook, objWorksheet As Worksheet
        Dim objDictionary As Object
        Dim avntApplications As Variant, vntApplicationItem As Variant
        Dim strFirstAddress As String
        
        'Hole die Application-Objekte alle geoeffneten Excelinstanzen
        aobjApplications = GetApplications
        
        'Neue Instanzt eines Dictionary-Objektes erstellen
        Set objDictionary = CreateObject("Scripting.Dictionary")
        
        'Schleife ueber alle Application-Objekte
        For ialngIndex = LBound(aobjApplications) To UBound(aobjApplications)
            
            'Mehrfach gefundene Instanzen herausfiltern
            If Not objDictionary.Exists(aobjApplications(ialngIndex).hwnd) Then _
                Call objDictionary.Add(aobjApplications(ialngIndex).hwnd, aobjApplications(ialngIndex))
            
            'Objet zuruecksetzen
            Set aobjApplications(ialngIndex) = Nothing
            
        Next
        
        'Instanzen aus dem Dictionary holen
        avntApplications = objDictionary.Items
        
        'Objet zuruecksetzen
        Set objDictionary = Nothing
        
        'Schleife ueber alle Application-Objekte
        For Each vntApplicationItem In avntApplications
            
            For Each objWorkbook In vntApplicationItem.Workbooks
                
                MsgBox objWorkbook.Name
                
                For Each objWorksheet In objWorkbook.Worksheets
                    
                    MsgBox objWorksheet.Name
                    
                Next
            Next
        Next
        
        'Array zuruecksetzen
        Erase avntApplications
    End Sub

    Gruß
    Nepumuk


    Beiträge aus dem Excel-Forum zum Thema "Excel-Datei nicht im Projekt-Explorer"