Prvky ActiveX od Microsoftu na formuláři VBA
Přidal ad excel, 18.05.2009
Ovládací prvky ActiveX, které Microsoft nabídl prostřednictvím Visual Studia 6, není ve VBA běžně možné používat. Jedná se kupříkladu o Datagrid, RichTextBox, Winsock a další. Problém přitom není technického rázu, neboť jazyk a technologie VBA je na úrovni VB6. Omezení vyplývají z licenčních pravidel (tzv. Design Time License) a také zabezpečení.
Podrobné novinky
Ovládací prvky ActiveX, které Microsoft nabídl prostřednictvím Visual Studia 6, není ve VBA běžně možné používat. Jedná se kupříkladu o Datagrid, RichTextBox, Winsock a další. Problém přitom není technického rázu, neboť jazyk a technologie VBA je na úrovni VB6. Omezení vyplývají z licenčních pravidel (tzv. Design Time License) a také zabezpečení.
Pokud nejste vlastníky Microsoft Office verze Developer (osobně jsem je nikdy neviděl) nebo nemáte na svém počítači instalováno Visual Studio, nebudete schopni takové prvky přidat na formulář. Nejspíš patřičné knihovny ani nebudete mít v systému a Microsoft je samostatně pokud vím ke stažení nenabízí (obsahuje je Service Pack 6 pro Visual Basic 6.0).
Zkusme se dnes prokousat postupem nasazení prvku Microsoft DataGrid.
Předpokládám, že se v systému nachází zaregistrovaná knihovna MSDATGRD.OCX. Pokud ano, můžete si prvek v editoru VBA přidat do Toolboxu.

Pokud se DataGrid pokusíte vykreslit do plochy formuláře, dočkáte se následující hlášky.

Ve zobrazené zprávě se totiž promítá zabezpečení, řízené nastaveními v registru a vzdáleně vázané na Internet Explorer. Co s tím?
Jak pochopíme ze článku Jak zabránit spuštění ovládacího prvku ActiveX v aplikaci Internet Explorer, je potřeba nejprve zjistit hodnotu CLSID ovládacího prvku ActiveX. Pátráme tedy po názvu podklíče v HKEY_CLASSES_ROOT\CLSID\, jenž odpovídá prvku Microsoft DataGrid. Po chvíli hledání (menu Úpravy/Najít) zjistíme, že se jedná o podklíč {CDE57A43-8B86-11D0-B3C6-00A0C90AEA82}. Název podklíče je daným CLSID.

Podklíč stejného názvu by se měl nacházel ve větvi HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\. Stačí už jen přenastavit hodnotu Compatibility Flags ze 400 (v šestnáctkové soustavě) na 0. Tím odstavíme zabezpečení pro daný prvek.

Nyní už můžeme v prostředí VBA vykreslit prvek Microsoft DataGrid na plochu formuláře.

Bavíme-li se konkrétně o prvku DataGrid, pak by našemu trápení ještě nebyl konec. Standardně je totiž vázán na objekt Data odkazující na zdroj dat. V příkladu níže jsem si vystačil s přiřazením recordsetu a databázovým přístupem k excelovskému sešitu. Nutno podotknout, že jsem potýkal s problémy korektního překreslování prvku.
[code=vba]Private Sub CommandButton1_Click()
'upraveno podle http://www.excelkb.com/article.aspx?id=10041&cNode=7X0G0W
Dim cnt As ADODB.Connection
Dim rst As ADODB.Recordset
Dim stSQL As String
'definice připojení
Const stCon As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\data.xls;" & _
"Extended Properties=""Excel 8.0;HDR=YES"";"
'SQL dotaz
stSQL = "SELECT JMENO, CISLO FROM [List1$]"
'objekty ADO
Set cnt = New ADODB.Connection
Set rst = New ADODB.Recordset
'vlastní připojení
cnt.Open stCon
With rst
'nastavení recordsetu
.CursorLocation = adUseClient
.Open stSQL, cnt, adOpenForwardOnly, adLockReadOnly, adCmdText
'odpojení recordsetu
Set .ActiveConnection = Nothing
End With
'obsahuje výsledek nějaká data?
If rst.EOF Then
MsgBox "Data nejsou k dispozici!", vbCritical
GoTo Konec
End If
'naplnění prvku DataGrid
Set Me.DataGrid1.DataSource = rst
'překreslení prvku DataGrid
Me.DataGrid1.Refresh
Konec:
'uzavření a odpojení z paměti
rst.Close
cnt.Close
Set rst = Nothing
Set cnt = Nothing
End Sub[/code]
Obrázek níže ukazuje DataGrid v akci.

Pozor na jednu věc. Zabezpečení se může projevit už při otevírání sešitu, ve kterém je "podezřelý" prvek ActiveX použit. Pro studium tohoto stavu nám pomůže článek Při otevření dokumentu sady Office XP nebo Office 2003 se zobrazí výzva k udělení oprávnění pro ovládací prvky ActiveX. Podle něj si nastavíme hodnoty v klíčích HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\Common (UFIControls na 1) a HKEY_CURRENT_USER\Software\Microsoft\VBA\Security (LoadControlsInForms na 1).


Nakonec dodám ještě osobní zkušenost - sešity s netypickými prvky ActiveX mohou častěji způsobit pády aplikace.