Dela via


Kombinera anpassningar på VBA- och dokumentnivå

Du kan använda VBA-kod (Visual Basic for Applications) i ett dokument som ingår i en anpassning på dokumentnivå för Microsoft Office Word eller Microsoft Office Excel. Du kan anropa VBA-kod i dokumentet från anpassningssammansättningen, eller så kan du konfigurera projektet för att aktivera VBA-kod i dokumentet för att anropa kod i anpassningssammansättningen.

Gäller för: Informationen i det här avsnittet gäller för projekt på dokumentnivå för Excel och Word. Mer information finns i Funktioner som är tillgängliga efter Office-program och projekttyp.

Beteende för VBA-kod i en anpassning på dokumentnivå

När du öppnar projektet i Visual Studio öppnas dokumentet i designläge. VBA-koden körs inte när dokumentet är i designläge, så du kan arbeta med dokumentet och koden utan att köra VBA-koden.

När du kör lösningen hämtar händelsehanterare i både VBA och anpassningssammansättningen händelser som genereras i dokumentet och båda uppsättningarna kod körs. Du kan inte fastställa i förväg vilken kod som ska köras före den andra. du måste fastställa detta genom testning i varje enskilt fall. Du kan få oväntade resultat om de två koduppsättningarna inte samordnas noggrant och testas.

Anropa VBA-kod från anpassningssammansättningen

Du kan anropa makron i Word-dokument och anropa makron och funktioner i Excel-arbetsböcker. Gör detta genom att använda någon av följande metoder:

  • För Word anropar du Run -metoden för Application klassen.

  • För Excel, anropa Run-metoden i Application-klassen.

    För varje metod identifierar den första parametern namnet på det makro eller den funktion som du vill anropa, och de återstående valfria parametrarna anger de parametrar som ska skickas till makrot eller funktionen. Den första parametern kan ha olika format för Word och Excel:

  • För Word är den första parametern en sträng som kan vara valfri kombination av mall, modul och makronamn. Om du anger dokumentnamnet kan koden bara köra makron i dokument som är relaterade till den aktuella kontexten – inte bara alla makron i något dokument.

  • För Excel kan den första parametern vara en sträng som anger makronamnet, en Range som anger var funktionen är eller ett register-ID för en registrerad DLL-funktion (XLL). Om du skickar in en sträng, kommer strängen att utvärderas i kontexten av det aktiva kalkylbladet.

    I följande kodexempel visas hur du anropar ett makro med namnet MyMacro från ett projekt på dokumentnivå för Excel. Det här exemplet förutsätter att MyMacro definieras i 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);

Anmärkning

Information om hur du använder den globala missing variabeln i stället för valfria parametrar i Visual C# finns i Skriva kod i Office-lösningar.

Anropa kod i anpassningar på dokumentnivå från VBA

Du kan konfigurera ett projekt på dokumentnivå för Word eller Excel så att VBA-kod (Visual Basic for Applications) i dokumentet kan anropa kod i anpassningssammansättningen. Detta är användbart i följande scenarier:

  • Du vill utöka befintlig VBA-kod i ett dokument med hjälp av funktioner i en anpassning på dokumentnivå som är associerad med samma dokument.

  • Du vill göra tjänster som du utvecklar i en anpassning på dokumentnivå tillgängliga för slutanvändare som kan komma åt tjänsterna genom att skriva VBA-kod i dokumentet.

    Office-utvecklingsverktygen i Visual Studio har en liknande funktion för VSTO-tillägg. Om du utvecklar ett VSTO-tillägg kan du anropa kod i ditt VSTO-tillägg från andra Microsoft Office-lösningar. För mer information, se Anropa kod i VSTO-tillägg från andra Office-lösningar.

Anmärkning

Den här funktionen kan inte användas i Word-mallprojekt. Den kan endast användas i Word-dokument, Excel-arbetsbok eller Excel-mallprojekt.

Kravspecifikation

Innan du kan aktivera VBA-kod för att anropa anpassningssammansättningen måste projektet uppfylla följande krav:

  • Dokumentet måste ha något av följande filnamnstillägg:

    • För Word: .docm eller .doc

    • För Excel: .xlsm, .xltm, .xlseller .xlt

  • Dokumentet måste redan innehålla ett VBA-projekt som har VBA-kod i sig.

  • VBA-kod i dokumentet måste tillåtas köras utan att användaren uppmanas att aktivera makron. Du kan lita på att VBA-kod körs genom att lägga till platsen för Office-projektet i listan över betrodda platser i Säkerhetscenter-inställningarna för Word eller Excel.

  • Office-projektet måste innehålla minst en offentlig klass som innehåller en eller flera offentliga medlemmar som du exponerar för VBA.

    Du kan exponera metoder, egenskaper och händelser för VBA. Klassen som du exponerar kan vara en värdobjektklass (till exempel ThisDocument för Word eller ThisWorkbook och Sheet1 för Excel) eller en annan klass som du definierar i projektet. Mer information om värdobjekt finns i Översikt över värdobjekt och värdkontroller.

