如何使用表单的名称作为String创建新的表单实例

时间:2012-06-06 16:03:41

标签: ms-access vba instance access-vba ms-access-2010

使用表单名称

创建已关闭表单的新表单实例的代码

我想用变量替换长的Select Case列表。

Full code of module


在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

我想让它自动完成,有点像这样(虽然这不起作用):

Set frm = New Eval("Form_" & strFormName)

或通过一些代码:

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

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

3 个答案:

答案 0 :(得分:3)

我也做了一些我自己的测试,还有一些在线阅读。就像我所知,不可能创建一个新的表单对象,并使用表示该表单名称的字符串将其设置为现有表单的实例,而不使用DoCmd.OpenForm。

换句话说,除非别人能证明我错了,否则你要做的就是做不了。

答案 1 :(得分:1)

我认为你正在寻找像这样的MS-Access 2010功能。 (GetForm sub仅用于测试):

Function SelectForm(ByVal FormName As String, ByRef FormExists As Boolean) As Form
    For Each f In Application.Forms
      If f.Name = FormName Then
        Set SelectForm = f
        FormExists = True
        Exit Function
      End If
    Next
    FormExists = False
End Function

Sub GetForm(ByVal FormName As String)

  Dim f As New Form
  Dim FormExists As Boolean
  Set f = SelectForm(FormName, FormExists)
  If FormExists Then
    MsgBox ("Form Found: " & f.Caption) 
  Else
    MsgBox ("Form '" & FormName & "' not found.")
  End If

End Sub

答案 2 :(得分:1)

我发现这是一个丑陋的黑客:

DoCmd.SelectObject <acObjectType>, <YourObjectsName>, True
DoCmd.RunCommand acCmdNewObjectForm

RunCommand步骤不会为您提供对象的编程控制,您必须使用Forms.Item()对Dim表格变量和Set进行调整。我通常在DoCmd.RunCommand之后关闭表单,然后在DoCmd.Rename之后关闭一些有用的东西(我的用户不喜欢Form1,Form2等)。

希望有所帮助。