Udostępnij za pośrednictwem


Przewodnik: wywoływanie kodu z języka VBA w projekcie Visual C#

W tym przewodniku pokazano, jak wywołać metodę w dostosowywaniu na poziomie dokumentu dla programu Microsoft Office Excel z poziomu programu Visual Basic for Applications (VBA) w skoroszycie. Procedura obejmuje trzy podstawowe kroki: dodanie metody do klasy elementu hosta, uwidocznienie metody do Sheet1 kodu VBA w skoroszycie, a następnie wywołanie metody z kodu VBA w skoroszycie.

Dotyczy: informacje w tym temacie dotyczą projektów na poziomie dokumentu dla programów Excel i Word. Aby uzyskać więcej informacji, zobacz Funkcje dostępne przez aplikacja pakietu Office lication i typ projektu.

Mimo że ten przewodnik używa programu Excel specjalnie, koncepcje przedstawione w przewodniku mają również zastosowanie do projektów na poziomie dokumentu dla programu Word.

W instruktażu przedstawiono następujące zagadnienia:

  • Tworzenie skoroszytu zawierającego kod VBA.

  • Ufanie lokalizacji skoroszytu przy użyciu Centrum zaufania w programie Excel.

  • Dodawanie metody do Sheet1 klasy elementu hosta.

  • Wyodrębnianie interfejsu Sheet1 dla klasy elementu hosta.

  • Uwidacznianie metody w kodzie VBA.

  • Wywoływanie metody z kodu VBA.

Uwaga

Na komputerze w poniższych instrukcjach mogą być wyświetlane inne nazwy i lokalizacje niektórych elementów interfejsu użytkownika programu Visual Studio. Te elementy są określane przez numer wersji Visual Studio oraz twoje ustawienia. Aby uzyskać więcej informacji, zobacz Personalizowanie środowiska IDE programu Visual Studio.

Wymagania wstępne

Następujące składniki są wymagane do przeprowadzenia tego instruktażu:

Tworzenie skoroszytu zawierającego kod VBA

Pierwszym krokiem jest utworzenie skoroszytu z obsługą makr, który zawiera proste makro VBA. Aby można było uwidocznić kod w dostosowaniu do języka VBA, skoroszyt musi już zawierać kod VBA. W przeciwnym razie program Visual Studio nie może zmodyfikować projektu VBA, aby umożliwić wywołanie kodu VBA do zestawu dostosowywania.

Jeśli masz już skoroszyt zawierający kod VBA, którego chcesz użyć, możesz pominąć ten krok.

Aby utworzyć skoroszyt zawierający kod VBA

  1. Uruchom program Excel.

  2. Zapisz aktywny dokument jako skoroszyt z obsługą makr programu Excel (*.xlsm) o nazwie WorkbookWithVBA. Zapisz go w dogodnej lokalizacji, takiej jak pulpit.

  3. Na wstążce kliknij kartę Deweloper .

    Uwaga

    Jeśli karta Deweloper nie jest widoczna, musisz go najpierw wyświetlić. Aby uzyskać więcej informacji, zobacz Instrukcje: pokazywanie karty dewelopera na wstążce.

  4. W grupie Kod kliknij pozycję Visual Basic.

    Zostanie otwarty Edytor Visual Basic.

  5. W oknie Projekt kliknij dwukrotnie ten elementWorkbook.

    Zostanie otwarty plik kodu dla ThisWorkbook obiektu.

  6. Dodaj następujący kod VBA do pliku kodu. Ten kod definiuje prostą funkcję, która nic nie robi. Jedynym celem tej funkcji jest upewnienie się, że w skoroszycie istnieje projekt VBA. Jest to wymagane w przypadku dalszych kroków w tym przewodniku.

    Sub EmptySub()
    End Sub
    
  7. Zapisz dokument i zamknij program Excel.

Tworzenie projektu

Teraz możesz utworzyć projekt na poziomie dokumentu dla programu Excel, który używa utworzonego wcześniej skoroszytu z obsługą makr.