Aktivera VBA-kod för att anropa anpassningssammansättningen

Det finns två olika sätt att exponera medlemmar i en anpassningssammansättning för VBA-kod i dokumentet:

  • Du kan exponera medlemmar i en värdobjektklass i ett Visual Basic-projekt för VBA. Det gör du genom att ange egenskapen EnableVbaCallers för värdobjektet till True i fönstret Egenskaper medan värdobjektet (dvs. dokumentet, kalkylbladet eller arbetsboken) är öppet i designern. Visual Studio utför automatiskt allt arbete som krävs för att aktivera VBA-kod för att anropa medlemmar i klassen.

  • Du kan exponera medlemmar i valfri offentlig klass i ett Visual C#-projekt, eller medlemmar i en objektklass som inte är värd i ett Visual Basic-projekt, för VBA. Det här alternativet ger dig större frihet att välja vilka klasser du exponerar för VBA, men det kräver också mer manuella steg.

    För att göra detta måste du utföra följande huvudsteg:

    1. Exponera klassen för COM.

    2. Åsidosätt metoden GetAutomationObject för en värdobjektklass i projektet för att returnera en instans av klassen som du exponerar för VBA.

    3. Ange egenskapen ReferenceAssemblyFromVbaProject för alla värdobjektklasser i projektet till True. Detta bäddar in anpassningssammansättningens typbibliotek i sammansättningen och lägger till en referens till typbiblioteket i VBA-projektet i dokumentet.

    Detaljerade instruktioner finns i Så här gör du: Exponera kod för VBA i ett Visual Basic-projekt och Så här gör du: Exponera kod för VBA i ett Visual C#-projekt.

    Egenskaperna EnableVbaCallers och ReferenceAssemblyFromVbaProject är endast tillgängliga i fönstret Egenskaper vid designtillfället. De kan inte användas vid körning. Om du vill visa egenskaperna öppnar du designern för ett värdobjekt i Visual Studio. Mer information om de specifika uppgifter som Visual Studio utför när du anger dessa egenskaper finns i Uppgifter som utförs av egenskaperna för värdobjektet.

Anmärkning

Om arbetsboken eller dokumentet inte redan innehåller VBA-kod eller om VBA-koden i dokumentet inte är betrodd att köra visas ett felmeddelande när du anger egenskapen EnableVbaCallers eller ReferenceAssemblyFromVbaProject till True. Det beror på att Visual Studio inte kan ändra VBA-projektet i dokumentet i den här situationen.

Använd medlemmar i VBA-kod för att anropa anpassningsmodulen

När du har konfigurerat projektet för att aktivera VBA-kod för anrop till anpassningssammansättningen lägger Visual Studio till följande medlemmar i VBA-projektet i dokumentet:

  • För alla projekt lägger Visual Studio till en global metod med namnet GetManagedClass.

  • För Visual Basic-projekt där du exponerar medlemmar i en värdobjektklass med hjälp av egenskapen EnableVbaCallers lägger Visual Studio även till en egenskap med namnet CallVSTOAssembly till modulen ThisDocument, ThisWorkbook, Sheet1, Sheet2eller Sheet3 i VBA-projektet.

    Du kan använda egenskapen CallVSTOAssembly eller GetManagedClass metoden för att komma åt offentliga medlemmar i klassen som du exponerade för VBA-kod i projektet.

Anmärkning

När du utvecklar och distribuerar din lösning finns det flera olika kopior av dokumentet där du kan lägga till VBA-koden. Mer information finns i Riktlinjer för att lägga till VBA-kod i dokumentet.

Använda egenskapen CallVSTOAssembly i ett Visual Basic-projekt

Använd egenskapen CallVSTOAssembly för att komma åt offentliga medlemmar som du har lagt till i värdobjektklassen. Följande VBA-makro anropar till exempel en metod med namnet MyVSTOMethod som definieras i Sheet1 klassen i ett Excel-arbetsboksprojekt.

Sub MyMacro()
    Sheet1.CallVSTOAssembly.MyVSTOMethod()
