Docela mne to zajímá, zda se Ti to podaří nějak elegantně vyřešit. Dovolím si pár poznámek.
Mohlo by stačit testovat existenci souboru a pak nahrát forms a pokud zhavaruje, pak jej nezobrazit.
Call ThisWorkbook.VBProject.VBComponents("Menu").Export("C:\WINDOWS\Temp\ee.bas")
With OutSesit
.Activate
'.VBProject.VBComponents.Add (vbext_ct_MSForm)
.VBProject.VBComponents.Import ("C:\WINDOWS\Temp\ee.bas")
End With
OCX objekty jsou ve VBA dostupné přes import např.
VBAEditor.References.AddFromFile "C:\Program Files\Common Files\system\ado\msado15.dll"
Pokud OCX dodáš s XLS pak stačí nahrát a používat. Nic méně to má podobnou podmínku.
Abys mohl nahrát pak potřebuješ ve VBA v References aktivovat doplněk M.S.Office Extensibility
Nevím na čem to přesně závisí. V některých PC nebyl aktivovány a pokud jsem otevřel sešit, pak se aktivoval. V jiných PC zase vyžadoval ruční zaškrtnutí v References.
To správné řešení je asi přes dynamickou alokaci - vytvoření instance.
Dynamicky zjistit, zda je COM registrovaný a pak :
- Test OCX
- LoadLibraryRegister
- GetProcAddressRegister apod.
Potom máš objekt v paměti pak jen jej svážeš s formsem a vykreslíš. To je ale na delší program (fuj).
Důvod je v tom, že když otevřeš XLS, pak je jedno co si nastavíš. VBA si zkontroluje makra a najde to co nezná. Pak zařve.
Kdybys použil externí deklaraci (pokud to jde) pak můžeš zkusit podmíněné zavedení. To ale vím, že jde s DLL. Nevím jak je na tom OCX.
To proto by mne zajímalo zda to nejde jinak. Občas by se mi to taky hodilo. R.
citovat