Stránka 1 z 1

Spojení více maker (predchozí příspěvek)

Napsal: 11 čer 2014 19:19
od jiri255
Ještě jednou zdravím,
narazil jsem na malý problém se spojením maker s tím s předchozího příspěvku a prosím ještě o pomoc.
http://www.pc-help.cz/viewtopic.php?f=35&t=133974

Mám 3 funkční makra Module2, Module3, Module 4 a chtěl bych k nim na konec přidat i to z předchozího
příspěvku, které jsem si nakopíroval do Module5. Mám to takto zapsáno v Module1:

Kód: Vybrat vše

Sub spoustec()
      Module2.sloupce
      Module3.vymaz
      Module4.zmena
      Module5.GetAllWorkbookWindowNames
End Sub


Problém je v tom, že první tři makra proběhnou v pohodě a na tom posledním to vždy vyhodí chybovou hlášku,
kterou když odklepnu, tak makro doběhne.
Pokud to makro v Module5, ale spustím samostatně bez těch ostatních problém nenastane.
Nevíte jak to makro viz níže (předchozí příspěvek) správně přidat k ostatním, aby to proběhlo bez chyb?

Kód: Vybrat vše

'------------- Code Module --------------

Option Explicit

Declare Function FindWindowEx Lib "User32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Declare Function GetClassName Lib "User32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Declare Function IIDFromString Lib "ole32" (ByVal lpsz As Long, ByRef lpiid As UUID) As Long
Declare Function AccessibleObjectFromWindow Lib "oleacc" (ByVal hWnd As Long, ByVal dwId As Long, ByRef riid As UUID, ByRef ppvObject As Object) As Long

Type UUID 'GUID
  Data1 As Long
  Data2 As Integer
  Data3 As Integer
  Data4(7) As Byte
End Type


'------------- Code (Module, Form) --------------

Const IID_IDispatch As String = "{00020400-0000-0000-C000-000000000046}"
Const OBJID_NATIVEOM As Long = &HFFFFFFF0

'Sub Command1_Click()
Sub GetAllWorkbookWindowNames()
    On Error GoTo MyErrorHandler

    Dim hWndMain As Long
    hWndMain = FindWindowEx(0&, 0&, "XLMAIN", vbNullString)

    Do While hWndMain <> 0
        GetWbkWindows hWndMain
        hWndMain = FindWindowEx(0&, hWndMain, "XLMAIN", vbNullString)
    Loop

    Exit Sub

MyErrorHandler:
    MsgBox "GetAllWorkbookWindowNames" & vbCrLf & vbCrLf & "Err = " & Err.Number & vbCrLf & "Description: " & Err.Description
End Sub

Private Sub GetWbkWindows(ByVal hWndMain As Long)
    On Error GoTo MyErrorHandler

    Dim hWndDesk As Long
    hWndDesk = FindWindowEx(hWndMain, 0&, "XLDESK", vbNullString)

    If hWndDesk <> 0 Then
        Dim hWnd As Long
        hWnd = FindWindowEx(hWndDesk, 0, vbNullString, vbNullString)

        Dim strText As String
        Dim lngRet As Long
        Do While hWnd <> 0
            strText = String$(100, Chr$(0))
            lngRet = GetClassName(hWnd, strText, 100)

            If Left$(strText, lngRet) = "EXCEL7" Then
                GetExcelObjectFromHwnd hWnd
                Exit Sub
            End If

            hWnd = FindWindowEx(hWndDesk, hWnd, vbNullString, vbNullString)
            Loop

        On Error Resume Next
    End If

    Exit Sub

MyErrorHandler:
    MsgBox "GetWbkWindows" & vbCrLf & vbCrLf & "Err = " & Err.Number & vbCrLf & "Description: " & Err.Description
End Sub

Public Function GetExcelObjectFromHwnd(ByVal hWnd As Long) As Boolean
    On Error GoTo MyErrorHandler

    Dim fOk As Boolean
    fOk = False

    Dim iid As UUID
    Call IIDFromString(StrPtr(IID_IDispatch), iid)

    Dim obj As Object
    If AccessibleObjectFromWindow(hWnd, OBJID_NATIVEOM, iid, obj) = 0 Then 'S_OK
        Dim objApp As Excel.Application
        Set objApp = obj.Application
       
        Dim wbCount As Integer
        For wbCount = 1 To objApp.Workbooks.Count
       
            ' Debug.Print objApp.Workbooks(wbCount).name
           
            ' Sheets Workbooks
            ' Dim myWorksheet As Worksheet
            ' For Each myWorksheet In objApp.Workbooks(1).Worksheets
            '     Debug.Print "     " & myWorksheet.name
            '     DoEvents
            ' Next
           
            If InStr(objApp.Workbooks(wbCount).name, "crd") > 0 Then
       
                objApp.Workbooks(wbCount).Close False
                wbCount = wbCount - 1
                If wbCount = objApp.Workbooks.Count Then Exit For
            End If
        Next
        fOk = True
    End If

    GetExcelObjectFromHwnd = fOk

    Exit Function

