为了完成这项工作,它至少需要一个类类型的公共对象变量。并且该对象变量必须设置为类的新实例。那么这个对象变量,并且只有这个对象变量,才是类的公共可访问实例。
Example:
让你的班级被命名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
and 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
Now the clsWorkbook
在工作簿打开时被实例化,并且是ThisWorkbook
它的工作簿成员是额外打开的工作簿。那里有SheetChange
被聆听者clsWorkbook
oWB
实例。
并且因为ReplaceTask
用户表单被实例化clsWorkbook
并且被赋予类实例作为参数,该用户表单也知道类成员。