End Sub

Den här egenskapen är ett bekvämare sätt att anropa anpassningssammansättningen än att använda GetManagedClass metoden direkt. CallVSTOAssembly returnerar ett objekt som representerar den värdobjektklass som du exponerade för VBA. Parametrarna medlemmar och metoder för det returnerade objektet visas i IntelliSense.

Egenskapen CallVSTOAssembly har en deklaration som liknar följande kod. Den här koden förutsätter att du har exponerat värdobjektklassen Sheet1 till VBA i ett Excel-arbetsboksprojekt med namnet ExcelWorkbook1.

Property Get CallVSTOAssembly() As ExcelWorkbook1.Sheet1
    Set CallVSTOAssembly = GetManagedClass(Me)
End Property

Använda metoden GetManagedClass

Om du vill använda den globala GetManagedClass metoden skickar du in VBA-objektet som motsvarar den värdobjektklass som innehåller din åsidosättning av metoden GetAutomationObject . Använd sedan det returnerade objektet för att komma åt den klass som du exponerade för VBA.

Följande VBA-makro anropar till exempel en metod med namnet MyVSTOMethod som definieras i Sheet1 klassen värdobjekt i ett Excel-arbetsboksprojekt med namnet ExcelWorkbook1.

Sub CallVSTOMethod
    Dim VSTOSheet1 As ExcelWorkbook1.Sheet1
    Set VSTOSheet1 = GetManagedClass(Sheet1)
    VSTOSheet1.MyVSTOMethod
End Sub

Metoden GetManagedClass har följande deklaration.

GetManagedClass(pdispInteropObject Object) As Object

Den här metoden returnerar ett objekt som representerar den klass som du exponerade för VBA. Parametrarna medlemmar och metoder för det returnerade objektet visas i IntelliSense.

Riktlinjer för att lägga till VBA-kod i dokumentet

Det finns flera olika kopior av dokumentet där du kan lägga till VBA-kod som anropar till anpassning på dokumentnivå.

När du utvecklar och testar din lösning kan du skriva VBA-kod i dokumentet som öppnas när du felsöker eller kör projektet i Visual Studio (dvs. dokumentet i utdatamappen build). Men eventuell VBA-kod som du lägger till i det här dokumentet skrivs över nästa gång du skapar projektet, eftersom Visual Studio ersätter dokumentet i utdatamappen för bygget med en kopia av dokumentet från huvudprojektmappen.

Om du vill spara VBA-koden som du lägger till i dokumentet när du felsöker eller kör lösningen kopierar du VBA-koden till dokumentet i projektmappen. Mer information om byggprocessen finns i Skapa office-lösningar.

När du är redo att distribuera din lösning finns det tre huvudsakliga dokumentplatser där du kan lägga till VBA-koden.

I projektmappen på utvecklingsdatorn

Den här platsen är praktisk om du har fullständig kontroll över både VBA-koden i dokumentet och anpassningskoden. Eftersom dokumentet finns på utvecklingsdatorn kan du enkelt ändra VBA-koden om du ändrar anpassningskoden. VBA-kod som du lägger till i den här kopian av dokumentet finns kvar i dokumentet när du skapar, felsöker och publicerar din lösning.

Du kan inte lägga till VBA-koden i dokumentet när den är öppen i designern. Du måste först stänga dokumentet i designern och sedan öppna dokumentet direkt i Word eller Excel.

Försiktighet

Om du lägger till VBA-kod som körs när dokumentet öppnas kan koden i sällsynta fall skada dokumentet eller hindra det från att öppnas i designern.

I mappen publicera eller installera

I vissa fall kan det vara lämpligt att lägga till VBA-koden i dokumentet i mappen publicera eller installera. Du kan till exempel välja det här alternativet om VBA-koden skrivs och testas av en annan utvecklare på en dator som inte har Visual Studio installerat.

Om användarna installerar lösningen direkt från publiceringsmappen måste du lägga till VBA-koden i dokumentet varje gång du publicerar lösningen. Visual Studio skriver över dokumentet på publiceringsplatsen när du publicerar lösningen.

Om användarna installerar lösningen från en installationsmapp som skiljer sig från publiceringsmappen kan du undvika att lägga till VBA-koden i dokumentet varje gång du publicerar lösningen. När en publiceringsuppdatering är redo att flyttas från publiceringsmappen till installationsmappen kopierar du alla filer till installationsmappen förutom dokumentet.

På slutanvändarens dator

