Что делает модуль класса “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 и потом вот таким хитрым способом их выполнять.
Жду ваших вопросов…