Программирование MS Excel
Программирование MS Excel / Статьи /
Создание надстроек в Microsoft Excel 97


Описание:
процесс создания простой надстройки MS Excel. Приводятся детальные инструкции и полный текст примера.

Содержание:

Введение

   Надстройка Microsoft Excel - это книга с расширением .xla. Надстройки являются идеальным способом хранения и распространения завершенных приложений, пользовательских функций и утилит. Преимущества распространения решений в виде надстроек следующие:
  • Программа VBA в надстройке компилируется перед сохранением файла. Код в нормальной рабочей книге не компилируется до запуска программы. А так как надстройка скомпилирована заблаговременно, то она и работает быстрее.
  • Код надстройки может быть скрыт, предотвращая просмотр и изменение пользователем.
  • Листы в надстройке скрыты, позволяя хранить формулы и данные скрытыми от пользователей.
  • Код надстройки не может быть попущен с помощью удержания SHIFT во время загрузки. Это даёт гарантию того, что Ваш инициализационный код будет выполнен в любом случае.
Эта статья разъясняет, как создать надстройку, которая должна выполнить следующее:
  • Добавить комманду Report в маню Сервис (Tools) в Excel'е.
  • Открыть файл шаблона Excel.
  • Использовать запрос Access 97 для импорта данных из базы данных Борей (пример Access 97) и добавить в шаблон Excel.
   По умолчанию, надстройки инсталлируются в папку \Program Files\Microsoft Office\Office\Library. Загрузка надстрйки делает доступными в Excel'е характерные функции и помащает связанные комманды в соответствующие меню.
   Щелчок комманды Report в меню Сервис (Tools) запускает надстройку Отчет продаж продуктов, описываемую в этой статье. Следующий раздел опивывает, как добавить комманду Report в пользовательский интерфейс Excel.

Добавление комманды в меню Сервис (Tools)

   (Примечание: этот код не будет работать, пока вы не установите надстройку, как это сделать - описано ниже)
  1. В Excel'е нажмите ALT+F11 для запуска редактора Visual Basic.
  2. В окне проекта дважды щелкните ThisWorkbook. скопируйте следующую процедуру события в модуль ThisWorkbook:
  3. Option Explicit
    Private Sub Workbook_AddinInstall()
    ' This procedure adds an item to the Tools 
    ' menu on the worksheet menu bar.
    
        ' This will be set to the Tools menu.
        Dim objCmdBrPp As CommandBarPopup
        ' This will be set to the Project menu item.
        Dim objCmdBtn As CommandBarButton
        
        ' Create an object variable referring 
        ' to the Tools menu.
        Set objCmdBrPp = Application.CommandBars _
                ("Worksheet Menu Bar").Controls("Tools")
        ' Add a command in the fourth position
        ' on the Tools menu.
        On Error Resume Next
        ' This generates a run-time error if 
        ' the menu item is absent.
        Set objCmdBtn = objCmdBrPp.Controls("Report")
        ' If a run-time error is generated,
        ' add the menu item.
        If Err.Number <> 0 Then
            Set objCmdBtn = objCmdBrPp.Controls.Add _
                    (Type:=msoControlButton, before:=4)
        End If
        ' Disables the error handler.
        On Error GoTo 0
        
        ' Set properties for the new menu item.
        With objCmdBtn
            .Caption = "Report"
            .OnAction = "AddInCode.Master"
        End With
    
    End Sub
    
    Private Sub Workbook_AddinUninstall()
    ' This procedure deletes an item on the Tools 
    ' menu on the worksheet menu bar.
    
        ' If the Project command exists, delete it.
        On Error Resume Next
        Application.CommandBars("Worksheet Menu Bar") _
               .Controls("Tools").Controls("Report").Delete
    End Sub
    
Комментарии к коду

   События AddinInstall и AddinUninstall возникают, когда надстройка инсталлируется и деинсталлируется и являются удобным местом для расположения инициализационного кода и кода очистки. В данном случае мы добавляем комманду Report в меню Сервис (Tools).
   Метод Delete в событии AddinUninstall полагается на наименование элемента, а не на его позицию, чтобы правильно определить удаляемый элемент:
    Application.CommandBars("Worksheet Menu Bar") _
        .Controls("Tools").Controls("Report").Delete
   Это делается потому, что при перезапуске Excel позиция нашего пользовательского пункта меню может измениться со всеми вытекающими последствиями.

   Свойство OnAction устанавливает имя процедуры, которая запускается по щелчку комманды Report.
    With objCmdBtn
        .Caption = "Report"
        .OnAction = "AddInCode.Master"
    End With

Построение Отчета продаж продуктов

