Łą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ę Run Application klasy .
W przypadku programu Excel wywołaj metodę Run Application 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, żeMyMacro
jest zdefiniowane w plikuSheet1
.
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 lubThisWorkbook
Sheet1
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:
Uwidaczniaj klasę com.
Zastąpi metodę GetAutomationObject klasy elementu hosta w projekcie, aby zwrócić wystąpienie klasy, która jest uwidaczniana w języku VBA.
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łuThisDocument
, ,ThisWorkbook
Sheet1
,Sheet2
lubSheet3
w projekcie VBA.Możesz użyć
CallVSTOAssembly
właściwości lubGetManagedClass
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:
ComClassAttribute Dodaje atrybuty i ComVisibleAttribute do klasy elementu hosta.
Zastępuje metodę GetAutomationObject klasy elementu hosta.
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:
Usuwa atrybuty ComClassAttribute i ComVisibleAttribute z
ThisDocument
klasy .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:
Generuje bibliotekę typów dla zestawu dostosowywania i osadza bibliotekę typów w zestawie.
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:
Usuwa odwołania do biblioteki typów z projektu VBA w dokumencie.
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. |
Powiązana zawartość
- Porady: uwidacznianie kodu w języku VBA w projekcie Visual Basic
- Porady: uwidacznianie kodu w języku VBA w projekcie Visual C#
- Przewodnik: wywoływanie kodu z języka VBA w projekcie Visual Basic
- Przewodnik: wywoływanie kodu z języka VBA w projekcie Visual C#
- Projektowanie i tworzenie rozwiązań pakietu Office
- Porównanie rozwiązań VBA i Office w programie Visual Studio
- Dostosowania na poziomie dokumentu programu