Kombinování přizpůsobení na úrovni dokumentu a jazyka VBA
Kód jazyk Visual Basic for Application (VBA) můžete použít v dokumentu, který je součástí přizpůsobení na úrovni dokumentu pro systém Microsoft Office Word nebo systém Microsoft Office Excel. Kód jazyka VBA v dokumentu můžete volat ze sestavení přizpůsobení nebo můžete projekt nakonfigurovat tak, aby kód jazyka VBA v dokumentu povolil volání kódu v sestavení přizpůsobení.
Platí pro: Informace v tomto tématu platí pro projekty na úrovni dokumentu pro Excel a Word. Další informace naleznete v tématu Funkce dostupné aplikace Office lication a typu projektu.
Chování kódu jazyka VBA v přizpůsobení na úrovni dokumentu
Když projekt otevřete v sadě Visual Studio, dokument se otevře v režimu návrhu. Kód jazyka VBA se nespustí, když je dokument v režimu návrhu, takže můžete pracovat na dokumentu a kódu bez spuštění kódu jazyka VBA.
Když řešení spustíte, obslužné rutiny událostí v jazyce VBA i sestavení přizpůsobení vyberou události, které jsou vyvolány v dokumentu, a obě sady spuštění kódu. Nelze předem určit, který kód bude spuštěn před druhým; musíte to určit prostřednictvím testování v každém individuálním případě. Pokud dvě sady kódu nejsou pečlivě sladěné a testované, můžete získat neočekávané výsledky.
Volání kódu jazyka VBA ze sestavení přizpůsobení
Makra můžete volat ve wordových dokumentech a volat makra a funkce v excelových sešitech. K tomu použijte jednu z následujících metod:
Pro Word zavolejte Run metodu Application třídy.
V Excelu Run volejte metodu Application třídy.
Pro každou metodu první parametr identifikuje název makra nebo funkce, kterou chcete volat, a zbývající volitelné parametry určují parametry, které se mají předat makre nebo funkci. První parametr může mít pro Word a Excel různé formáty:
První parametr pro Word je řetězec, který může být libovolnou kombinací šablony, modulu a názvu makra. Pokud zadáte název dokumentu, může váš kód spouštět makra jenom v dokumentech souvisejících s aktuálním kontextem – nejen makra v žádném dokumentu.
Prvním parametrem v Excelu může být řetězec, který určuje název makra, označuje, Range kde je funkce, nebo ID registru pro registrovanou funkci KNIHOVNY DLL (XLL). Pokud předáte řetězec, řetězec se vyhodnotí v kontextu aktivního listu.
Následující příklad kódu ukazuje, jak volat makro pojmenované
MyMacro
z projektu na úrovni dokumentu pro Excel. Tento příklad předpokládá, žeMyMacro
je definován vSheet1
.
Globals.Sheet1.Application.Run("MyMacro", missing, missing, missing,
missing, missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing);
Poznámka:
Informace o použití globální missing
proměnné místo volitelných parametrů v jazyce Visual C# najdete v tématu Psaní kódu v řešeních Office.
Volání kódu v přizpůsobení na úrovni dokumentu z jazyka VBA
Projekt na úrovni dokumentu můžete nakonfigurovat pro Word nebo Excel tak, aby kód jazyk Visual Basic for Application (VBA) v dokumentu mohl volat kód v sestavení přizpůsobení. To je užitečné v následujících scénářích:
Chcete rozšířit existující kód jazyka VBA v dokumentu pomocí funkcí v přizpůsobení na úrovni dokumentu, které je přidružené ke stejnému dokumentu.
Chcete zpřístupnit služby, které vyvíjíte v přizpůsobení na úrovni dokumentu, koncovým uživatelům, kteří mají přístup ke službám napsáním kódu jazyka VBA v dokumentu.
Nástroje pro vývoj pro Office v sadě Visual Studio poskytují podobnou funkci pro doplňky VSTO. Pokud vyvíjíte doplněk VSTO, můžete volat kód v doplňku VSTO z jiných systém Microsoft Office řešení. Další informace najdete v tématu Volání kódu v doplňkech VSTO z jiných řešení Office.
Poznámka:
Tuto funkci nelze použít v projektech šablon aplikace Word. Dá se použít jenom v projektech wordových dokumentů, excelových sešitů nebo excelových šablon.
Požadavky
Před povolením volání kódu jazyka VBA do sestavení přizpůsobení musí váš projekt splňovat následující požadavky:
Dokument musí mít jednu z následujících přípon názvů souborů:
Pro Word: .docm nebo .doc
Excel: .xlsm, .xltm, .xls nebo .xlt
Dokument už musí obsahovat projekt jazyka VBA s kódem jazyka VBA.
Kód jazyka VBA v dokumentu musí být povolený ke spuštění bez výzvy uživatele k povolení maker. Spuštění kódu jazyka VBA můžete důvěřovat přidáním umístění projektu Office do seznamu důvěryhodných umístění v nastavení Centra zabezpečení pro Word nebo Excel.
Projekt Office musí obsahovat aspoň jednu veřejnou třídu, která obsahuje jednoho nebo více veřejných členů, které vystavujete jazyku VBA.
V jazyce VBA můžete vystavit metody, vlastnosti a události. Třída, kterou zveřejňujete, může být třídou položky hostitele (například
ThisDocument
pro Word nebo ExcelSheet1
) neboThisWorkbook
jinou třídou, kterou definujete v projektu. Další informace o položkách hostitele najdete v tématu Přehled položek hostitele a ovládacích prvků hostitele.
Povolení volání kódu jazyka VBA do sestavení přizpůsobení
Existují dva různé způsoby, jak v sestavení přizpůsobení vystavit členy kódu jazyka VBA v dokumentu:
Členy třídy položky hostitele můžete vystavit v projektu jazyka Visual Basic jazyku VBA. Chcete-li to provést, nastavte EnableVbaCallers vlastnost host item na True v okně Vlastnosti, zatímco hostitel položka (tj. dokument, list nebo sešit) je otevřen v návrháři. Visual Studio automaticky provede veškerou práci potřebnou k povolení kódu jazyka VBA pro volání členů třídy.
Členům v libovolné veřejné třídě v projektu Visual C# nebo členům třídy položek, které nejsou hostiteli v projektu jazyka Visual Basic, můžete vystavit jazyku VBA. Tato možnost poskytuje větší volnost při výběru tříd, které zveřejňujete jazyku VBA, ale vyžaduje také více ručních kroků.
Chcete-li to provést, je nutné provést následující hlavní kroky:
Vystavit třídu modelu COM.
Přepište metodu GetAutomationObject třídy položky hostitele v projektu tak, aby vrátil instanci třídy, kterou vystavujete jazyku VBA.
Nastavte ReferenceAssemblyFromVbaProject vlastnost libovolné třídy host item v projektu na True. Tím vložíte knihovnu typů sestavení přizpůsobení do sestavení a přidáte odkaz na knihovnu typů do projektu jazyka VBA v dokumentu.
Podrobné pokyny najdete v tématu Postupy: Vystavení kódu jazyku VBA v projektu jazyka Visual Basic a postupy: Vystavení kódu jazyku VBA v projektu Visual C#.
Vlastnosti EnableVbaCallers a ReferenceAssemblyFromVbaProject jsou k dispozici pouze v okně Vlastnosti v době návrhu; nelze je použít za běhu. Pokud chcete zobrazit vlastnosti, otevřete návrháře pro položku hostitele v sadě Visual Studio. Další informace o konkrétních úlohách, které Sada Visual Studio provádí při nastavování těchto vlastností, naleznete v tématu Úlohy prováděné vlastnostmi položky hostitele.
Poznámka:
Pokud sešit nebo dokument ještě neobsahuje kód jazyka VBA nebo pokud kód jazyka VBA v dokumentu není důvěryhodný ke spuštění, zobrazí se chybová zpráva při nastavení EnableVbaCallers nebo ReferenceAssemblyFromVbaProject vlastnost True. Důvodem je to, že Visual Studio nemůže upravit projekt jazyka VBA v dokumentu v této situaci.
Volání do sestavení přizpůsobení pomocí členů v kódu jazyka VBA
Po nakonfigurování projektu tak, aby kód VBA mohl volat do sestavení přizpůsobení, Visual Studio přidá do projektu VBA v dokumentu následující členy:
Pro všechny projekty visual Studio přidá globální metodu s názvem
GetManagedClass
.Pro projekty jazyka Visual Basic, ve kterých zveřejňujete členy třídy položky hostitele pomocí EnableVbaCallers vlastnost, Visual Studio také přidá vlastnost pojmenovanou
CallVSTOAssembly
doThisDocument
,ThisWorkbook
,Sheet1
,Sheet2
neboSheet3
modulu v projektu VBA.Vlastnost nebo
GetManagedClass
metoduCallVSTOAssembly
můžete použít pro přístup k veřejným členům třídy, které jste v projektu zveřejnili v kódu jazyka VBA.
Poznámka:
Při vývoji a nasazování řešení existuje několik různých kopií dokumentu, kde můžete přidat kód jazyka VBA. Další informace najdete v tématu Pokyny pro přidání kódu jazyka VBA do dokumentu.
Použití vlastnosti CallVSTOAssembly v projektu jazyka Visual Basic
CallVSTOAssembly
Vlastnost použijte pro přístup k veřejným členům, které jste přidali do třídy položky hostitele. Například následující makro jazyka VBA volá metodu s názvem MyVSTOMethod
definovanou ve Sheet1
třídě v projektu sešitu aplikace Excel.
Sub MyMacro()
Sheet1.CallVSTOAssembly.MyVSTOMethod()
End Sub
Tato vlastnost je pohodlnější způsob volání do sestavení přizpůsobení než použití GetManagedClass
metody přímo. CallVSTOAssembly
vrátí objekt, který představuje třídu položky hostitele, kterou jste odhalili v jazyce VBA. Členy a parametry metody vráceného objektu se zobrazí v IntelliSense.
Vlastnost CallVSTOAssembly
má deklaraci, která je podobná následujícímu kódu. Tento kód předpokládá, že jste v projektu excelového sešitu Sheet1
s názvem ExcelWorkbook1
VBA zpřístupnili třídu položky hostitele.
Property Get CallVSTOAssembly() As ExcelWorkbook1.Sheet1
Set CallVSTOAssembly = GetManagedClass(Me)
End Property
Použití metody GetManagedClass
Chcete-li použít globální GetManagedClass
metodu, předejte VBA objekt, který odpovídá host item třídy, která obsahuje přepsání GetAutomationObject metoda. Pak použijte vrácený objekt pro přístup ke třídě, kterou jste zpřístupnili jazyku VBA.
Například následující makro jazyka VBA volá metodu s názvem MyVSTOMethod
definovanou ve třídě položky hostitele v Sheet1
projektu excelového sešitu s názvem ExcelWorkbook1
.
Sub CallVSTOMethod
Dim VSTOSheet1 As ExcelWorkbook1.Sheet1
Set VSTOSheet1 = GetManagedClass(Sheet1)
VSTOSheet1.MyVSTOMethod
End Sub
Metoda GetManagedClass
má následující deklaraci.
GetManagedClass(pdispInteropObject Object) As Object
Tato metoda vrátí objekt, který představuje třídu, kterou jste odhalili v jazyce VBA. Členy a parametry metody vráceného objektu se zobrazí v IntelliSense.
Pokyny pro přidání kódu jazyka VBA do dokumentu
Existuje několik různých kopií dokumentu, kde můžete přidat kód jazyka VBA, který volá do přizpůsobení na úrovni dokumentu.
Při vývoji a testování řešení můžete napsat kód jazyka VBA v dokumentu, který se otevře při ladění nebo spuštění projektu v sadě Visual Studio (to znamená dokument ve výstupní složce sestavení). Jakýkoli kód jazyka VBA, který přidáte do tohoto dokumentu, se ale při příštím sestavení projektu přepíše, protože Visual Studio nahradí dokument ve výstupní složce sestavení kopií dokumentu z hlavní složky projektu.
Pokud chcete uložit kód jazyka VBA, který přidáte do dokumentu při ladění nebo spuštění řešení, zkopírujte kód jazyka VBA do dokumentu ve složce projektu. Další informace o procesu sestavení naleznete v tématu Sestavení řešení pro systém Office.
Až budete připraveni nasadit řešení, existují tři hlavní umístění dokumentů, do kterých můžete přidat kód jazyka VBA.
Ve složce projektu na vývojovém počítači
Toto umístění je vhodné, pokud máte úplnou kontrolu nad kódem jazyka VBA v dokumentu i kódem přizpůsobení. Vzhledem k tomu, že dokument je na vývojovém počítači, můžete kód jazyka VBA snadno upravit, pokud změníte kód přizpůsobení. Kód jazyka VBA, který přidáte do této kopie dokumentu, zůstane v dokumentu při sestavování, ladění a publikování řešení.
Kód jazyka VBA nelze přidat do dokumentu, když je otevřený v návrháři. Nejdřív musíte dokument zavřít v návrháři a pak dokument otevřít přímo ve Wordu nebo Excelu.
Upozornění
Pokud přidáte kód jazyka VBA, který se spustí při otevření dokumentu, může tento kód ve výjimečných případech poškodit dokument nebo zabránit jeho otevření v návrháři.
Ve složce pro publikování nebo instalaci
V některých případech může být vhodné přidat kód jazyka VBA do dokumentu do složky publikování nebo instalace. Tuto možnost můžete zvolit například v případě, že je kód jazyka VBA napsaný a otestovaný jiným vývojářem na počítači, na kterém není nainstalovaná sada Visual Studio.
Pokud uživatelé řešení nainstalují přímo ze složky publikování, musíte do dokumentu přidat kód jazyka VBA při každém publikování řešení. Visual Studio při publikování řešení přepíše dokument v umístění publikování.
Pokud uživatelé nainstalují řešení z instalační složky, která se liší od složky publikování, můžete se vyhnout přidání kódu jazyka VBA do dokumentu při každém publikování řešení. Až bude aktualizace publikování připravená k přesunutí ze složky publikování do instalační složky, zkopírujte všechny soubory do instalační složky s výjimkou dokumentu.
Na počítači koncového uživatele
Pokud jsou koncoví uživatelé vývojáři jazyka VBA, kteří volají do služeb, které zadáte v přizpůsobení na úrovni dokumentu, můžete jim říct, jak volat kód pomocí CallVSTOAssembly
vlastnosti nebo GetManagedClass
metody v jejich kopiích dokumentu. Když publikujete aktualizace řešení, kód jazyka VBA v dokumentu na počítači koncového uživatele nebude přepsán, protože dokument není upraven aktualizacemi publikování.
Úlohy prováděné vlastnostmi položky hostitele
Při použití EnableVbaCallers a ReferenceAssemblyFromVbaProject vlastnosti, Visual Studio provádí různé sady úloh.
EnableVbaCallers
Při nastavení EnableVbaCallers vlastnost hostitelské položky true v projektu Visual Basic, Visual Studio provádí následující úlohy:
Přidá ComClassAttribute atributy ComVisibleAttribute do třídy položky hostitele.
Přepíše GetAutomationObject metoda třídy host item.
Nastaví ReferenceAssemblyFromVbaProject vlastnost host item na True.
Když vlastnost EnableVbaCallers nastavíte zpět na False, Visual Studio provede následující úlohy:
Odebere z ComClassAttribute třídy atributy ComVisibleAttribute
ThisDocument
.Odebere Metodu GetAutomationObject z třídy položky hostitele.
Poznámka:
Visual Studio nenastavuje vlastnost ReferenceAssemblyFromVbaProject zpět na False. Tuto vlastnost můžete nastavit na False ručně pomocí okna Vlastnosti.
ReferenceAssemblyFromVbaProject
Pokud je vlastnost ReferenceAssemblyFromVbaProject libovolné položky hostitele v projektu Visual Basic nebo Visual C# nastavena na Hodnotu True, Visual Studio provede následující úlohy:
Vygeneruje knihovnu typů pro sestavení přizpůsobení a vloží knihovnu typů do sestavení.
Přidá odkaz na následující knihovny typů v projektu VBA v dokumentu:
Knihovna typů pro sestavení vlastního nastavení.
Knihovna typů nástroje Microsoft Visual Studio Tools for Office Execution Engine 9.0. Tato knihovna typů je součástí sady Visual Studio Tools for Office runtime .
Pokud je vlastnost ReferenceAssemblyFromVbaProject nastavena zpět na False, Visual Studio provádí následující úlohy:
Odebere odkazy knihovny typů z projektu jazyka VBA v dokumentu.
Odebere vloženou knihovnu typů ze sestavení.
Odstraňování potíží
V následující tabulce jsou uvedeny některé běžné chyby a návrhy pro opravu chyb.
Chyba | Návrh |
---|---|
Po nastavení EnableVbaCallers nebo ReferenceAssemblyFromVbaProject vlastnost chybová zpráva uvádí, že dokument neobsahuje projekt VBA nebo nemáte oprávnění pro přístup k projektu VBA v dokumentu. | Ujistěte se, že dokument v projektu obsahuje alespoň jedno makro VBA, projekt VBA má dostatečný vztah důvěryhodnosti ke spuštění a projekt VBA není chráněný heslem. |
Po nastavení EnableVbaCallers nebo ReferenceAssemblyFromVbaProject vlastnost, chybová zpráva uvádí, že GuidAttribute deklarace chybí nebo poškozena. | Ujistěte se, že GuidAttribute deklarace je umístěna v souboru AssemblyInfo.cs nebo AssemblyInfo.vb v projektu a že tento atribut je nastaven na platný identifikátor GUID. |
Po nastavení EnableVbaCallers nebo ReferenceAssemblyFromVbaProject vlastnost, chybová zpráva uvádí, že číslo verze určené AssemblyVersionAttribute není platné. | Ujistěte se, že deklarace AssemblyVersionAttribute v souboru AssemblyInfo.cs nebo AssemblyInfo.vb v projektu je nastavena na platné číslo verze sestavení. Informace o platných číslech verze sestavení naleznete v AssemblyVersionAttribute třídě. |
Po přejmenování sestavení přizpůsobení přestane fungovat kód jazyka VBA, který volá sestavení přizpůsobení. | Pokud změníte název sestavení přizpůsobení po jeho zveřejnění v kódu jazyka VBA, propojení mezi projektem VBA v dokumentu a sestavením vlastního nastavení se přeruší. Chcete-li tento problém vyřešit, změňte Vlastnost ReferenceFromVbaAssembly v projektu na False a pak zpět na True a potom nahraďte všechny odkazy na starý název sestavení v kódu VBA novým názvem sestavení. |
Související obsah
- Postupy: Zveřejnění kódu jazyku VBA v projektu jazyka Visual Basic
- Postupy: Zveřejnění kódu pro jazyk VBA v projektu Visual C#
- Návod: Volání kódu z jazyka VBA v projektu jazyka Visual Basic
- Návod: Volání kódu z jazyka VBA v projektu Visual C#
- Návrh a vytváření řešení pro Systém Office
- Porovnání řešení VBA a Office v sadě Visual Studio
- Přizpůsobení na úrovni dokumentu programu