Subプロシージャの呼び出し

これからマクロを使ってInternetExplorerの自動操作をしていく上で、Subプロシージャの呼び出しは、よく使うことになるので覚えておいた方が良いかと思います。

では簡単な例から説明します。

例)Sub sample1()
    Dim a1 As Object
    Set a1 = Range("A1")
    sample2 a1
    MsgBox a1.Value
  End Sub

  Sub sample2(a1 As Object)
    a1.Value = "呼び出せるかな?"
  End Sub

上記のコードを実行してみてください。
A1のセルに「呼び出せるかな?」と表示され、メッセージボックスにも「呼び出せるかな?」が表示されたと思います。

では処理の順番などを上から説明していきたいと思います。

Dim a1 As Object


まず、上記は変数宣言【Dim】でも説明している通り、「a1というObject型の箱を用意しますよ」という意味ですね。

Set a1 = Range("A1")


これは変数の代入ですね。
オブジェクト型に関しては【Set オブジェクト名 = 代入するオブジェクト】という形で入力する事を覚えておいてください。

ここからが重要です。

sample2 a1


この部分ですが、ここはsample2というSubプロシージャを呼び出すという意味です。
a1の部分に関しては変数の受け渡しになります。
sample1で宣言した変数をsample2でも使用しますよ」という事になるので、変数を宣言したSubプロシージャとは違うSubプロシージャで同じ変数を使用する場合、必ず宣言してください。

次はMsgBox a1.Valueには行かずSub sample2(a1 As Object)を実行します。
これはsample2 a1の部分でSub sample2(a1 As Object)を呼び出しているからです。

でその中の処理として【Range("A1").Value = "呼び出せるかな?"】を実行して、A1のセルに「呼び出せるかな?」を入力し、sample2の処理が終わったのでsample1のSubプロシージャに戻ります。

MsgBox a1.Value

最後に上記でメッセージボックスにA1の値を表示したら終わりになります。

このようにSubプロシージャの呼び出しをすると、他のSubプロシージャで作ったマクロを実行しているマクロから呼び出し、処理をする事が出来るのです。

最後に、この記事の最初に軽く話をしたIEの自動操作の時にSubプロシージャの呼び出しをよく使うという話ですが、これはIEでページを移動した際、ページが読み込まれるまでの間に次の処理に進んでしまうと、確実に意図しない処理をしてしまいますよね?
なので、そういう時に読み込み待ちをする為のSubプロシージャを作成しておき、ページが変わるタイミングの所で、そのSubプロシージャを読み込むとページが表示されるのを待ってくれるのです。

では、おまけとしてIEの読み込み待ちに使えるSubプロシージャをご紹介します。

Sub プロシージャ名(IEの変数名 As Object)
  Do While IEの変数名.Busy Or IEの変数名.ReadyState < 4
    DoEvents
  Loop
End Sub

このように「IEがビジー状態、もしくは読み込みが完了じゃない間、OSに処理を戻して、読み込みが終わったらループを抜けて次の処理に行く」という流れになります。
これは後々IEの自動操作をするようになるとよく使うようになるので、覚えておいたら良いと思います。