Udostępnij za pośrednictwem


Łączenie dostosowań na poziomie dokumentu i VBA

Możesz użyć kodu języka Visual Basic for Applications (VBA) w dokumencie, który jest częścią dostosowywania na poziomie dokumentu dla programu Microsoft Office Word lub Microsoft Office Excel. Kod VBA można wywołać w dokumencie z zestawu dostosowywania lub skonfigurować projekt w celu włączenia kodu VBA w dokumencie w celu wywołania kodu w zestawie dostosowywania.

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.

Zachowanie kodu VBA w dostosowywaniu na poziomie dokumentu

Po otwarciu projektu w programie Visual Studio dokument zostanie otwarty w trybie projektowania. Kod VBA nie jest uruchamiany, gdy dokument jest w trybie projektowania, więc możesz pracować nad dokumentem i kodem bez uruchamiania kodu VBA.

Po uruchomieniu rozwiązania programy obsługi zdarzeń zarówno w języku VBA, jak i zestawie dostosowywania pobierają zdarzenia, które są wywoływane w dokumencie, oraz oba zestawy uruchamiania kodu. Nie można wcześniej określić, który kod będzie uruchamiany przed drugą; Należy to określić za pomocą testowania w każdym przypadku. Możesz uzyskać nieoczekiwane wyniki, jeśli dwa zestawy kodu nie są starannie koordynowane i testowane.

Wywoływanie kodu VBA z zestawu dostosowywania

Makra można wywoływać w dokumentach programu Word i wywoływać makra i funkcje w skoroszytach programu Excel. W tym celu użyj jednej z następujących metod:

  • W przypadku programu Word wywołaj metodę RunApplication klasy .

  • W przypadku programu Excel wywołaj metodę RunApplication klasy .

    Dla każdej metody pierwszy parametr identyfikuje nazwę makra lub funkcji, którą chcesz wywołać, a pozostałe parametry opcjonalne określają parametry, które mają zostać przekazane do makra lub funkcji. Pierwszy parametr może mieć różne formaty dla programów Word i Excel:

  • W przypadku programu Word pierwszy parametr jest ciągiem, który może być dowolną kombinacją szablonu, modułu i nazwy makra. Jeśli określisz nazwę dokumentu, kod może uruchamiać makra tylko w dokumentach związanych z bieżącym kontekstem — nie tylko w żadnym makrze w żadnym dokumencie.

  • W przypadku programu Excel pierwszy parametr może być ciągiem określającym nazwę makra, wskazującą Range , gdzie jest funkcja, lub identyfikator rejestru dla zarejestrowanej funkcji DLL (XLL). Jeśli przekażesz ciąg, ciąg zostanie oceniony w kontekście aktywnego arkusza.

    Poniższy przykład kodu pokazuje, jak wywołać makro o nazwie MyMacro z projektu na poziomie dokumentu dla programu Excel. W tym przykładzie przyjęto założenie, że MyMacro jest zdefiniowane w pliku 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);

Uwaga

Aby uzyskać informacje na temat używania zmiennej globalnej missing zamiast parametrów opcjonalnych w języku Visual C#, zobacz Pisanie kodu w rozwiązaniach pakietu Office.

Wywoływanie kodu w dostosowaniach na poziomie dokumentu z poziomu VBA

Projekt na poziomie dokumentu można skonfigurować dla programu Word lub Excel, aby kod języka Visual Basic for Applications (VBA) w dokumencie mógł wywoływać kod w zestawie dostosowywania. Jest to przydatne w następujących scenariuszach:

  • Chcesz rozszerzyć istniejący kod VBA w dokumencie przy użyciu funkcji w dostosowywaniu na poziomie dokumentu skojarzonym z tym samym dokumentem.

  • Chcesz udostępnić usługi opracowywane w ramach dostosowywania na poziomie dokumentu dla użytkowników końcowych, którzy mogą uzyskiwać dostęp do usług, pisząc kod VBA w dokumencie.

    Narzędzia programistyczne pakietu Office w programie Visual Studio udostępniają podobną funkcję dodatków VSTO. Jeśli tworzysz dodatek VSTO, możesz wywołać kod w dodatku VSTO z innych rozwiązań pakietu Microsoft Office. Aby uzyskać więcej informacji, zobacz Call code in VSTO Add-ins from other Office solutions (Wywoływanie kodu w dodatku VSTO z innych rozwiązań pakietu Office).

Uwaga

Tej funkcji nie można używać w projektach szablonów programu Word. Można go używać tylko w dokumentach programu Word, skoroszycie programu Excel lub projektach szablonów programu Excel.

Wymagania

Zanim będzie można włączyć kod VBA w celu wywołania zestawu dostosowywania, projekt musi spełniać następujące wymagania:

  • Dokument musi mieć jedno z następujących rozszerzeń nazw plików:

    • Dla programu Word: .docm lub .doc

    • W przypadku programu Excel: .xlsm, .xltm, .xls lub .xlt

  • Dokument musi już zawierać projekt VBA, który ma w nim kod VBA.

  • Kod VBA w dokumencie musi być dozwolony bez monitowania użytkownika o włączenie makr. Kod VBA do uruchomienia można ufać, dodając lokalizację projektu pakietu Office do listy zaufanych lokalizacji w ustawieniach Centrum zaufania dla programu Word lub Excel.

  • Projekt pakietu Office musi zawierać co najmniej jedną klasę publiczną zawierającą co najmniej jednego publicznego członka, który ujawniasz VBA.

    Metody, właściwości i zdarzenia można uwidaczniać w języku VBA. Klasa, którą uwidaczniasz, może być klasą elementu hosta (np ThisDocument . dla programu Word lub ThisWorkbookSheet1 excel) lub inną klasą zdefiniowaną w projekcie. Aby uzyskać więcej informacji na temat elementów hosta, zobacz Omówienie elementów hosta i kontrolek hosta.

Włączanie kodu VBA w celu wywołania zestawu dostosowywania

