[VBA] - Otevření XLS listu z PPT prezentace
Zdravím, předem předesílám, že nevím, jestli "se to dá", ale zkusím to...
Jde o následující - mám prezentaci v PPT a k ní bych potřeboval na určitém místě otevřít XLS tabulku (kterážto je dlooouhá takže se na slajd prostě nevejde). Potřeboval bych to udělat nejlépe klikem na prvek na slajdu (třeba tlačítko nebo formou kliku na slovo s URL odkazem).
Jednoduchým svázáním URL s daným XLS souborem sice docílím jeho otevření, ale pouze "na pozadí", tedy zobrazen je pouze snímek...
Potřeboval bych "nakopnout" nějakým správným směrem (VBA makro?), případně utvrdit v tom, že to nejde, pro dosažení následujícího:
1) V prezentaci (v "prezentačním módu") kliknout na odkaz/ovl. prvek
2) Otevřít soubor XLS s tabulkou
3) NASTAVIT NA NĚJ FOCUS, aby se "zobrazil", protože takhle musím dát Esc a ručně na něj "překliknout"...
P.S: Není to nijak kritický, v nejhorším to prostě udělám ručním otevřením nebo "překliknutím", ale jen mě zajímá, zda to jde... Když si safra můžu v Excelu pomocí VBA celkem nenáročně cucat data z jinejch tabulek, tak proč by nešla taková blbá banalita, jako otevřít soubor a nastavit na něj focus, ne? :-D
Re: [VBA] - Otevření XLS listu z PPT prezentace
Tak jsem si s tím trošku hrál a fungoval mi pouze jeden způsob.
Excelovský sešit jsem měl otevřený předem.
V slidu jsem měl tlačítko a k němu takovýto kód
Kód:
Option Explicit
Option Base 0
Option Compare Text
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Sub SwitchToThisWindow Lib "user32.dll" (ByVal lhWindow As Long, ByVal pbAltTab As Long)
Private Const SW_SHOW As Long = 5
Private Const SW_SHOWMAXIMIZED As Long = 3
Private Const SW_SHOWNORMAL As Long = 1
'Udalostni procedura kliknuti na tlacitko
Private Sub CommandButton1_Click()
Dim loWorkbook As Excel.Workbook
Dim loWrkSheet As Excel.Worksheet
Dim lhWnd As Long
Dim lsWndTitle As String
lsWndTitle = souborGetJmeno("C:\Mojecesta\prezentace.xls")
If (lsWndTitle <> vbNullString) Then
lsWndTitle = "Microsoft Excel - " & lsWndTitle
Else
'Něco je špatně ve funkci souborGetJmeno, každopádně to určitě nenajde dané okno, takže nemá cenu pokračovat, na zvážení MsgBox s hláškou, ať víš co se děje
Exit Sub
End If
lhWnd = FindWindow(vbNullString, lsWndTitle) 'najit handle okna Excelu
If (lhWnd <> 0&) Then
Call SwitchToThisWindow(lhWnd, CLng(False)) 'prepnout do okna excelu
'Call ShowWindow(lhWnd, SW_SHOW) 'tohle mi ho nechtelo zobrazovat, hm?
Else
'Okno Excelu nebylo nalezeno, opět MsgBox (?)
End If
End Sub
'Vrati jmeno souboru bez cesty uvedeneho v psCesta. pbPripona urcuje, zda se ma nebo nema vratit i s priponou
Private Function souborGetJmeno(ByVal psCesta As String, Optional ByVal pbPripona As Boolean = True) As String
On Error GoTo ERR_DEF_HANDLER
Dim lnLomitko As Integer, lnTecka As Integer
lnLomitko = InStrRev(psCesta, "\", , vbTextCompare)
lnTecka = InStrRev(psCesta, ".", , vbTextCompare)
If (lnLomitko > 0) Then
lnLomitko = lnLomitko + 1
Else
lnLomitko = 1
End If
If (lnTecka > 0 And lnTecka > lnLomitko And pbPripona = False) Then
souborGetJmeno = Mid$(psCesta, lnLomitko, lnTecka - lnLomitko)
Else
souborGetJmeno = Mid$(psCesta, lnLomitko)
End If
Exit Function
ERR_DEF_HANDLER:
souborGetJmeno = vbNullString
End Function
Poznámky:- Zavolat okno metodou ShowWindow se mi nedařilo, kdo znáte lépe WinApi, dejte případně vědět, co je blbě.
- Deklaraci metody SwitchToThisWindow jsem v souborech v definičních souborech s API pro Visual Basic nenašel, tak jsem si jí napsal sám. Není na ní co zkazit, jen si nejsem stoprocentně jistý, zda je BOOL braný jako int.
- Zkoušel jsem taky klasicky mít referenci na Microsoft 9.0 Excel Library, spustit Excel pomocí New Excel.Application a následně otevřít sešit a nastavit si daný list. Všechno samozřejmě fungovalo, našlo se i okno Excelu (alias lhWnd), ale okno nebylo vidět, není ani v task baru.
- Taky jsem zkoušel
Kód:
VBA.Shell "C:\Program Files\\MsOff_2k\Office\Excel.exe ""C:\mojecesta\prezentace.xls""", vbMaximizedFocus
, neboli otevřít Excel i se sešitem. Potom jsem opět hledal handle okna atd., ale taky to nedávalo správný výsledek.
Prezentaci, kde jsem to dělal se mi nepodařilo nahrát (zazipována), v případě zájmu na mail.
Re: [VBA] - Otevření XLS listu z PPT prezentace
Díky moc za snahu, teď jsem to v práci narychlo zkusil, ale nějak to ne a ne dokopat k funkčnosti, dokonce jsem si nastavil breakpoint na
lsWndTitle = souborGetJmeno("C:\Mojecesta\prezentace.xls")
tedy řádek, kam by se to mělo zcela určitě dostat, a kulový? Zabezpečení maker jsem stáhnul, takže to by to blokovat nemělo... divný... Nu ještě se v tom doma pohrabu, každopádně i tak díky moc!
Re: [VBA] - Otevření XLS listu z PPT prezentace
Jestli chceš, můžu ti poslat na mail tu mojí prezentaci, jestli ti to bude fungovat. Vypadá to, jakoby ta událostní procedura vůbec neprobíhala.
Musí se samozřejmě shodovat jméno tlačítka atd. ale to jsi předpokládám zkontroloval.
Re: [VBA] - Otevření XLS listu z PPT prezentace
Já jsem si udělal jen klik na odkaz v textu a na něj jsem přímo přes "Nastavit akci" pověsil makro ZkusTo (přejmenovaný CommandButton1_Click) a prostě se ta událostní procedura vůbec nezavolá, fakt na palici tohle? Pochopil bych, kdyby to makro padalo, ale proč se doprd... vůbec nevolá?! :-)
Přitom v tý samý prezentaci mám na UserFormech obrázky který kliknutím na odkazy můžu "vyvolávat" a mám to otvíraný taky přes makra a fachá to v klidu... Nechápu :-)