【Excel VBA】フォーム内のモジュール変数とプロシージャ


Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/take1mg/www/plus1/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524

勘違いをしたままずっと長いこと思い込んでいることって割とあるのだけれど、それがそんなに不利益になる事柄でなければ大したことがない。
しかし、今回はものすごく損をした気分になったので覚書投稿しておきます。

割と長いことエクセルのVBAをいじってきているけれども、ずっと「標準モジュールからフォームに変数を受け渡しするにはパブリック変数しかない。」と思い込んできた。ところがつい先日それが間違っていたことを知った。「フォームとフォームの間で直接変数を受け渡しできないので、パブリック変数を使いましょう。」ということであったらしい。
いや、これもあまり正確でない。確かに標準モジュールからフォームに変数そのものを渡すにはパブリック変数しかないから。だが、値を受け渡しするだけならばなんのことはない。割と普通にできたのだった。

つまりフォームモジュール内にパブリックで変数を定義してやれば、それは「フォーム名.変数名」でどこからでもアクセスできるということ。そしてそれはフォーム内のプロシージャでも同様であるということ。

以下サンプル。

フォームモジュール

Option Explicit

Public Test As Integer

Public Sub Add(num As Integer)
    Test = Test + num
End Sub

Private Sub CommandButton1_Click()
    Label1.Caption = Test
End Sub

Private Sub UserForm_Initialize()
    Label1.Caption = Test
End Sub

 

標準モジュール

Option Explicit

Sub aa()
    With UserForm1
        .Test = 2
        .Add 8
        .Show
    End With
End Sub

 

この時フォームのInitializeプロシージャは、最初に変数Testに値を放り込んだ時に実行される。よって、フォーム表示初期のラベルの値は「0」。

フォームのInitializeプロシージャが走るタイミングはよく「フォームが表示される時」となっているけれど、厳密にいうと「フォームが内部で呼び出されるとき」に1度だけ実行される。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿、および宣伝に類する投稿は無視されますのでご注意ください。(スパム対策)