Dela via


Genomgång: Anropa kod från VBA i ett Visual C#-projekt

Den här genomgången visar hur du anropar en metod i en anpassning på dokumentnivå för Microsoft Office Excel från VBA-kod (Visual Basic for Applications) i arbetsboken. Proceduren omfattar tre grundläggande steg: lägga till en metod i Sheet1 klassen värdobjekt, exponera metoden för VBA-kod i arbetsboken och anropa sedan metoden från VBA-koden i arbetsboken.

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.

Även om den här genomgången använder Excel specifikt gäller de begrepp som visas i genomgången även för projekt på dokumentnivå för Word.

I den här genomgången tas följande aktiviteter upp:

  • Skapa en arbetsbok som innehåller VBA-kod.

  • Ange platsen för arbetsboken som betrodd plats med hjälp av Betrodd plats i Excel.

  • Lägga till en metod i värdobjektklassen Sheet1 .

  • Extrahera ett gränssnitt för värdobjektklassen Sheet1 .

  • Exponera metoden till VBA-kod.

  • Anropa metoden från VBA-kod.

Anmärkning

Datorn kan visa olika namn eller platser för vissa av Visual Studio-användargränssnittselementen i följande instruktioner. Den Visual Studio-utgåva som du har och de inställningar som du använder avgör dessa element. Mer information finns i Anpassa Visual Studio IDE.

Förutsättningar

Du behöver följande komponenter för att slutföra den här genomgången:

Skapa en arbetsbok som innehåller VBA-kod

Det första steget är att skapa en makroaktiverad arbetsbok som innehåller ett enkelt VBA-makro. Innan du kan exponera kod i en anpassning till VBA måste arbetsboken redan innehålla VBA-kod. Annars kan Visual Studio inte ändra VBA-projektet för att aktivera VBA-kod för att anropa anpassningssammansättningen.

Om du redan har en arbetsbok som innehåller VBA-kod som du vill använda kan du hoppa över det här steget.

Skapa en arbetsbok som innehåller VBA-kod

  1. Starta Excel.

  2. Spara det aktiva dokumentet som en Excel Macro-Enabled-arbetsbok (*.xlsm) med namnet WorkbookWithVBA. Spara den på en lämplig plats, till exempel skrivbordet.

  3. Klicka på fliken Utvecklare i menyfliksområdet.

    Anmärkning

    Om fliken Utvecklare inte visas måste du först visa den. Mer information finns i Så här: Visa fliken Utvecklare i menyfliksområdet.

  4. I gruppen Kod klickar du på Visual Basic.

    Visual Basic-redigeraren öppnas.

  5. Dubbelklicka på ThisWorkbook i projektfönstret.

    Kodfilen för ThisWorkbook objektet öppnas.

  6. Lägg till följande VBA-kod i kodfilen. Den här koden definierar en enkel funktion som inte gör någonting. Det enda syftet med den här funktionen är att säkerställa att ett VBA-projekt finns i arbetsboken. Detta krävs för senare steg i den här genomgången.

    Sub EmptySub()
    End Sub
    
  7. Spara dokumentet och avsluta Excel.

Skapa projektet

Nu kan du skapa ett projekt på dokumentnivå för Excel som använder den makroaktiverade arbetsboken som du skapade tidigare.

Skapa ett nytt projekt

  1. Starta Visual Studio.

  2. Peka på NyttArkiv-menyn och klicka sedan på Projekt.

  3. I fönstret Mallar expanderar du Visual C#och expanderar sedan Office/SharePoint.

  4. Välj noden Office-tillägg .

  5. I listan över projektmallar väljer du Excel 2010-arbetsboken eller Excel 2013-arbetsboksprojektet .

  6. I rutan Namn skriver du CallingCodeFromVBA.

  7. Klicka på OK.

    Visual Studio Tools for Office-projektguiden öppnas.

  8. Välj Kopiera ett befintligt dokument och ange platsen för arbetsbokenWithVBA som du skapade tidigare i rutan Fullständig sökväg till det befintliga dokumentet. Om du använder en egen makroaktiverad arbetsbok anger du arbetsbokens plats i stället.

  9. Klicka på Finish.

    Visual Studio öppnar arbetsboken WorkbookWithVBA i designern och lägger till CallingCodeFromVBA-projektet i Solution Explorer.

Lita på arbetsbokens plats

Innan du kan exponera kod i lösningen för VBA-kod i arbetsboken måste du tillåta att VBA i arbetsboken körs. Det finns flera sätt att göra detta på. I den här genomgången utför du den här uppgiften genom att lita på arbetsbokens plats i Säkerhetscenter i Excel.

Att lita på arbetsbokens plats

  1. Starta Excel.

  2. Klicka på fliken Arkiv .

  3. Klicka på knappen Excel-alternativ .

  4. I fönstret Kategorier klickar du på Säkerhetscenter.

  5. I informationsfönstret klickar du på Inställningar för säkerhetscenter.

  6. I kategorifönstret klickar du på Betrodda platser.

  7. I informationsfönstret klickar du på Lägg till ny plats.

  8. I dialogrutan Betrodd plats för Microsoft Office bläddrar du till mappen som innehåller CallingCodeFromVBA-projektet .

  9. Välj Undermappar på den här platsen är också betrodda.

  10. I dialogrutan Betrodd plats för Microsoft Office klickar du på OK.

  11. I dialogrutan Säkerhetscenter klickar du på OK.

  12. I dialogrutan Excel-alternativ klickar du på OK.

  13. Avsluta Excel.

Lägga till en metod i klassen Sheet1

Nu när VBA-projektet har konfigurerats lägger du till en offentlig metod i den Sheet1 värdobjektklass som du kan anropa från VBA-kod.

Så här lägger du till en metod i klassen Sheet1

  1. Högerklicka på Sheet1.cs i Solution Explorer och klicka sedan på Visa kod.

    Filen Sheet1.cs öppnas i kodredigeraren.

  2. Lägg till följande kod i Sheet1 klassen. Metoden CreateVstoNamedRange skapar ett nytt NamedRange objekt i det angivna intervallet. Den här metoden skapar också en händelsehanterare för Selected händelsen för NamedRange. Senare i den här genomgången kommer du att anropa metoden CreateVstoNamedRange från VBA-koden i dokumentet.

    private Microsoft.Office.Tools.Excel.NamedRange namedRange1;
    
    public void CreateVstoNamedRange(Excel.Range range, string name)
    {
        if (!this.Controls.Contains(name))
        {
            namedRange1 = this.Controls.AddNamedRange(range, name);
            namedRange1.Selected += new Excel.DocEvents_SelectionChangeEventHandler(
                    namedRange1_Selected);
        }
        else
        {
            MessageBox.Show("A named range with this specific name " +
                "already exists on the worksheet.");
        }
    }
    
    private void namedRange1_Selected(Microsoft.Office.Interop.Excel.Range Target)
    {
        MessageBox.Show("This named range was created by Visual Studio " +
            "Tools for Office.");
    }
    
  3. Lägg till följande metod i Sheet1 klassen. Den här metoden åsidosätter GetAutomationObject metoden för att returnera den aktuella instansen Sheet1 av klassen.

    protected override object GetAutomationObject()
    {
        return this;
    }
    
  4. Använd följande attribut före den första raden i klassdeklarationen Sheet1 . Dessa attribut gör klassen synlig för COM, men utan att generera ett klassgränssnitt.

    [System.Runtime.InteropServices.ComVisible(true)]
    [System.Runtime.InteropServices.ClassInterface(
        System.Runtime.InteropServices.ClassInterfaceType.None)]
    

Extrahera ett gränssnitt för klassen Sheet1

Innan du kan exponera CreateVstoNamedRange metoden för VBA-kod måste du skapa ett offentligt gränssnitt som definierar den här metoden, och du måste exponera det här gränssnittet för COM.

Extrahera ett gränssnitt för klassen Sheet1

  1. I kodfilen Sheet1.cs klickar du var som helst i Sheet1 klassen.

  2. Refaktormenyn klickar du på Extrahera gränssnitt.

  3. I dialogrutan Extrahera gränssnitt i rutan Välj offentliga medlemmar för att bilda gränssnitt klickar du på posten för CreateVstoNamedRange metoden.

  4. Klicka på OK.

    Visual Studio genererar ett nytt gränssnitt med namnet ISheet1och ändrar definitionen av Sheet1 klassen så att den implementerar ISheet1 gränssnittet. Visual Studio öppnar också filen ISheet1.cs i kodredigeraren.

  5. I filen ISheet1.cs ersätter du gränssnittsdeklarationen ISheet1 med följande kod. Den här koden gör ISheet1 gränssnittet offentligt och använder ComVisibleAttribute attributet för att göra gränssnittet synligt för COM.

    [System.Runtime.InteropServices.ComVisible(true)]
    public interface ISheet1
    {
        void CreateVstoNamedRange(Microsoft.Office.Interop.Excel.Range range, string name);
    }
    
  6. Skapa projektet.

Exponera metoden för VBA-kod

Om du vill exponera CreateVstoNamedRange metoden för VBA-kod i arbetsboken anger du egenskapen ReferenceAssemblyFromVbaProject för Sheet1 värdobjektet till Sant.

Så här exponerar du metoden för VBA-kod

  1. Dubbelklicka på Sheet1.cs i Solution Explorer.

    Filen WorkbookWithVBA öppnas i designern med Sheet1 synligt.

  2. I fönstret Egenskaper väljer du egenskapen ReferenceAssemblyFromVbaProject och ändrar värdet till Sant.

  3. Klicka på OK i meddelandet som visas.

  4. Skapa projektet.

Anropa metoden från VBA-kod

Nu kan du anropa CreateVstoNamedRange metoden från VBA-koden i arbetsboken.

Anmärkning

I den här genomgången lägger du till VBA-kod i arbetsboken när du felsöker projektet. VBA-koden 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 kan du kopiera den till dokumentet i projektmappen. Mer information finns i Kombinera VBA- och dokumentnivåanpassningar.

Anropa metoden från VBA-kod

  1. Tryck på F5 för att köra projektet.

  2. Klicka på Visual Basic i gruppen Kod på fliken Utvecklare.

    Visual Basic-redigeraren öppnas.

  3. menyn Infoga klickar du på Modul.

  4. Lägg till följande kod i den nya modulen.

    Den här koden anropar CreateTable metoden i anpassningssammansättningen. Makrot använder den här metoden med hjälp av den globala GetManagedClass metoden för att komma åt den Sheet1 värdobjektklass som du exponerade för VBA-kod. Metoden GetManagedClass genererades automatiskt när du angav egenskapen ReferenceAssemblyFromVbaProject tidigare i den här genomgången.

    Sub CallVSTOMethod()
        Dim VSTOSheet1 As CallingCodeFromVBA.Sheet1
        Set VSTOSheet1 = GetManagedClass(Sheet1)
        Call VSTOSheet1.CreateVstoNamedRange(Sheet1.Range("A1"), "VstoNamedRange")
    End Sub
    
  5. Tryck på F5.

  6. I den öppna arbetsboken klickar du på cell A1Blad1. Kontrollera att meddelanderutan visas.

  7. Avsluta Excel utan att spara ändringarna.

Nästa steg

Du kan lära dig mer om att anropa kod i Office-lösningar från VBA i följande avsnitt: