Ms access 如何使用表单名称作为字符串创建新表单实例

Ms access 如何使用表单名称作为字符串创建新表单实例,ms-access,instance,vba,ms-access-2010,Ms Access,Instance,Vba,Ms Access 2010,使用表单名称创建已关闭表单的新表单实例的代码 我想用变量替换长的选择案例列表。 在Access 2010中,我有一个VBA函数,当给定一个包含表单名称的字符串时,它会打开表单的新实例。通过向集合添加表单变量“frm”: mcolFormInstances.Add Item:=frm, Key:=CStr(frm.Hwnd) 打开“frm”的唯一方法是使用我手动输入的Select Case语句 Select Case strFormName Case "frmCustomer"

使用表单名称创建已关闭表单的新表单实例的代码

我想用变量替换长的选择案例列表。


在Access 2010中,我有一个VBA函数,当给定一个包含表单名称的字符串时,它会打开表单的新实例。通过向集合添加表单变量“frm”:

mcolFormInstances.Add Item:=frm, Key:=CStr(frm.Hwnd)
打开“frm”的唯一方法是使用我手动输入的Select Case语句

Select Case strFormName
    Case "frmCustomer"
        Set frm = New Form_frmCustomer
    Case "frmProduct"
        Set frm = New Form_frmProduct        
    ... etc ... !
End Select
我希望它自动完成,有点像这样(尽管这不起作用):

或者通过一些代码:

For Each obj In CurrentProject.AllForms 'or AllModules, neither work
    If obj.Name = strFormName Then
        Set FormObject = obj.AccessClassObject 'or something
    End If
Next

Set frm = New FormObject

我只是想避免列出项目中的每一个表单,并在添加新表单时保持列表的更新。

我想您正在寻找类似MS Access 2010的功能。(GetForm sub仅用于测试):


我想您正在寻找类似MS Access 2010功能的东西。(GetForm sub仅用于测试):


我自己也做了一些测试,并在网上阅读了一些关于这方面的文章。据我所知,如果不使用DoCmd.OpenForm,就不可能创建一个新的表单对象并使用表示该表单名称的字符串将其设置为现有表单的实例


换句话说,除非有人能证明我错了,否则你想做的事是做不到的。

我自己也做了一些测试,并在网上阅读了一些有关这方面的文章。据我所知,如果不使用DoCmd.OpenForm,就不可能创建一个新的表单对象并使用表示该表单名称的字符串将其设置为现有表单的实例


换句话说,除非有人能证明我错了,否则你想做的事是做不到的。

我发现了一个丑陋的黑客:

DoCmd.SelectObject <acObjectType>, <YourObjectsName>, True
DoCmd.RunCommand acCmdNewObjectForm
DoCmd.SelectObject,True
DoCmd.RunCommand acCmdNewObjectForm
RUNCOMAND步骤没有为您提供对对象的编程控制,您必须对表单变量进行调暗,并使用Forms.Item()进行设置。我通常在DoCmd.RunCommand之后关闭表单,然后用一些有用的东西(我的用户不喜欢Form1、Form2等)关闭DoCmd.Rename


希望能有所帮助。

我发现了一个丑陋的黑客:

DoCmd.SelectObject <acObjectType>, <YourObjectsName>, True
DoCmd.RunCommand acCmdNewObjectForm
DoCmd.SelectObject,True
DoCmd.RunCommand acCmdNewObjectForm
RUNCOMAND步骤没有为您提供对对象的编程控制,您必须对表单变量进行调暗,并使用Forms.Item()进行设置。我通常在DoCmd.RunCommand之后关闭表单,然后用一些有用的东西(我的用户不喜欢Form1、Form2等)关闭DoCmd.Rename


希望能有所帮助。

非常感谢您提供的代码。实际上,我的模块中有一些非常类似的东西(整个模块现在发布在上面)。但是,Application.Forms仅包含打开的表单。我正在尝试创建一个封闭窗体的新实例。我试图在对我的问题的一些编辑中澄清这一点。非常感谢代码。实际上,我的模块中有一些非常类似的东西(整个模块现在发布在上面)。但是,Application.Forms仅包含打开的表单。我正在尝试创建一个封闭窗体的新实例。我试图在对我的问题的一些编辑中澄清这一点。你从哪里获得access 2012?打字错误,我的错。不过,我听说Office2012的测试版应该在一个月内发布。允许对对象计算VBA代码字符串,可能会被采用来解决这个问题。你从哪里获得access 2012?打字错误,我的错。不过,我听说Office2012的测试版应该在一个月内发布。允许将VBA代码字符串求值为对象,并可能被用于解决该问题。我不喜欢这样做,但我想我必须给“不可能”打勾。我不想这样做,但我想我必须给“不可能”的答案打勾。没有其他事情发生。我必须检查一下,看看我的情况下是否能让它工作。非常感谢。我得检查一下,看看在我的情况下能不能用。谢谢。
DoCmd.SelectObject <acObjectType>, <YourObjectsName>, True
DoCmd.RunCommand acCmdNewObjectForm