Aby utworzyć nowy projekt

  1. Uruchom program Visual Studio.

  2. W menu Plik wskaż polecenie Nowy, a następnie kliknij pozycję Projekt.

  3. W okienku szablonów rozwiń węzeł Visual C#, a następnie rozwiń węzeł Office/SharePoint.

  4. Wybierz węzeł Dodatki pakietu Office.

  5. Na liście szablonów projektów wybierz projekt Skoroszyt programu Excel 2010 lub Skoroszyt programu Excel 2013.

  6. W polu Nazwa wpisz CallingCodeFromVBA.

  7. Kliknij przycisk OK.

    Zostanie otwarty Kreator projektu Visual Studio Tools dla pakietu Office.

  8. Wybierz pozycję Kopiuj istniejący dokument, a następnie w polu Pełna ścieżka istniejącego dokumentu określ lokalizację utworzonego wcześniej skoroszytu SkoroszytWithVBA. Jeśli używasz własnego skoroszytu obsługującego makra, określ lokalizację tego skoroszytu.

  9. Kliknij przycisk Zakończ.

    Program Visual Studio otwiera skoroszyt WorkbookWithVBA w projektancie i dodaje projekt CallingCodeFromVBA do Eksplorator rozwiązań.

Ufaj lokalizacji skoroszytu

Aby uwidocznić kod w rozwiązaniu do kodu VBA w skoroszycie, musisz ufać skryptowi VBA w skoroszycie, aby go uruchomić. Może to być realizowane na kilka sposobów. W tym przewodniku wykonasz to zadanie, ufając lokalizacji skoroszytu w Centrum zaufania w programie Excel.

Aby ufać lokalizacji skoroszytu

  1. Uruchom program Excel.

  2. Kliknij kartę Plik .

  3. Kliknij przycisk Opcje programu Excel.

  4. W okienku kategorii kliknij pozycję Centrum zaufania.

  5. W okienku szczegółów kliknij pozycję Centrum zaufania Ustawienia.

  6. W okienku kategorii kliknij pozycję Zaufane lokalizacje.

  7. W okienku szczegółów kliknij pozycję Dodaj nową lokalizację.

  8. W oknie dialogowym Zaufana lokalizacja pakietu Microsoft Office przejdź do folderu zawierającego projekt CallingCodeFromVBA.

  9. Wybierz pozycję Podfoldery tej lokalizacji są również zaufane.

  10. W oknie dialogowym Zaufana lokalizacja pakietu Microsoft Office kliknij przycisk OK.

  11. W centrum zaufania okno dialogowe, kliknij przycisk OK.

  12. W oknie dialogowym Opcje programu Excel kliknij przycisk OK.

  13. Zamknij program Excel.

Dodawanie metody do klasy Sheet1

Po skonfigurowaniu projektu VBA dodaj publiczną metodę do Sheet1 klasy elementów hosta, którą można wywołać z kodu VBA.

Aby dodać metodę do klasy Sheet1

  1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy plik Sheet1.cs, a następnie kliknij polecenie Wyświetl kod.

    Plik Sheet1.cs zostanie otwarty w Edytorze kodu.

  2. Dodaj poniższy kod do klasy Sheet1. Metoda CreateVstoNamedRange tworzy nowy NamedRange obiekt w określonym zakresie. Ta metoda tworzy również procedurę obsługi zdarzeń dla Selected zdarzenia NamedRange. W dalszej części tego przewodnika wywołasz metodę CreateVstoNamedRange z kodu VBA w dokumencie.

    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. Dodaj następującą metodę do Sheet1 klasy . Ta metoda zastępuje metodę GetAutomationObject , aby zwrócić bieżące wystąpienie Sheet1 klasy.

    protected override object GetAutomationObject()
    {
        return this;
    }
    
  4. Zastosuj następujące atrybuty przed pierwszym wierszem Sheet1 deklaracji klasy. Te atrybuty sprawiają, że klasa jest widoczna dla modelu COM, ale bez generowania interfejsu klasy.

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

Wyodrębnianie interfejsu dla klasy Sheet1

Zanim będzie można uwidocznić metodę CreateVstoNamedRange w kodzie VBA, należy utworzyć publiczny interfejs definiujący tę metodę i należy uwidocznić ten interfejs w modelu COM.