Istnieją dwa różne sposoby uwidaczniania elementów członkowskich w zestawie dostosowywania do kodu VBA w dokumencie:

  • Możesz uwidocznić elementy członkowskie klasy elementów hosta w projekcie Visual Basic w języku VBA. W tym celu ustaw właściwość EnableVbaCallers elementu hosta na True w oknie Właściwości , gdy element hosta (czyli dokument, arkusz lub skoroszyt) jest otwarty w projektancie. Program Visual Studio automatycznie wykonuje całą pracę wymaganą do włączenia kodu VBA w celu wywołania elementów członkowskich klasy.

  • Elementy członkowskie w dowolnej klasie publicznej w projekcie Visual C# lub elementy członkowskie w klasie elementów innych niż host w projekcie Visual Basic można uwidocznić w języku VBA. Ta opcja zapewnia większą swobodę wyboru klas udostępnianych w języku VBA, ale wymaga również bardziej ręcznych kroków.

    W tym celu należy wykonać następujące główne kroki:

    1. Uwidaczniaj klasę com.

    2. Zastąpi metodę GetAutomationObject klasy elementu hosta w projekcie, aby zwrócić wystąpienie klasy, która jest uwidaczniana w języku VBA.

    3. Ustaw właściwość ReferenceAssemblyFromVbaProject dowolnej klasy elementu hosta w projekcie na true. Spowoduje to osadzenie biblioteki typów zestawu dostosowywania w zestawie i dodanie odwołania do biblioteki typów do projektu VBA w dokumencie.

    Aby uzyskać szczegółowe instrukcje, zobacz How to: Expose code to VBA in a Visual Basic project (Jak uwidaczniać kod VBA w projekcie Visual C#) i How to: Expose code to VBA in a Visual C# project (Jak uwidaczniać kod w języku VBA w projekcie Visual C#).

    Właściwości EnableVbaCallers i ReferenceAssemblyFromVbaProject są dostępne tylko w oknie Właściwości w czasie projektowania. Nie można ich używać w czasie wykonywania. Aby wyświetlić właściwości, otwórz projektanta dla elementu hosta w programie Visual Studio. Aby uzyskać więcej informacji na temat określonych zadań wykonywanych przez program Visual Studio podczas ustawiania tych właściwości, zobacz Zadania wykonywane przez właściwości elementu hosta.

Uwaga

Jeśli skoroszyt lub dokument nie zawiera jeszcze kodu VBA lub jeśli kod VBA w dokumencie nie jest zaufany do uruchomienia, podczas ustawiania właściwości EnableVbaCallers lub ReferenceAssemblyFromVbaProject zostanie wyświetlony komunikat o błędzie. Dzieje się tak, ponieważ program Visual Studio nie może zmodyfikować projektu VBA w dokumencie w tej sytuacji.

Wywoływanie zestawu dostosowywania za pomocą elementów członkowskich w kodzie VBA

Po skonfigurowaniu projektu w celu włączenia kodu VBA w celu wywołania zestawu dostosowywania program Visual Studio dodaje następujące elementy członkowskie do projektu VBA w dokumencie:

  • We wszystkich projektach program Visual Studio dodaje metodę globalną o nazwie GetManagedClass.

  • W przypadku projektów Języka Visual Basic, w których uwidaczniasz elementy członkowskie klasy elementów hosta przy użyciu właściwości EnableVbaCallers, program Visual Studio dodaje również właściwość o nazwie CallVSTOAssembly do modułu ThisDocument, , ThisWorkbookSheet1, Sheet2lub Sheet3 w projekcie VBA.

    Możesz użyć CallVSTOAssembly właściwości lub GetManagedClass metody, aby uzyskać dostęp do publicznych składowych klasy uwidocznionej w kodzie VBA w projekcie.

Uwaga

Podczas opracowywania i wdrażania rozwiązania istnieje kilka różnych kopii dokumentu, w których można dodać kod VBA. Aby uzyskać więcej informacji, zobacz Wytyczne dotyczące dodawania kodu VBA do dokumentu.

Używanie właściwości CallVSTOAssembly w projekcie Visual Basic

Użyj właściwości , CallVSTOAssembly aby uzyskać dostęp do publicznych składowych dodanych do klasy elementu hosta. Na przykład następujące makro VBA wywołuje metodę o nazwie MyVSTOMethod zdefiniowaną w klasie w Sheet1 projekcie skoroszytu programu Excel.

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

Ta właściwość jest bardziej wygodnym sposobem wywoływania zestawu dostosowywania niż bezpośredniego używania GetManagedClass metody. CallVSTOAssembly Zwraca obiekt reprezentujący klasę elementów hosta uwidocznionych w języku VBA. Elementy członkowskie i parametry metody zwróconego obiektu są wyświetlane w funkcji IntelliSense.

Właściwość CallVSTOAssembly ma deklarację podobną do poniższego kodu. W tym kodzie przyjęto założenie, że klasa Sheet1 elementów hosta została udostępniona w projekcie skoroszytu programu Excel o nazwie ExcelWorkbook1 VBA.

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

Używanie metody GetManagedClass

Aby użyć metody globalnej GetManagedClass , przekaż obiekt VBA odpowiadający klasie elementów hosta, która zawiera zastąpienie metody GetAutomationObject . Następnie użyj zwróconego obiektu, aby uzyskać dostęp do klasy uwidocznionej w języku VBA.

Na przykład następujące makro VBA wywołuje metodę o nazwie MyVSTOMethod zdefiniowaną w klasie elementów hosta w Sheet1 projekcie skoroszytu programu Excel o nazwie ExcelWorkbook1.

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

Metoda GetManagedClass ma następującą deklarację.

GetManagedClass(pdispInteropObject Object) As Object

Ta metoda zwraca obiekt reprezentujący klasę uwidocznianą w języku VBA. Elementy członkowskie i parametry metody zwróconego obiektu są wyświetlane w funkcji IntelliSense.

Wskazówki dotyczące dodawania kodu VBA do dokumentu

Istnieje kilka różnych kopii dokumentu, w których można dodać kod VBA wywołujący dostosowywanie na poziomie dokumentu.

Podczas opracowywania i testowania rozwiązania możesz napisać kod VBA w dokumencie otwierany podczas debugowania lub uruchamiania projektu w programie Visual Studio (czyli dokumentu w folderze danych wyjściowych kompilacji). Jednak każdy kod VBA dodany do tego dokumentu zostanie zastąpiony następnym razem, gdy kompilujesz 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 dodany do dokumentu podczas debugowania lub uruchamiania rozwiązania, skopiuj kod VBA do dokumentu w folderze projektu. Aby uzyskać więcej informacji na temat procesu kompilacji, zobacz Tworzenie rozwiązań pakietu Office.

Gdy wszystko będzie gotowe do wdrożenia rozwiązania, istnieją trzy główne lokalizacje dokumentów, w których można dodać kod VBA.

W folderze projektu na komputerze dewelopera

Ta lokalizacja jest wygodna, jeśli masz pełną kontrolę nad kodem VBA w dokumencie i kodzie dostosowywania. Ponieważ dokument znajduje się na komputerze dewelopera, można łatwo zmodyfikować kod VBA, jeśli zmienisz kod dostosowywania. Kod VBA dodany do tej kopii dokumentu pozostaje w dokumencie podczas kompilowania, debugowania i publikowania rozwiązania.

Nie można dodać kodu VBA do dokumentu, gdy jest on otwarty w projektancie. Musisz najpierw zamknąć dokument w projektancie, a następnie otworzyć dokument bezpośrednio w programie Word lub Excel.

Uwaga

Jeśli dodasz kod VBA uruchamiany po otwarciu dokumentu, w rzadkich przypadkach ten kod może uszkodzić dokument lub uniemożliwić jego otwarcie w projektancie.

W folderze publikowania lub instalacji

W niektórych przypadkach może być odpowiednie dodanie kodu VBA do dokumentu w folderze publikowania lub instalacji. Możesz na przykład wybrać tę opcję, jeśli kod VBA jest napisany i przetestowany przez innego dewelopera na komputerze, na którym nie zainstalowano programu Visual Studio.

Jeśli użytkownicy instalują rozwiązanie bezpośrednio z folderu publikowania, należy dodać kod VBA do dokumentu za każdym razem, gdy publikujesz rozwiązanie. Program Visual Studio zastępuje dokument w lokalizacji publikowania podczas publikowania rozwiązania.

Jeśli użytkownicy instalują rozwiązanie z folderu instalacyjnego innego niż folder publikowania, możesz uniknąć dodawania kodu VBA w dokumencie za każdym razem, gdy publikujesz rozwiązanie. Gdy aktualizacja publikowania jest gotowa do przeniesienia z folderu publikowania do folderu instalacyjnego, skopiuj wszystkie pliki do folderu instalacyjnego z wyjątkiem dokumentu.

Na komputerze użytkownika końcowego

Jeśli użytkownicy końcowi są deweloperami JĘZYKA VBA, którzy dzwonią do usług, które udostępniasz w dostosowywaniu na poziomie dokumentu, możesz poinformować ich, jak wywołać kod przy użyciu CallVSTOAssembly właściwości lub GetManagedClass metody w kopiach dokumentu. Po opublikowaniu aktualizacji rozwiązania kod VBA w dokumencie na komputerze użytkownika końcowego nie zostanie zastąpiony, ponieważ dokument nie zostanie zmodyfikowany przez aktualizacje publikowania.

Zadania wykonywane przez właściwości elementu hosta

W przypadku używania właściwości EnableVbaCallers i ReferenceAssemblyFromVbaProject program Visual Studio wykonuje różne zestawy zadań.

Enablevbacallers

Po ustawieniu właściwości EnableVbaCallers elementu hosta na True w projekcie Visual Basic program Visual Studio wykonuje następujące zadania:

  1. ComClassAttribute Dodaje atrybuty i ComVisibleAttribute do klasy elementu hosta.

  2. Zastępuje metodę GetAutomationObject klasy elementu hosta.

  3. Ustawia właściwość ReferenceAssemblyFromVbaProject elementu hosta na true.

    Po ustawieniu właściwości EnableVbaCallers z powrotem na False program Visual Studio wykonuje następujące zadania:

  4. Usuwa atrybuty ComClassAttribute i ComVisibleAttribute z ThisDocument klasy .

  5. Usuwa metodę GetAutomationObject z klasy elementu hosta.

    Uwaga

    Program Visual Studio nie ustawia automatycznie właściwości ReferenceAssemblyFromVbaProject z powrotem na wartość False. Tę właściwość można ustawić na Fałsz ręcznie przy użyciu okna Właściwości .

Referenceassemblyfromvbaproject

Gdy właściwość ReferenceAssemblyFromVbaProject dowolnego elementu hosta w projekcie Visual Basic lub Visual C# jest ustawiona na wartość True, program Visual Studio wykonuje następujące zadania:

  1. Generuje bibliotekę typów dla zestawu dostosowywania i osadza bibliotekę typów w zestawie.

  2. Dodaje odwołanie do następujących bibliotek typów w projekcie VBA w dokumencie:

    • Biblioteka typów zestawu dostosowywania.

    • Biblioteka typów aparatu wykonywania microsoft Visual Studio Tools dla pakietu Office 9.0. Ta biblioteka typów jest zawarta w środowisku uruchomieniowym Visual Studio Tools dla pakietu Office .

    Gdy właściwość ReferenceAssemblyFromVbaProject jest ustawiona na wartość False, program Visual Studio wykonuje następujące zadania:

  3. Usuwa odwołania do biblioteki typów z projektu VBA w dokumencie.

  4. Usuwa ona osadzoną bibliotekę typów z zestawu.

Rozwiązywanie problemów

W poniższej tabeli wymieniono niektóre typowe błędy i sugestie dotyczące naprawiania błędów.

Błąd Sugestia
Po ustawieniu właściwości EnableVbaCallers lub ReferenceAssemblyFromVbaProject zostanie wyświetlony komunikat o błędzie informujący, że dokument nie zawiera projektu VBA lub nie masz uprawnień dostępu do projektu VBA w dokumencie. Upewnij się, że dokument w projekcie zawiera co najmniej jedno makro VBA, projekt VBA ma wystarczającą zaufanie do uruchomienia, a projekt VBA nie jest chroniony hasłem.
Po ustawieniu właściwości EnableVbaCallers lub ReferenceAssemblyFromVbaProject zostanie wyświetlony komunikat o błędzie informujący o GuidAttribute braku lub uszkodzeniu deklaracji. Upewnij się, że GuidAttribute deklaracja znajduje się w pliku AssemblyInfo.cs lub AssemblyInfo.vb w projekcie i że ten atrybut jest ustawiony na prawidłowy identyfikator GUID.
Po ustawieniu właściwości EnableVbaCallers lub ReferenceAssemblyFromVbaProject zostanie wyświetlony komunikat o błędzie informujący, że numer wersji określony przez AssemblyVersionAttribute element jest nieprawidłowy. Upewnij się, że AssemblyVersionAttribute deklaracja w pliku AssemblyInfo.cs lub AssemblyInfo.vb w projekcie jest ustawiona na prawidłowy numer wersji zestawu. Aby uzyskać informacje o prawidłowych numerach wersji zestawu, zobacz klasę AssemblyVersionAttribute .
Po zmianie nazwy zestawu dostosowywania kod VBA wywołujący zestaw dostosowywania przestaje działać. Jeśli zmienisz nazwę zestawu dostosowywania po ujawnieniu go w kodzie VBA, połączenie między projektem VBA w dokumencie i zestawem dostosowywania zostanie przerwane. Aby rozwiązać ten problem, zmień właściwość ReferenceFromVbaAssembly w projekcie na False , a następnie z powrotem na True, a następnie zastąp wszystkie odwołania do starej nazwy zestawu w kodzie VBA nową nazwą zestawu.