【问题标题】:How to create a new form instance using the name of the form as a String如何使用表单名称作为字符串创建新的表单实例
【发布时间】:2012-06-10 16:27:57
【问题描述】:

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

我想用一个变量替换长的 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

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

【问题讨论】:

  • 2012 年您从哪里获得访问权限?
  • 错字,我的错。不过,我听说 Office 2012 的测试版应该会在一个月内发布。
  • This approach 允许将 VBA 代码字符串评估为对象,并且可能被采用来解决这个问题。

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


【解决方案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

【讨论】:

  • 非常感谢您的代码。我的模块中实际上有一些非常相似的东西(现在整个模块都在上面发布)。但是,Application.Forms 仅包含打开的表单。我正在尝试创建一个封闭表单的新实例。我试图在对我的问题的一些编辑中澄清这一点。
【解决方案2】:

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

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

【讨论】:

  • 我讨厌这样做,但我认为我将不得不给“不可能”的答案打勾。没有其他任何东西出现。
【解决方案3】:

这是我发现的一个丑陋的 hack:

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

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

希望对您有所帮助。

【讨论】:

  • 我必须检查一下,看看我是否可以让它在我的情况下工作。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多