Aby wyodrębnić interfejs dla klasy Sheet1

  1. W pliku kodu Sheet1.cs kliknij dowolne miejsce w Sheet1 klasie.

  2. W menu Refaktoryzacja kliknij pozycję Wyodrębnij interfejs.

  3. W oknie dialogowym Wyodrębnij interfejs w oknie dialogowym Wybieranie publicznych elementów członkowskich do utworzenia interfejsu kliknij wpis dla CreateVstoNamedRange metody .

  4. Kliknij przycisk OK.

    Program Visual Studio generuje nowy interfejs o nazwie ISheet1i modyfikuje definicję Sheet1 klasy, tak aby implementował ISheet1 interfejs. Program Visual Studio otwiera również plik ISheet1.cs w Edytorze kodu.

  5. W pliku ISheet1.cs zastąp deklarację interfejsu ISheet1 następującym kodem. Ten kod sprawia, że ISheet1 interfejs jest publiczny i stosuje ComVisibleAttribute atrybut, aby interfejs był widoczny dla modelu COM.

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

Uwidaczniaj metodę w kodzie VBA

Aby uwidocznić metodę CreateVstoNamedRange w kodzie VBA w skoroszycie, ustaw właściwość ReferenceAssemblyFromVbaProject dla Sheet1 elementu hosta na true.

Aby uwidocznić metodę w kodzie VBA

  1. W Eksplorator rozwiązań kliknij dwukrotnie plik Sheet1.cs.

    Plik WorkbookWithVBA zostanie otwarty w projektancie z widocznym arkuszem Sheet1.

  2. W oknie Właściwości wybierz właściwość ReferenceAssemblyFromVbaProject i zmień wartość na True.

  3. Kliknij przycisk OK w wyświetlonym komunikacie.

  4. Skompiluj projekt.

Wywoływanie metody z kodu VBA

Teraz możesz wywołać metodę CreateVstoNamedRange z kodu VBA w skoroszycie.

Uwaga

W tym przewodniku do skoroszytu zostanie dodany kod VBA podczas debugowania projektu. Kod VBA dodany do tego dokumentu zostanie zastąpiony następnym razem, gdy skompilujesz projekt, ponieważ program Visual Studio zastępuje dokument w folderze wyjściowym kompilacji kopią dokumentu z głównego folderu projektu. Jeśli chcesz zapisać kod VBA, możesz skopiować go do dokumentu w folderze projektu. Aby uzyskać więcej informacji, zobacz Łączenie dostosowań języka VBA i dostosowywania na poziomie dokumentu.

Aby wywołać metodę z kodu VBA

  1. Naciśnij klawisz F5 , aby uruchomić projekt.

  2. Na karcie Deweloper w grupie Kod kliknij pozycję Visual Basic.

    Zostanie otwarty Edytor Visual Basic.

  3. W menu Wstawianie kliknij pozycję Moduł.

  4. Dodaj następujący kod do nowego modułu.

    Ten kod wywołuje metodę CreateTable w zestawie dostosowywania. Makro uzyskuje dostęp do tej metody przy użyciu metody globalnej GetManagedClass w celu uzyskania dostępu do klasy elementów hosta uwidocznionej Sheet1 w kodzie VBA. Metoda GetManagedClass została wygenerowana automatycznie podczas ustawiania właściwości ReferenceAssemblyFromVbaProject wcześniej w tym przewodniku.

    Sub CallVSTOMethod()
        Dim VSTOSheet1 As CallingCodeFromVBA.Sheet1
        Set VSTOSheet1 = GetManagedClass(Sheet1)
        Call VSTOSheet1.CreateVstoNamedRange(Sheet1.Range("A1"), "VstoNamedRange")
    End Sub
    
  5. Naciśnij klawisz F5.

  6. W otwartym skoroszycie kliknij komórkę A1 w arkuszu 1. Sprawdź, czy zostanie wyświetlone okno komunikatu.

  7. Zamknij program Excel bez zapisywania zmian.

Następne kroki

Więcej informacji na temat wywoływania kodu w rozwiązaniach pakietu Office można znaleźć w języku VBA w następujących tematach: