Главная
 
= Blank-RZ for MS Excel =Четверг, 21.11.2024, 20:39



Приветствую Вас Гость | RSS
Главная
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: Shpalich  
Как сделать самому XLA-надстройку для Excel
ShpalichДата: Пятница, 05.11.2010, 09:46 | Сообщение # 1
Подполковник
Группа: Администраторы
Сообщений: 21
Статус: Offline
Поначалу я начинал писать макросы прямо в файлах Excel и новые (малость автоматизированные) файлы приходилось хранить как шаблон XLS, открывать его, сохранять как, а потом работать. Потом задумался, как сделать так, чтобы эти шаблоны встраивались в Excel автоматом, были невидимы для обычных пользователей, чтобы из них загружались шаблоны, а макросы оставались внутри самих шаблонов, а не в файлах пользователя...
Yandex подсказал - прячь макросы и шаблоны в файлах типа XLA.
Вот про это я и хочу рассказать на этом форуме...


Человек создан для счастья... А вынужден работать.
 
DraftsmenДата: Среда, 12.01.2011, 04:48 | Сообщение # 2
Рядовой
Группа: Пользователи
Сообщений: 1
Статус: Offline
С нетерпением жду продолжения рассказа:)
 
ShpalichДата: Суббота, 22.01.2011, 15:18 | Сообщение # 3
Подполковник
Группа: Администраторы
Сообщений: 21
Статус: Offline
Сначала цель моей надстройки: Она будет вставлять в любой документ заранее подготовленную таблицу, раздвинув строки в месте, где стоит курсор. Так же будет создана кнопка на панели инструментов для быстрой вставки, будет создано Главное меню вашей настройки и один пункт подменю в нем. Так же расскажу, как добавить в меню Правой Кнопки Мыши ваш пункт подменю и в него еще несколько подпунктов. И, до кучи, повесим ХУК на комбинацию клавиш для вставки таблицы на лист.

Шаг 1. Готовим шаблон в обычном файле Excel
Берем ваш файл Excel с подготовленным шаблоном таблицы:

Шаг 2. Сохраняем как надстройку XLA:
“Сохраним как” наш файл, выбрав тип файла XLA (по-моему, это в самом низу списка с типами файлов).

Для большей уверенности работоспособности будущих макросов своей надстройки, нужно установить НИЗКУЮ БЕЗОПАСНОСТЬ МАКРОСОВ.
Для Excel-2003 – меню СЕРВИС -> МАКРОС -> БЕЗОПАСНОСТЬ.
Для Excel-2007 – нужно перейти в НАСТРОЙКИ EXCEL -> Центр управления безопасностью -> Кнопка “Параметры центра управления безопасностью” -> Раздел “Параметры макросов” -> Включить все макросы (то, что дядька Билл крайне не рекомендует делать).
Я еще ставлю галочку “Доверять доступ к объектной модели VBA” (Теперь точно дядьку Билла хватит удар biggrin ).

Потом закроем весь Excel. Идем в папку %AppData%\Microsoft\AddIns\

* Я пишу %AppData% - так папка называется в переменных окружения ENVIRON, а для пользователя это должно находиться тут:
Для Windows-XP: C:\Documents and Settings\UserName\Application Data\
Для Windows-7: c:\Users\UserName\AppData\Roaming\

Я заберу свой файл-надстроку из этой папки и положу в папку XLSTART:
%AppData%\Microsoft\Excel\XLSTART\

Теперь при каждом запуске Excel моя надстройка будет открываться автоматом.
Так проще всего сделать. Я буду уверен без лишних заморочек, что она загрузится в Excel.
Ведь изначально её совсем “не будет видно”, а нам с ней еще много работать.

Если бы я оставил надстройку в папке ADDINS, то тоже она бы открывалась при запуске Excel и даже была бы возможность включать её и выключать в меню Excel.
Для Excel-2003 – искать в меню СЕРВИС -> НАДСТРОЙКИ.
Для Excel-2007 и 2010 - искать в “НАСТРОЙКАХ EXCEL” (ткнуть в круглую кнопку в верхнем левом углу, нажать НАСТРОЙКИ, увидим это окошко):

* Сразу извинюсь за то, что пишу местами “НАСТРОЙКА” вместо “НАДСТРОЙКА”, просто мне так удобнее, привычка…

Итак. Я скопировал свою XLA в папку XLSTART. Запустил Excel… И ничего в нем не увидел! Это Замечательно!
На самом деле все XLA по-умолчанию невидимы, но открываются в Excel.


Человек создан для счастья... А вынужден работать.
 
ShpalichДата: Воскресенье, 23.01.2011, 19:32 | Сообщение # 4
Подполковник
Группа: Администраторы
Сообщений: 21
Статус: Offline
Шаг 3. Пишем “скелет кода VBA” для того, чтобы наша надстройка “ожила”

Жмем комбинацию клавиш Alt + F11 – откроем редактор Visual Basic.

Нам потребуется еще один модуль: модуль класса, для того, чтобы наша надстройка могла “цепляться” к событиям чужой книги.

В общем, не буду Вас томить, выкладываю готовый пример этой XLA-надстройки с кодом.
В коде написал максимум комментариев, чтобы продолжить этот урок прямо под оболочкой VBA Excel.


Человек создан для счастья... А вынужден работать.
 
ShpalichДата: Воскресенье, 23.01.2011, 19:38 | Сообщение # 5
Подполковник
Группа: Администраторы
Сообщений: 21
Статус: Offline

Жми картинку, чтобы скачать RAR-архив с XLA


Человек создан для счастья... А вынужден работать.
 
ShpalichДата: Пятница, 28.01.2011, 21:33 | Сообщение # 6
Подполковник
Группа: Администраторы
Сообщений: 21
Статус: Offline
Шаг 4. Как это работает…
У любой программы есть точка старта.
Точка старта в этой надстройке - процедура в модуле ЭтаКнига


Private Sub Workbook_Open()


При открытии книги этот код выполниться 1 раз, соответственно запустит следующий макрос –
MyInitialize (который находиться в модуле SharedModule).
И еще инициализирует модуль класса objWorkbook, который представляет собой пользовательский элемент управления со своими событиями, свойствами и др. Его нужно рассматривать как отдельную программу, это мы сделаем чуть позже. Заранее скажу, что именно objWorkbook позволяет отслеживать щелчки мыши в любой другой книге и запускать макросы в нашей книге XLA.

Еще одна процедура в модуле ЭтаКнига

Private Sub Workbook_BeforeSave()

Не трудно догадаться, что этот код выполняется при сохранении нашей книги XLA.
Сюда я записал процедуру скрытия книги XLA, путем установки свойства
ThisWorkbook.IsAddin = True

И последняя процедура (именно нашей XLA) –

Private Sub Workbook_BeforeClose()


При закрытии нашей книги “Надстройка XLA” Excel установит свойство сама на себя – “Книга сохранена”, хотя этого могло и не быть. Я считаю, что надстройки XLA не должны докучать пользователю сообщениями типа “Сохранить изменения в “Моя первая настройка XLA?”, поэтому перед закрытием целесообразно написать так:

ThisWorkbook.Saved = True

Еще перед закрытием мы должны очистить Excel от изменений, которые внесли в его панели инструментов, а так же желательно очищать память компьютера от переменных-ссылок на объекты, типа objWorkbook, поэтому я добавлю в процедуру закрытия книги еще пару операций:

Set objWB = Nothing' "Отлипание" от событий чужой книги. Очистка памяти компа.
MyTerminate' Удаление панелей, меню, горячих клавиш

Дальше по цепочке выполнения идут процедуры модуля SharedModule.

Два макроса с названиями, говорящими сами за себя:

Sub MyInitialize()
Sub MyTerminate()


Это процедуры визуального оформления нашей надстройки. Именно в них создаются и уничтожаются объекты: панель инструментов с кнопкой, вызывающей наш макрос, меню в основной шапке Excel и меню правой кнопки мыши, тут же переопределяем одну из горячих клавиш.

Еще в модуле SharedModule записаны макросы:

Sub Load_New_Sheet()
Sub Insert_New_Table()
Sub Load_New_Sheet_or_Table()
Sub MyXLA_EditSheets()


Эти макросы выполняются при нажатии на наше меню, на нашу кнопку на панели инструментов, макросы назначаются кнопкам и меню в процедуре MyInitialize()

Еще один макрос - Sub InsCopyOneRow() - никогда бы не ожил, если бы не модуль класса…
InsCopyOneRow – вставляет строку в таблицу, проверяя хитрым образом “наша ли это таблица”.


Человек создан для счастья... А вынужден работать.
 
ShpalichДата: Четверг, 03.02.2011, 20:08 | Сообщение # 7
Подполковник
Группа: Администраторы
Сообщений: 21
Статус: Offline
Что делает модуль класса “objWorkbook”?

