Поделиться через


Пошаговое руководство. Вызов кода из VBA в проекте Visual C#

В этом пошаговом руководстве показано, как вызвать метод в настройке на уровне документа для Microsoft Office Excel из кода Visual Basic для приложений (VBA) в книге. Процедура включает три основных шага: добавьте метод в Sheet1 класс элемента хоста, обеспечьте доступ к методу для кода VBA в книге, а затем вызовите метод из кода VBA в книге.

Применимо к: Сведения в этом разделе относятся к проектам уровня документа для Excel и Word. Дополнительные сведения см. в разделе "Функции", доступные по типу приложения и проекта Office.

Хотя в этом пошаговом руководстве в частности используется Excel, основные понятия, продемонстрированные в пошаговом руководстве, также применимы к проектам на уровне документа для Word.

В этом пошаговом руководстве рассматриваются следующие задачи:

  • Создание книги, содержащей код VBA.

  • Доверие к расположению книги с помощью Центра управления безопасностью в Excel.

  • Добавление метода в Sheet1 класс элемента узла.

  • Извлечение интерфейса для класса Sheet1 хост-элемента.

  • Предоставление доступа метода коду VBA.

  • Вызов метода из кода VBA.

Замечание

Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в следующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Персонализация интегрированной среды разработки Visual Studio.

Предпосылки

Для выполнения этого пошагового руководства требуются следующие компоненты:

Создание книги, содержащей код VBA

Первым шагом является создание книги с поддержкой макросов, содержащей простой макрос VBA. Прежде чем сделать код доступным через настройку в VBA, книга должна уже содержать код VBA. В противном случае Visual Studio не может изменить проект VBA, чтобы активировать вызов кода VBA в настраиваемую сборку.

Если у вас уже есть книга, содержащая код VBA, который вы хотите использовать, можно пропустить этот шаг.

Создание книги, содержащей код VBA

  1. Запустите Excel.

  2. Сохраните активный документ как книгу Excel с поддержкой макросов (*.xlsm) под именем «WorkbookWithVBA». Сохраните его в удобном расположении, например на рабочем столе.

  3. На ленте щелкните вкладку "Разработчик ".

    Замечание

    Если вкладка "Разработчик " не отображается, необходимо сначала отобразить ее. Дополнительные сведения см. в разделе "Практическое руководство. Отображение вкладки разработчика на ленте".

  4. В группе "Код" щелкните Visual Basic.

    Откроется редактор Visual Basic.

  5. В окне проекта дважды щелкните ThisWorkbook.

    Откроется файл кода объекта ThisWorkbook .

  6. Добавьте следующий код VBA в файл кода. Этот код определяет простую функцию, которая ничего не делает. Единственной целью этой функции является обеспечение существования проекта VBA в книге. Это необходимо для последующих действий в этом пошаговом руководстве.

    Sub EmptySub()
    End Sub
    
  7. Сохраните документ и закройте Excel.

Создание проекта

Теперь вы можете создать проект уровня документа для Excel, использующий ранее созданную книгу с поддержкой макросов.

Создание проекта

  1. Запустите Visual Studio.

  2. В меню "Файл" наведите указатель мыши на "Создать" и нажмите кнопку "Проект".

  3. В области шаблонов разверните visual C#, а затем разверните Office или SharePoint.

  4. Выберите раздел надстроек Office.

  5. В списке шаблонов проектов выберите проект книга Excel 2010 или проект книга Excel 2013.

  6. В поле "Имя" введите CallingCodeFromVBA.

  7. Нажмите кнопку ОК.

    Откроется мастер создания проектов Visual Studio для Office.

  8. Выберите Копировать существующий документ, и в поле Полный путь существующего документа укажите расположение созданной ранее книги WorkbookWithVBA. Если вы используете собственную книгу с поддержкой макросов, укажите расположение этой книги.

  9. Нажмите кнопку "Готово".

    Visual Studio открывает книгу WorkbookWithVBA в конструкторе и добавляет проект CallingCodeFromVBA в обозреватель решений.

Доверять расположению книги

Прежде чем предоставить код вашего решения для доступа коду VBA в книге, необходимо разрешить выполнение VBA в книге. Это можно сделать несколькими способами. В этом пошаговом руководстве вы выполните эту задачу путем доверения расположению книги в Центре управления безопасностью в Excel.

Доверять расположению рабочей книги

  1. Запустите Excel.

  2. Перейдите на вкладку "Файл ".

  3. Нажмите кнопку "Параметры Excel ".

  4. В области категорий щелкните Центр управления безопасностью.

  5. В области сведений щелкните Параметры центра управления безопасностью.

  6. В области категорий щелкните "Надежные расположения".

  7. В области сведений нажмите кнопку "Добавить новое расположение".

  8. В диалоговом окне "Надежное расположение Microsoft Office" перейдите к папке, содержащей проект CallingCodeFromVBA .

  9. Выберите вложенные папки этого расположения также являются доверенными.

  10. В диалоговом окне "Надежное расположение Microsoft Office" нажмите кнопку "ОК".

  11. В диалоговом окне "Центр управления безопасностью" нажмите кнопку "ОК".

  12. В диалоговом окне "Параметры Excel " нажмите кнопку "ОК".

  13. Выйти из Excel.

