问题描述
在 MS Access 2016 中,假设我有 2 个表单:frmMain 和 frmBaby。
我已将 frmBaby 作为子窗体嵌入 frmMain。我在 frmBaby 上嵌入了一个名为 tbxInput 的控件(假设它是一个文本框,但它可以是任何控件)。
在 frmMain 上,由于 frmBaby 是 frmMain 上的一个“控件”,我给该控件命名为 subfrmBaby 的传统名称。
现在,在 VBA 中,subfrmBaby 上的事件将 tbxInput 控件 ByRef(如 Me.tbxInput)传递给一个函数,该函数旨在返回传递 ByRef 的控件的父级的 .Left 属性。也就是说,我需要该函数来确定 frmMain 上 subfrmBaby 位置的 .Left 属性。 (该函数比这更复杂,但为了保留这个问题,我们只说该函数返回 .Left 属性值,因为 .Left 值是我执行该函数所需的值。)
假设函数是:Public Function fncLocation(ByRef whtControl As Variant) as Long
(我使用 Variant 以便可以传递空值。)
这是我希望返回 whtControl 的父级(即 subfrmBaby)的 .Left 值的代码:lngLeft = whtControl.Parent.Left
当我使用即时窗口检查时,我发现 whtControl.Parent.Name 是“frmBaby”而不是“subfrmBaby”,这使得在 frmMain 上引用子表单有问题,因为我无法弄清楚如何获得实际的从传递给函数的对象中为 frmMain 上的控件提供的名称,因此我也无法按名称引用子表单。
问题:
提前感谢您的想法。
解决方法
您可以通过迭代主窗体上的控件来实现,假设 whtControl 是子窗体的窗体对象(如果是文本框,则为 whtControl.Parent.Parent
和 If c.Form Is whtControl.Parent Then
)
Dim mainForm As Form
Set mainForm = whtControl.Parent
Dim c As Access.Control
Dim subformControl As Access.Control
For Each c In mainForm.Controls
If TypeOf c Is SubForm Then
If c.Form Is whtControl Then
Set subformControl = c
Exit For
End If
End If
Next
If Not subformControl Is Nothing Then
Debug.Print subformControl.Left
End If
请注意,迭代控件会降低性能,但此代码仍应花费几毫秒,而不是几秒钟。此外,由于我们测试了引用相等性,因此即使在父表单上多次出现相同的子表单,它也能正常工作。
,有趣。我不认为你可以。
如您所见,whtControl
的父级是它的形式 frmBaby
。
那一个的父项是 frmMain
。子窗体控件在“向上”时不属于对象链,只有向下时才属于对象链。
如果你总是使用问题中的命名方案,你可以这样做(空气代码):
strSubform = whtControl.Parent.Name
strSubformCtrl = "sub" & strSubform
Set ctlSubform = whtControl.Parent.Parent(strSubformCtrl)