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


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

В данном пошаговом руководстве описывается процесс вызова метода в настройках уровня документа из кода VBA книги для Microsoft Office Excel.Данная процедура состоит из трех основных этапов: добавления метода к классу ведущего элемента Sheet1, представления метода коду VBA в книге и вызова метода из кода VBA в книге.

Применение. Сведения этого раздела применяются к проектам уровня документа для следующих приложений: Excel 2013 и Excel 2010; Word 2013 и Word 2010. Дополнительные сведения см. в разделе Доступность функций по типам приложений Office и проектов.

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

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

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

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

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

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

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

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

ПримечаниеПримечание

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

Обязательные компоненты

Ниже приведены компоненты, необходимые для выполнения данного пошагового руководства.

-

Выпуск Visual Studio 2012, включающий инструменты разработчика Microsoft Office. Дополнительные сведения см. в разделе [Настройка компьютера для разработки решений Office](bb398242\(v=vs.110\).md).
  • Excel 2013 или Excel 2010.

Создание книги, содержащей код 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. Выберите узел Добавить- ins office.

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

  6. В диалоговом окне Имя введите CallingCodeFromVBA.

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

    Откроется вкладка Мастер проектов Visual Studio Tools for 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 нажмите кнопку OK.

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

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

  13. Закройте Excel.

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

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

Для того чтобы добавить метод к классу Sheet1, выполните следующие действия.

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

    В редакторе кода откроется файл Sheet1.cs.

  2. Добавьте в класс Sheet1 следующий код.Метод CreateVstoNamedRange создает новый объект NamedRange в указанном диапазоне.В ходе выполнения данного метода, также создается обработчик событий для SelectedNamedRange.Позже в данном пошаговом руководстве мы рассмотрим процесс вызова метода 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 необходимо создать открытый интерфейс, определяющий данный метод; этот интерфейс необходимо представить СОМ.

Чтобы извлечь интерфейс для класса 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

Для того чтобы преобразовывать метод CreateVstoNamedRange в код VBA в книге, для ведущего элемента Sheet1 в свойстве ReferenceAssemblyFromVbaProject установите значение 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. Открывается книга. В Листе1 нажмите ячейку A1.Проверьте, появилось ли окно сообщения.

  7. Закройте Excel без сохранения изменений.

Следующие действия

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

См. также

Задачи

Практическое руководство. Предоставление доступа к коду со стороны VBA в проекте Visual Basic

Практическое руководство. Предоставление доступа к коду со стороны VBA в проекте Visual C#

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

Другие ресурсы

Объединение настроек VBA и настроек на уровне документа

Настройки программирования уровня документа