如何使用MS Access VBA向TabControl控件添加子窗体控件?
在MS Access VBA中给TabControl动态添加子窗体控件
我需要用MS Access VBA在窗体的TabControl控件里动态添加子窗体控件。目前已经有一套接近完成的自定义表单生成方案:用户选择下拉框的类型和数量,系统会生成主窗体并嵌入包含这些控件的子窗体;当控件数量超过Access的22英寸窗体限制时,会拆分到多个子窗体,所以需要用到TabControl控件。但我没法实现把新子窗体添加到TabControl控件内的操作。
以下是我尝试的简化代码:
Sub AddControlToTabControl() Dim frm As Form Dim subForm As Form Dim tabCtl As tabControl Set frm = Forms!Form1 Set subForm = Forms!Form1_subForm Set tabCtl = frm!tabCtl DoCmd.OpenForm frm.Name '以下操作均无效 tabCtl.Pages(0).Add (subForm) 'Pages集合无Add属性 tabCtl.Controls.Add (subForm) 'Controls集合无Add属性 tabCtl.Add (subForm) 'tabCtl对象无Add属性 End Sub
我查了Tab Control对象的微软官方文档,没找到把控件添加到TabControl控件内的相关方法;也曾尝试通过坐标把子窗体粘贴到主窗体的TabControl控件上方,但只产生了重叠对象。
解决方法
在Access中,TabControl的页面(Page)是容器控件,但不能直接将已打开的窗体对象添加进去,必须通过创建**子窗体控件(SubForm/SubReport)**并关联目标子窗体的方式实现,具体步骤如下:
- 确保主窗体处于设计视图:动态添加控件仅支持设计模式,窗体视图无法操作。
- (可选)给TabControl新增标签页:如果需要新的标签页,先创建Page对象。
- 在目标Page上生成子窗体控件:使用
CreateControl函数创建关联到目标子窗体的控件,并指定父容器为TabControl的Page。
示例代码:
Sub AddSubFormToTabControl() Dim frm As Form Dim tabCtl As TabControl Dim targetPage As Page Dim newSubFormCtl As Control ' 打开主窗体到设计视图 DoCmd.OpenForm "Form1", acDesign Set frm = Forms!Form1 Set tabCtl = frm!tabCtl ' 选择目标页面,也可以新增页面:Set targetPage = tabCtl.Pages.Add("NewPage", "新标签页") Set targetPage = tabCtl.Pages(0) ' 创建子窗体控件并关联到指定子窗体 Set newSubFormCtl = CreateControl( _ frm.Name, _ acSubform, _ acDetail, _ targetPage.Name, _ "Form1_subForm", ' 这里填写子窗体的对象名称 100, 100, 4000, 3000 ' 控件的左、上、宽、高(单位:缇) ) ' 保存主窗体修改并关闭设计视图 DoCmd.Close acForm, frm.Name, acSaveYes End Sub
关键说明
- 不能直接将已打开的
Form对象添加到TabControl,必须通过CreateControl创建子窗体控件,通过SourceObject属性(或CreateControl参数)关联目标子窗体。 - 所有控件添加操作必须在设计视图下执行,窗体视图不支持动态添加控件。
- 若需要新增标签页,使用
tabCtl.Pages.Add(页面内部名称, 标签显示标题)方法创建新Page,再在该Page上创建子窗体控件。
内容的提问来源于stack exchange,提问作者kdickinson
相关产品推荐
相关产品推荐

