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á, že MyMacro je definován v Sheet1.

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) nebo ThisWorkbook 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:

    1. Vystavit třídu modelu COM.

    2. Přepište metodu GetAutomationObject třídy položky hostitele v projektu tak, aby vrátil instanci třídy, kterou vystavujete jazyku VBA.

    3. 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 do ThisDocument, ThisWorkbook, Sheet1, Sheet2nebo Sheet3 modulu v projektu VBA.

    Vlastnost nebo GetManagedClass metodu CallVSTOAssembly 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:

  1. Přidá ComClassAttribute atributy ComVisibleAttribute do třídy položky hostitele.

  2. Přepíše GetAutomationObject metoda třídy host item.

  3. Nastaví ReferenceAssemblyFromVbaProject vlastnost host item na True.

    Když vlastnost EnableVbaCallers nastavíte zpět na False, Visual Studio provede následující úlohy:

  4. Odebere z ComClassAttribute třídy atributy ComVisibleAttribute ThisDocument .

  5. 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:

  1. Vygeneruje knihovnu typů pro sestavení přizpůsobení a vloží knihovnu typů do sestavení.

  2. 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:

  3. Odebere odkazy knihovny typů z projektu jazyka VBA v dokumentu.

  4. 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í.