我有一個介面類和一個用戶表單實作該介面。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
使用代碼的子程式,當我在用戶表單中注釋“me.hide”時,它不起作用:
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
結束子
uj5u.com熱心網友回復:
您需要定義的第一件事是您是否希望表單是模態的。
如果您使用表單模式(就像您在代碼中所做的那樣),則例程TestDeclared將暫停,直到您關閉表單(隱藏它)。如果您在 OK 按鈕的事件例程中省略隱藏,則不會發生任何事情,因為表單保持打開狀態。
如果您使用非模態表單,例程TestDeclared將顯示表單并立即繼續運行(在完成表單初始化和激活代碼后)直到完成(如果它被任何其他例程呼叫,則該例程將繼續……)。順便說一句,這會導致一個問題,因為您在Unload顯示時銷毀了表單實體(via )。
如果您不想關閉表單,您應該創建一個從 OK 按鈕的事件處理程式呼叫的例程,它可以完成您想做的所有很酷的事情。如果結果以某種方式寫入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 都會進行垃圾收集)
當用戶單擊“確定”時執行此操作的新例程:
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
通過 OK 按鈕,您可以呼叫新的子程式。由于此例程需要與表單互動,因此Me作為引數傳遞。另一種方法是宣告frm為全域變數。
Private Sub cmdOK_Click()
DoTheMagic Me
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/358949.html
上一篇:在VBA中的另一個變數中存盤一列