Om slutanvändarna är VBA-utvecklare som anropar till tjänster som du tillhandahåller i anpassningen på dokumentnivå kan du berätta för dem hur de anropar koden med hjälp CallVSTOAssembly av egenskapen eller GetManagedClass metoden i sina kopior av dokumentet. När du publicerar uppdateringar av lösningen skrivs inte VBA-kod i dokumentet på slutanvändarens dator över, eftersom dokumentet inte ändras av publiceringsuppdateringar.

Uppgifter som utförs av egenskaperna för värdobjektet

När du använder egenskaperna EnableVbaCallers och ReferenceAssemblyFromVbaProject utför Visual Studio olika uppsättningar uppgifter.

AktiveraVbaAnropare

När du anger egenskapen EnableVbaCallers för ett värdobjekt till True i ett Visual Basic-projekt utför Visual Studio följande uppgifter:

  1. Den lägger till attributen ComClassAttribute och ComVisibleAttribute i värdobjektklassen.

  2. Den åsidosätter metoden GetAutomationObject för värdobjektklassen.

  3. Den anger egenskapen ReferenceAssemblyFromVbaProject för värdobjektet till True.

    När du anger egenskapen EnableVbaCallers till False utför Visual Studio följande uppgifter:

  4. Det tar bort attributen ComClassAttribute och ComVisibleAttribute från ThisDocument klassen.

  5. Metoden GetAutomationObject tas bort från värdobjektklassen.

    Anmärkning

    Visual Studio ställer inte automatiskt in egenskapen ReferenceAssemblyFromVbaProject tillbaka till False. Du kan ange den här egenskapen till False manuellt med hjälp av fönstret Egenskaper .

ReferenceAssemblyFromVbaProject

När egenskapen ReferenceAssemblyFromVbaProject för ett värdobjekt i ett Visual Basic- eller Visual C#-projekt är inställt på Sant utför Visual Studio följande uppgifter:

  1. Det genererar ett typbibliotek för anpassningssammansättningen och bäddar in typbiblioteket i sammansättningen.

  2. Den lägger till en referens till följande typbibliotek i VBA-projektet i dokumentet:

    • Typbiblioteket för anpassningssamlingen.

    • Typbiblioteket för Microsoft Visual Studio Tools for Office Execution Engine 9.0. Det här typbiblioteket ingår i körmiljön för Visual Studio Tools for Office.

    När egenskapen ReferenceAssemblyFromVbaProject är inställd på False utför Visual Studio följande uppgifter:

  3. Den tar bort typbiblioteksreferenserna från VBA-projektet i dokumentet.

  4. Det tar bort det inbäddade typbiblioteket från sammansättningen.

Felsökning

I följande tabell visas några vanliga fel och förslag för att åtgärda felen.

Error Förslag
När du har angett egenskapen EnableVbaCallers eller ReferenceAssemblyFromVbaProject visas ett felmeddelande om att dokumentet inte innehåller något VBA-projekt eller att du inte har behörighet att komma åt VBA-projektet i dokumentet. Kontrollera att dokumentet i projektet innehåller minst ett VBA-makro, att VBA-projektet har tillräckligt med förtroende för att köras och att VBA-projektet inte skyddas av ett lösenord.
När du har angett egenskapen EnableVbaCallers eller ReferenceAssemblyFromVbaProject visas ett felmeddelande om att deklarationen GuidAttribute saknas eller är skadad. Kontrollera att deklarationen GuidAttribute finns i filen AssemblyInfo.cs eller AssemblyInfo.vb i projektet och att attributet är inställt på ett giltigt GUID.
När du har angett egenskapen EnableVbaCallers eller ReferenceAssemblyFromVbaProject visas ett felmeddelande om att versionsnumret som anges av AssemblyVersionAttribute är ogiltigt. Kontrollera att deklarationen AssemblyVersionAttribute i filen AssemblyInfo.cs eller AssemblyInfo.vb i projektet är inställd på ett giltigt versionsnummer för sammansättning. Information om giltiga sammansättningsversionsnummer finns i AssemblyVersionAttribute klassen .
När du har bytt namn på anpassningssammansättningen slutar VBA-koden som anropar till anpassningssammansättningen att fungera. Om du ändrar namnet på anpassningssammansättningen när du har exponerat den för VBA-kod bryts länken mellan VBA-projektet i dokumentet och anpassningssammansättningen. Åtgärda problemet genom att ändra egenskapen ReferenceFromVbaAssembly i projektet till False och sedan tillbaka till True och sedan ersätta alla referenser till det gamla sammansättningsnamnet i VBA-koden med det nya sammansättningsnamnet.