Для того, чтобы это работало, ему нужна как минимум публичная переменная объекта типа вашего класса.И эта переменная объекта должна быть установлена, чтобы быть новым экземпляром вашего класса.Тогда эта переменная объекта и только эта переменная объекта являются общедоступным экземпляром вашего класса.
Пример:
Пусть ваш класс будет иметь имя clsWorkbook
и иметь следующий код:
Option Explicit
Private m_cell As Range
Private WithEvents m_wb As Workbook
Property Let cell(cellrange As Range)
Set m_cell = cellrange
End Property
Property Get cell() As Range
Set cell = m_cell
End Property
Public Property Let Workbook(wb As Workbook)
Set m_wb = wb
End Property
Public Property Get Workbook() As Workbook
Set Workbook = m_wb
End Property
Private Sub m_wb_SheetChange(ByVal Sh As Object, ByVal Target As Range) 'simplified, but accurate
Application.EnableEvents = False
For Each m_cell In Target
ReplaceTask.Show
Next m_cell
Application.EnableEvents = True
End Sub
Пусть ваша пользовательская форма с именем ReplaceTask
имеет следующий код:
Option Explicit
Private Sub UserForm_Initialize()
Debug.Print oWB.Workbook.Name
Debug.Print oWB.cell.Address
End Sub
И в модуле по умолчанию есть следующий код:
Option Explicit
Public oWB As clsWorkbook
Public Sub test()
Set oWB = New clsWorkbook
oWB.Workbook = ThisWorkbook
End Sub
Теперь, после Sub test()
был выполнен, внесите изменения в лист в рабочей книге, в которой находится код. Это должно вызвать Sub m_wb_SheetChange(ByVal Sh As Object, ByVal Target As Range)
вашего объекта класса oWB
, который показывает форму пользователя, которая также может получить доступ к oWB.Workbook.Name
и oWB.cell.Address
.
Из-за дискуссии о необходимости глобального экземпляра clsWorkbook
давайте приведем полный пример, который можно восстановить и который показывает, как clsWorkbook
может быть членом частного класса:
Пусть ваш класс с именем clsWorkbook
и имеет следующий код:
Option Explicit
Private m_cell As Range
Private WithEvents m_wb As Workbook
Property Let Cell(cellrange As Range)
Set m_cell = cellrange
End Property
Property Get Cell() As Range
Set Cell = m_cell
End Property
Property Let Workbook(wb As Workbook)
Set m_wb = wb
End Property
Property Get Workbook() As Workbook
Set Workbook = m_wb
End Property
Private Sub m_wb_SheetChange(ByVal Sh As Object, ByVal Target As Range) 'simplified, but accurate
Application.EnableEvents = False
Dim frm As ReplaceTask
For Each m_cell In Target
Set frm = New ReplaceTask
frm.Init Me
frm.Show
Next m_cell
Application.EnableEvents = True
End Sub
Пусть ваша пользовательская форма с именем ReplaceTask
имеет следующий код:
Option Explicit
Private m_ParentClass As clsWorkbook
Friend Sub Init(ByVal p As clsWorkbook)
Set m_ParentClass = p
Me.Caption = p.Workbook.Name & " : " & p.Cell.Address
End Sub
И в классе по умолчаниюмодуль ThisWorkbook
имеет следующиекод:
Option Explicit
Private oWB As clsWorkbook
Private Sub Workbook_Open()
Set oWB = New clsWorkbook
oWB.Workbook = Workbooks.Open("P:/Mappe1.xlsx")
End Sub
Теперь экземпляр clsWorkbook
создается при открытой книге и является частным членом ThisWorkbook
, а его член книги является книгой, которая была открыта дополнительно.Там SheetChange
прослушивается экземпляром clsWorkbook
oWB
.
И поскольку пользовательская форма ReplaceTask
создается в clsWorkbook
и получает экземпляр класса в качестве параметра, эта пользовательская форма также знает членов класса.