Модуль класса – это пользовательский элемент управления.
* Это в данном случае. Вообще модуль класса – это почти готовая DLL-библиотека.
Этот элемент управления, как и любой в Visual Basic, имеет свои свойства, события, его активирующие и события, поступающие от него. А “событие” – это отличная возможность запустить еще несколько макросов в нужный момент.

Итак, модуль класса “делает первый вдох” когда открывается наша книга XLA.
В событии Private Sub Workbook_Open()
прописано Set objWB = New objWorkbook
а в самом верху модуля “ЭтаКнига” определен список событий, которые мы будем ловить:
Dim WithEvents objWB As objWorkbook

В момент “первого вдоха” в модуле objWorkbook зарождается код-автомат:
Private Sub Class_Initialize()
On Error Resume Next
Set oExcel = Application
Set oBook = ActiveWorkbook
Set oSheet = ActiveSheet
End Sub

Переменная-объект oExcel цепляется за приложение “Excel” (у которого, кстати, как и у книги, как и у листа, тоже есть свои события).
oBook – это, соответственно, Активная (текущая открытая) книга Excel.

Таким образом, когда мы щелкаем на листе какой-то книги, эта книга уже “захвачена” нашей переменной oBook, и модуль класса генерирует событие:
RaiseEvent ShOneClick (Sh, Target)

А это событие “ловит” модуль ЭтаКнига:
Private Sub objWB_ShOneClick(ByVal Sh As Object, ByValTarget As Range)
Как только мы откроем другую книгу и закроем (или потеряем фокус с книги, которая была “прицеплена” к переменной oBook), в модуле класса произойдет событие:
Private Sub oExcel_WorkbookActivate(ByVal wb_obj As Workbook)
On Error Resume Next
Set oBook = wb_obj
Set oSheet = wb_obj.ActiveSheet
End Sub

Опа! И мы снова “зацепились” за другую книгу, которая активировалась.

Таким образом, модуль класса objWorkbook “ведет свою самостоятельную жизнь”.
А нам остается только ловить от него события, происходящие на листах чужой книги.

А наш модуль ЭтаКнига тоже стал уникальным. В нем теперь два раздела событий: события книги XLA и точно такие же события из модуля “ЭтаКнига” ЧУЖОГО ФАЙЛА Excel.

Private Sub objWB_ShOneClick(ByVal Sh As Object, ByVal Target As Range)
If StopDoubleOperation Then Exit Sub
StopDoubleOperation = True ‘ Это блокировка обработки событий от objWorkbook на время выполнения моих макросов
Dim a$
On Error GoTo 100
'Я хотел, чтобы при нажатии на ячейку в столбце "R" вставлялась строка в мою таблицу
'Процедура вставки строки описана в модуле SharedModule
'Вот она – та самая строка, ради которой и существует objWorkbook

InsCopyOneRow objWB.WbName, objWB.ShName, objWB.CellRow, objWB.CellCol
100:
StopDoubleOperation = False
End Sub

А макрос InsCopyOneRow объяснять не стоит. Он и так очень прост в понимании. Подобные макросы можно записывать средствами Excel и потом вот таким хитрым способом их выполнять.

Жду ваших вопросов…


Человек создан для счастья... А вынужден работать.
 
ShpalichДата: Суббота, 09.04.2011, 18:14 | Сообщение # 8
Подполковник
Группа: Администраторы
Сообщений: 21
Статус: Offline
Добавлю еще одну строчку, которая многим поможет.
Ответ на интересный вопрос: КАК ВЫЗЫВАТЬ МАКРОСЫ (ПРОЦЕДУРЫ И ФУНКЦИИ) ИЗ ДРУГОГО ФАЙЛА (НАДСТРОЙКИ или XLS-книги)

Run "'МояНадстройка.xla'!МойМакрос" - это для процедур (можно и для функций использовать)

a = Run ("'МояНадстройка.xla'!МойМакрос", Параметр1, Параметр2...) - это для функций.

т.е. Можно написать в одной надстройке сложные математические функции, а из другой их вызывать!

* 'МояНадстройка.xla'! писать не обязательно, если имя функции или процедуры уникально, да и к тому же декларировано как Public Function (хотя и это не обязательно), то Excel сам найдет из какой книги вызвать макрос.

* Чтобы программа не выдавала ошибок (если книга с удаленным макросом не открыта) - используйте On Error Goto 100 или On Error Resume Next.


Человек создан для счастья... А вынужден работать.
 
  • Страница 1 из 1
  • 1
Поиск:


Shpalich-soft © 2024