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 サブルーチンはテスト用です):

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 ステップでは、オブジェクトをプログラムで制御することはできません。フォーム変数を Dim し、Forms.Item() を使用して設定する必要があります。私は通常、DoCmd.RunCommand の後にフォームを閉じ、次に DoCmd.Rename を便利なもので閉じます (私のユーザーは Form1、Form2 などを好みません)。

それが役立つことを願っています。

于 2012-12-19T03:35:46.133 に答える