3

などを呼び出さずにすべてのユーザーフォームを読み込む方法を理解したかったのですUserform1.Show UserForm2.Show。これは、この回答に対するコメントに触発されました:モジュールのExcel VBA UserForm_Initialize()

私はこの方法がいくつかの場所で提案されていることを発見しました:

Sub OpenAllUserForms()
    Dim uf As UserForm
    For Each uf In UserForms
        uf.Show
    Next
End Sub

ただし、ブックに添付されているユーザーフォームの数に関係なく、ユーザーフォームは表示されません。コードをステップスルーしたとき、UserFormsコレクションが空であると判断しました。

各ユーザーフォームを明示的に表示せずにロードするにはどうすればよいですか?

4

2 に答える 2

7

このページによると:UserFormオブジェクト

UserFormsコレクションは、その要素がアプリケーションにロードされた各UserFormを表すコレクションです。

ユーザーフォームが読み込まれていないため、コレクションに表示されません。これは、フォームを別の方法でロードする必要があることを意味します。各ユーザーフォームの名前を取得するには、コードがVisualBasicProjectにアクセスするためのアクセス許可を許可する必要があります。それ以外の場合は、ユーザーフォームの名前を入力する必要があります。

以下は、現在のVBProjectのすべてのユーザーフォームを開きます。

Sub OpenAllUserForms()
    Dim VBComp As Object
    For Each VBComp In Application.VBE.ActiveVBProject.VBComponents
        If VBComp.Type = 3 Then '3 = vbext_ct_MSForm
            VBA.UserForms.Add(VBComp.Name).Show
        End If
    Next
End Sub

これは、各ユーザーフォームがVBProjectにVBComponentとしてリストされているために機能します。コードがどのコンポーネントがユーザーフォームであるかを判別すると、ユーザーフォームをコレクションに追加して表示します。フォームを省略した場合.Showでも、フォームはInitializeイベントを実行しますが、すぐにスコープから外れて消えます。

于 2012-12-20T05:00:42.223 に答える
0

以下の行を適用することで、既存の問題を解決しました

モジュール内:
UserForms(Name).Userform_Initialize

説明:
これにより、現在のユーザーフォームが初期化されます。

例:
結果= Trueの場合
UserForms(Name).Userform_Initialize

これは、結果がtrueの場合、フォームが初期状態に変わることを意味します。

PS私の悪い英語を許してください

于 2012-12-20T10:19:04.367 に答える