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


Пошаговое руководство. Вызов кода из 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. Щелкните OK.

    Откроется Мастер проектов набора средств 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. Щелкните OK.

    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

Для предоставления метода CreateVstoNamedRange коду VBA в книге установите для свойства ReferenceAssemblyFromVbaProject значения для ведущего элемента Sheet1 значение True.

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

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

    Файл WorkbookWithVBA открывается в конструкторе, и отображается Sheet1.

  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 на листе Sheet1. Убедитесь, что появляется окно сообщения.

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

Следующие шаги

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