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

スポンサーリンク

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

割と長いことエクセルの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度だけ実行される。

コメント

タイトルとURLをコピーしました