vba interface class



我有一个接口类,一个用户表单实现了这个推断面。cmdOK((子只有在存在第二条语句(me.hide(时才起作用,否则就不起作用。怎么了?接口:

Public Property Get Description() As String
End Property
Public Property Let Description(ByVal Description As String)
End Property
Public Property Get DialogResult() As VbMsgBoxResult
End Property
Public Property Get Name() As String
End Property
Public Property Let Name(ByVal Name As String)
End Property
Public Sub Show()
End Sub

用户表单

Option Explicit
Implements IFName
Private me_DialogResult As VbMsgBoxResult
Public Property Get IFName_Description() As String
IFName_Description = txtDescription
End Property
Public Property Let IFName_Description(ByVal Description As String)
txtDescription = Description
End Property
Public Property Get IFName_DialogResult() As VbMsgBoxResult
IFName_DialogResult = me_DialogResult
End Property
Public Property Get IFName_Name() As String
IFName_Name = txtName
End Property
Public Property Let IFName_Name(ByVal Name As String)
txtName = Name
End Property
Private Sub IFName_Hide()
Me.Hide
End Sub
Private Sub IFName_Show()
Me.Show
End Sub
Private Sub cmdCancel_Click()
me_DialogResult = vbCancel
Me.Hide
End Sub
Private Sub cmdOK_Click()
me_DialogResult = vbOK
Me.Hide
End Sub

消耗代码的子例程,当我评论";我。隐藏";在用户表单中,它不起作用:

Public Sub TestDeclared()
Dim sPrompt As String
Dim frm     As IFName

Set frm = New FName
'Set frm = New FNameCbo
frm.Name = "Name property"
frm.Description = "Description..."
frm.Show
If (frm.DialogResult = vbOK) Then
sPrompt = "User entered " & Chr(34) & frm.Name & Chr(34) & "."
MsgBox sPrompt
End If
Unload frm
Set frm = Nothing

结束子

首先需要定义表单是否为模态。

如果您使用表单模态(就像您在代码中所做的那样(,例程TestDeclared将暂停,直到您关闭表单(隐藏它(。如果在OK按钮的事件例程中省略隐藏,则不会发生任何事情,因为窗体保持打开状态。

如果您使用表单非模态,例程TestDeclared将显示表单,并立即继续运行(在表单初始化和激活代码完成后(,直到它完成(如果它被任何其他例程调用,则此例程将继续…(。顺便说一句,这会导致问题,因为您在显示表单实例时破坏了表单实例(通过Unload(。

如果你不想关闭表单,你应该创建一个例程,从"确定"按钮的事件处理程序调用它,它可以完成你想做的所有很酷的事情。如果结果以某种方式被写入Excel,你应该考虑使用非模态表单,这样使用就可以切换到工作表上查看。如果您在表单中显示结果,请坚持使用表单模态。

' Show the form
Public Sub TestDeclared()
Dim frm   As IFName    
Set frm = New FName
frm.Name = "Name property"
frm.Description = "Description..."
frm.Show
End Sub    

(不需要卸载,VBA无论如何都会进行垃圾收集(

当用户点击OK时,新的例程会起作用:

Sub DoTheMagic(frm as IFName)
sPrompt = "User entered " & Chr(34) & frm.Name & Chr(34) & "."
MsgBox sPrompt
End If

在你的表单的代码背后:

Private Sub cmdCancel_Click()
Me.Hide ' We are done, leave the form
End Sub

通过"确定"按钮,可以调用新的子程序。由于此例程需要与表单交互,因此将Me作为参数传递。另一种选择是将frm声明为全局变量。

Private Sub cmdOK_Click()
DoTheMagic Me
End Sub

最新更新