Следующий раздел описывает, как создать код, который строит Отчет продаж продуктов.
  1. В редакторе Visual Basic в меню Сервис (Tools) щелкните пункт Ссылки (Referenses).
  2. В открывшемся диалоговом окне установите флажок напротив Microsoft DAO 3.51 Object Library (или последнюю доступную версию DAO), затем щелкните OK.
  3. В меню Вставка (Insert) щелкните Модуль (Module).
  4. Нажмите F4, чтобы открыть окно свойств и установите свойство модуля Name в AddInCode.
  5. Скопируйте следующие строки в модуль AddInCode:
  6. Option Explicit
    Dim objRecordset As Recordset
    Dim objWorkbook  As Excel.Workbook
    
    Sub Master()
    ' Called by the AddinInstall event.
    ' This procedure calls other procedures and 
    ' cleans up object variables.
        
        Call DbConnect
        Call GetProductData
    
        ' Close object variables.
        Set objRecordset = Nothing
        Set objWorkbook = Nothing
        
    End Sub
    
    
    Sub DbConnect()
    ' Called by Master procedure.
    ' This procedure opens the database and 
    ' creates the Recordset object that 
    ' contains data for the presentation.
    
        Dim dbsNorthwind As Database
    
        ' Edit this path to match your drive, if necessary.
        Set dbsNorthwind = OpenDatabase _
                ("C:\Program Files\Microsoft " _
                & "Office\Office\Samples\Northwind.mdb")
    
        Set objRecordset = dbsNorthwind. _
                OpenRecordset("product sales for 1995", _
                dbOpenSnapshot)
    
        Set dbsNorthwind = Nothing
        
    End Sub
    
    
    Sub GetProductData()
    ' Called by Master procedure.
    ' This procedure retrieves data 
    ' from the product sales query.
    
        ' Open the report template.
        ' Store a reference to the workbook
        ' containing the template.
        Set objWorkbook = Excel.Workbooks.Add("report.xlt")
        
        ' Get data from the query.
        With objRecordset
            Do
                ' Call the procedure that adds this
                ' data to the template worksheet.
                Call AddToSheet _
                        (objRecordset.AbsolutePosition, _
                         objRecordset!ProductName & "", _
                         objRecordset!CategoryName & "", _
                         objRecordset!ProductSales)
                ' Move to the next record.
                .MoveNext
            Loop Until .EOF = True
        End With
    End Sub
    
    
    Sub AddToSheet(lngRowNumber As Long, _
                   strProdName As String, _
                   strCatName As String, _
                   lngProdSales As Long)
    ' Called by GetProductData procedure.
    ' This procedure adds data to the template.
        With objWorkbook.Worksheets(1) _
                .Rows(lngRowNumber + 3)
            .Cells(, 1).Value = strProdName
            .Cells(, 2).Value = strCatName
            .Cells(, 3).Value = lngProdSales
        End With
    
    End Sub
    
  7. В Excel'е в меню Файл щелкните пункт Свойства (Properties). Напишите любой свой текст здесь, но хорошим выбором было бы назвать заголовок "Sales Report", а в комментарии написать что-то вроде "Sample add-in". Текст комментария отображается, когда надстройка выбрана в менеджере надстроек. Щелкните OK.
  8. В редакторе Visual Basic сохраните Ваш проект в рабочую папку под именем Report.xls
Комментарии к коду

   Данные берутся из Access-запроса и передаются в процедуру AddToSheet с помощью следующей последовательности действий из поцедуры GetProductData. Первое выражение, objRecordset.AbsolutePosition передаёт номер строки. Следующие два выражения, objRecordset!ProductName & "" и objRecordset!CategoryName & "" получают строковое значение из запроса Access и добавляют к результату строку нулевой длины. Добавление стрки нулевой длины предотвращает появление ошибки "Invalid use of Null" в случае появления нулевой величины.
    With objRecordset
        Do
            ' Call the procedure that adds this data
            ' to the template worksheet.
            Call AddToSheet _
                    (objRecordset.AbsolutePosition, _
                     objRecordset!ProductName & "", _
                     objRecordset!CategoryName & "", _
                     objRecordset!ProductSales)
            
            ' Move to the next record.
            .MoveNext
        Loop Until .EOF = True
        
    End With
   Эти операторы в процедуре AddToSheet добавляют данные к шаблону отчета. Текущий номер записи объекта Recordset передаётся аргументом lngRowNumber и используется, чтобы установить номер строки в опрераторе With ... End With. При установленном номере строки свойство Cells работает уже лишь с аргументом столбца.
    With objWorkSheet.Rows(lngRowNumber + 3)
        .Cells(, 1).Value = strProdName
        .Cells(, 2).Value = strCatName
        .Cells(, 3).Value = lngProdSales
    End With

Загрузка, выгрузка и запуск надстройки

  1. Убедитесь, что Report.xls уже открыт в Excel'е, затем в меню Файл выберите Сохранить как (Save As).
  2. Выберите папку \Program Files\Microsoft Office\Office\Library, установите тип файла как Надстройка Microsoft Excel (Microsoft Excel Add-In) и нажмите Сохранить (Save).
  3. Закройте Report.xls и откройте чистую рабочую книгу. (В принципе, это не обязательно, но благоразумнее убрать .xls-версию надстройки)
  4. В меню Сервис (Tools) выберите Надстройки (Add-Ins) и щелкните Менеджер надстроек (Add-Ins Manager). Установите флажок, указывающий на надстройку Отчет продаж продуктов (Product Sales Report) и щелкните OK.
  5. В меню Сервис (Tools) щелкните Отчет продаж (Sales Report).
  6. После того, как отчет будет построен, в диалоговом окне управления надстройками снимите флажок напротив надстройки Отчет продаж продуктов (Product Sales Report) и щелкните OK для деинсталляции надстройки.


© design & content by Acidigital, 2001

Hosted by uCoz