1

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

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

模块的完整代码


在 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

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

4

3 回答 3

3

我也做了一些我自己的测试和一些关于这个的在线阅读。据我所知,在不使用 DoCmd.OpenForm 的情况下,不可能使用代表该表单名称的字符串创建新表单对象并将其设置为现有表单的实例。

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

于 2012-06-13T13:32:55.140 回答
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
于 2012-06-06T16:53:23.637 回答
1

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

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

RunCommand 步骤不会让您以编程方式控制对象,您必须使用 Forms.Item() 对 Form 变量进行调暗并设置。我通常在 DoCmd.RunCommand 之后关闭表单,然后用有用的东西关闭 DoCmd.Rename(我的用户不喜欢 Form1、Form2 等)。

希望有帮助。

于 2012-12-19T03:35:46.133 回答