第二次在這里發帖了...
我在 Excel VBA 中有一個使用幾個用戶表單的主 Sub,我需要從主 Sub 中呼叫另一個使用相同表單的 Sub。主 Sub 需要告訴另一個 Sub 控制哪個表單。
主 Sub 已經使用 myForm.show 顯示表單,然后更改諸如 myForm.label1 = "Hello" 之類的內容。這一切都非常容易。我現在卡住的地方是將名稱傳遞給 Sub 并讓 Sub 正確使用它。這是我撰寫的代碼的簡化示例:
Private Sub Mainsub()
myForm.show
myForm.label1 = "Hello"
call otherSub("myForm")
End Sub
Private Sub otherSub(frm as String)
Dim objForm as Object
Set objForm = UserForms.Add(frm)
objForm.label1 = "Byebye"
End Sub
當我這樣做時,我沒有收到任何錯誤,但表單上的標簽不會改變,在這種情況下使用 F8 除錯也無用。
uj5u.com熱心網友回復:
我不確定我是否正確理解了這個問題,但這里有一些提示。
- 表單是物件
您正在做的是使用 myForm 的默認實體,應該避免這種情況。相反,最好更新表單,如下所示:
dim frm as myForm ' Assuming myForm is the name of the form in the name field of the properties.
set frm = new myForm ' Now you have an instance of myForm, which you can pass along to other subs.
frm.label1 = "Hello"
frm.show
othersub frm
end Sub
public sub otherSub(byref frm as myForm)
frm.label1 = "byebye"
frm.show
end sub
- 如果您有 myForm1 和 myForm2,即具有不同型別的兩個不同表單,并且您希望能夠將其中一個傳遞給 OtherSub 并更改標簽,該怎么辦。
在這種情況下,我會做的是創建一個帶有changeLabel(byval lbl as string)方法的介面。
為此,您需要創建一個名為 ILabelModifiable(例如)的類模塊,您將在其中宣告:
public sub changelabel(byval lbl as string)
public sub show() ' You need this method to be able to show the form.
然后,在 myForm1 和 myForm2 中的每一個中,您將在代碼隱藏的頂部添加:
Implements ILabelModifiable
并在表單的正文中,創建以下子
private sub ILabelModifiable_changelabel(byval lbl as string)
me.label1 = lbl
end
private sub ILabelModifiable_show()
me.show
end
完成此操作后,主要代碼變為:
dim frm as iLabelModifiable
set frm = new myForm1
frm.changelabel "Hello"
frm.show
othersub frm
end Sub
public sub otherSub(byref frm as ILabelModifiable)
frm.changelabel "byebye"
frm.show
end sub
這種方法的一個額外好處是您的代碼不需要知道標簽實際呼叫了什么。可以在Myform1中呼叫label1,在myForm2中呼叫label2,沒關系,代碼只呼叫changeLabel。
- 各種各樣的
在您的示例中,您不控制用戶的操作,例如您不檢查用戶是否單擊了“確定”,或者是否通過取消按鈕或單擊視窗右上角的“X”取消了。我認為這是因為您想盡可能保持示例的重點,但為了以防萬一,不要忘記這樣做。請注意,如果表單在 firstSub 中被銷毀(例如,因為您將其設定為空而不是在用戶單擊取消按鈕或“X”時隱藏它),otherSub 將出錯。
uj5u.com熱心網友回復:
作為替代方案,您可以使用CallByName按名稱獲取表單物件。
Function Form(Name As String) As Object
Set Form = CallByName(UserForms, "Add", VbMethod, Name)
End Function
用法:(包括如何通過名稱參考表單上的控制元件)
Sub Test()
With Form("UserForm1")
.Caption = "This is the form title"
.Controls("Label1").Caption = "Byebye"
.Show vbModal ' or vbModeless
End With
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/364867.html