MyErrorHandler:
    MsgBox "GetExcelObjectFromHwnd" & vbCrLf & vbCrLf & "Err = " & Err.Number & vbCrLf & "Description: " & Err.Description
End Function

Re: Spojení více maker (predchozí příspěvek)

Napsal: 11 čer 2014 19:34
od cmuch
Jakou hlášku to vyhodí?

Re: Spojení více maker (predchozí příspěvek)

Napsal: 11 čer 2014 20:05
od jiri255
hlášku zjistím a napíšu zítra bohužel jsem to měl na usb disku a zapomněl jsem ho u známého :-(

Re: Spojení více maker (predchozí příspěvek)

Napsal: 12 čer 2014 05:54
od cmuch
Ten spouštěč můžeš mít i takto

Kód: Vybrat vše

Sub spoustec()
      sloupce
      vymaz
      zmena
      GetAllWorkbookWindowNames
End Sub

nebo

Kód: Vybrat vše

Sub spoustec()
      call sloupce
      call vymaz
      call zmena
      call GetAllWorkbookWindowNames
End Sub

Re: Spojení více maker (predchozí příspěvek)

Napsal: 12 čer 2014 09:59
od jiri255
děkuji za nápovědu... ta hláška je:

GetExcelObjectFromHwd
Err = 9
Description: Sub script out of range

a v příloze přikládám celý ten soubor s těmi makry + to makro z minulého příspěvku
je Module06.
Do excelu zkopíruju data a když makro doběhne končí to tou hláškou. Ta hláška vyskakuje
i pokud se makro spustí bez dat.

Re: Spojení více maker (predchozí příspěvek)

Napsal: 17 čer 2014 19:22
od jiri255
nikdo netuší jak by to šlo opravit?

Re: Spojení více maker (predchozí příspěvek)

Napsal: 18 čer 2014 21:08
od cmuch
Možná dělám něco špatně, ale mě to funguje tak jak má.

Re: Spojení více maker (predchozí příspěvek)

Napsal: 19 čer 2014 08:17
od jiri255
hmm... nedalo mi to a zkusil jsem to místo na svém pc Win XP a office 07, na jiném PC s Win 7 a office 07
a tam to proběhlo opravdu bez problémů... ,tak teď nevím co si o tom mám myslet :-(
Problém by tedy mohl být v XP nebo v nastavení office? Můžu se zeptat na OS a office, na kterých to proběhlo
bez problémů.
Protože já bych to ještě nějaký čas potřeboval používat na těch XP a O07...

Re: Spojení více maker (predchozí příspěvek)

Napsal: 20 čer 2014 17:21
od cmuch
Možnost zkusit to na Xp nemám.
Jinak na Win7 (různé verze) a Ex2007 nebo Ex2010 to chodí bez chyby.

Zkus si ten kód krokovat ( v editoru VBA klikni do makra GetAllWorkbookWindowNames , mačkej F8 ) a třeba zjistíš při čem to vyhodí tu chybu.

Re: Spojení více maker (predchozí příspěvek)

Napsal: 23 čer 2014 19:42
od jiri255
tak jsem s tím laboroval, a když to jedu krok po kroku, tak problém není... jediné co jsem zjistil je,
že v tom kódu je obsažen přesně ten error co mi to hlásí

Kód: Vybrat vše

MyErrorHandler:
    MsgBox "GetExcelObjectFromHwnd" & vbCrLf & vbCrLf & "Err = " & Err.Number & vbCrLf & "Description: " & Err.Description
End Function

šlo by ten kód nějak ořezat o všechny ty chybové hlášky, které tam jsou nadefinované s toho vyhodit?

Re: Spojení více maker (predchozí příspěvek)

Napsal: 27 čer 2014 19:41
od cmuch
Zakomentuj ten řádek s MSGBOXem.

Chyba tam vyskočí, že nemůže najít nějaký sešit. Pokud podle tebe proběhlo vše v pořádku klidně zakomentuj.

Re: Spojení více maker (predchozí příspěvek)  Vyřešeno

Napsal: 30 čer 2014 19:05
od jiri255
tak to vypada, že to problém vyřešilo teď už to funguje, tak jak má :-) díky za pomoc a trpělivost