Добавление метода в класс Sheet1

Теперь, когда проект VBA настроен, добавьте открытый метод в Sheet1 класс элемента узла, который можно вызвать из кода VBA.

Добавление метода в класс Sheet1

  1. В обозревателе решений щелкните правой кнопкой мыши Sheet1.cs и выберите команду "Просмотреть код".

    Файл Sheet1.cs откроется в редакторе кода.

  2. Добавьте следующий код в Sheet1 класс. Метод CreateVstoNamedRange создает новый NamedRange объект в указанном диапазоне. Этот метод также создает обработчик для события Selected объекта NamedRange. Далее в этом пошаговом руководстве вы вызовете CreateVstoNamedRange метод из кода VBA в документе.

    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. Добавьте приведенный ниже метод в класс Sheet1. Этот метод переопределяет метод GetAutomationObject, чтобы вернуть текущий экземпляр класса Sheet1.

    protected override object GetAutomationObject()
    {
        return this;
    }
    
  4. Примените следующие атрибуты перед первой строкой Sheet1 объявления класса. Эти атрибуты делают класс видимым для COM, но без создания интерфейса класса.

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

Извлечение интерфейса для класса Sheet1

Прежде чем сделать метод CreateVstoNamedRange доступным для кода VBA, необходимо создать публичный интерфейс, определяющий этот метод, и предоставить этот интерфейс для COM.

Извлечение интерфейса для класса Sheet1

  1. В файле кода Sheet1.cs щелкните в любом месте Sheet1 класса.

  2. В меню Рефакторинг нажмите кнопку "Извлечь интерфейс".

  3. В диалоговом окне "Извлечение интерфейса" в поле Выбор общедоступных членов для формирования интерфейса щелкните запись для метода CreateVstoNamedRange.

  4. Нажмите кнопку ОК.

    Visual Studio создает новый интерфейс с именем ISheet1и изменяет определение Sheet1 класса таким образом, чтобы он реализовал ISheet1 интерфейс. Visual Studio также открывает файл ISheet1.cs в редакторе кода.

  5. В файле ISheet1.cs замените ISheet1 объявление интерфейса следующим кодом. Этот код делает ISheet1 интерфейс общедоступным, и он применяет ComVisibleAttribute атрибут, чтобы сделать интерфейс видимым для COM.

    [System.Runtime.InteropServices.ComVisible(true)]
    public interface ISheet1
    {
        void CreateVstoNamedRange(Microsoft.Office.Interop.Excel.Range range, string name);
    }
    
  6. Создайте проект.

Открыть метод для кода VBA

Чтобы сделать метод доступным для кода VBA в книге, задайте для свойства ReferenceAssemblyFromVbaProject хост-элемента Sheet1 значение True.

Предоставить метод для использования в коде VBA

  1. В обозревателе решений дважды щелкните Sheet1.cs.

    Файл WorkbookWithVBA открывается в конструкторе с видимым листом 1.

  2. В окне свойств выберите свойство ReferenceAssemblyFromVbaProject и измените значение true.

  3. Нажмите кнопку "ОК " в отображаемом сообщении.

  4. Создайте проект.

Вызов метода из кода VBA

Теперь вы можете вызвать метод CreateVstoNamedRange из кода VBA в книге.

Замечание

В этом пошаговом руководстве вы добавите код VBA в книгу при отладке проекта. Код VBA, добавленный в этот документ, будет перезаписан при следующем создании проекта, так как Visual Studio заменяет документ в выходной папке сборки копией документа из основной папки проекта. Если вы хотите сохранить код VBA, его можно скопировать в документ в папке проекта. Дополнительные сведения см. в разделе "Объединение настроек VBA и уровня документа".

Вызов метода из кода VBA

  1. Нажмите клавишу F5 , чтобы запустить проект.

  2. На вкладке "Разработчик" в группе "Код " щелкните Visual Basic.

    Откроется редактор Visual Basic.

  3. В меню "Вставка " нажмите кнопку "Модуль".

  4. Добавьте следующий код в новый модуль.

    Этот код вызывает метод CreateTable в сборке кастомизации. Макрос обращается к этому методу с помощью глобального GetManagedClass метода для доступа к классу элемента хоста Sheet1, который вы представили коду VBA. Метод GetManagedClass был автоматически создан при установке свойства ReferenceAssemblyFromVbaProject ранее в этом пошаговом руководстве.

    Sub CallVSTOMethod()
        Dim VSTOSheet1 As CallingCodeFromVBA.Sheet1
        Set VSTOSheet1 = GetManagedClass(Sheet1)
        Call VSTOSheet1.CreateVstoNamedRange(Sheet1.Range("A1"), "VstoNamedRange")
    End Sub
    
  5. Нажмите клавишу F5.

  6. В открываемой книге щелкните ячейку A1 на листе 1. Убедитесь, что появится поле сообщения.

  7. Выйдите из Excel без сохранения изменений.

Дальнейшие шаги

Дополнительные сведения о вызове кода в решениях Office из VBA см. в следующих разделах: