はじめに

今回説明する組み込み関数は数値関数、文字列関数、日付関数以外でよく使用される関数です。ループ処理中にシステムで待っている処理を行うための関数(DoEvents)、いままでの例題でよく使用していたデータ表示関数(MsgBox)、セル操作で使用される関数をVBAで使用する方法などについて説明したいと思います。

ゼロからはじめるVBA - 基本編
ゼロからはじめるVBA - VBA事始め編
ゼロからはじめるVBA - セル操作編
ゼロからはじめるVBA - 条件による分岐編
ゼロからはじめるVBA - 繰り返し処理編
ゼロからはじめるVBA - ユーザーフォーム編
ゼロからはじめるVBA - マクロの記録を使った例題編
ゼロからはじめるVBA - 数値関数編
ゼロからはじめるVBA- 文字列関数編(1)
ゼロからはじめるVBA - 文字列関数編(2)
ゼロからはじめるVBA - 日付/時刻関数編

システムで待っている処理を行うため

一つのプログラムを作成する中で、複数のデータ処理をするためには、ループ処理を使用します。ループ処理を行っている間は他の処理は終了を待っています。処理の速度はパソコンと人とを比べれば、パソコンのほうがけた違いに速いので、ちょっとしたループ処理であれば、待ったような気がしなくて次の処理に移れます。

しかし、とても長い処理の時、画面は止まってしまいます。画面が止まったようにならないために、長いループ処理の途中に、「他の処理待ちはないか調べ、あったら待っている処理を行って、またループ処理へ戻る」処理をしてくれる、DoEvents関数を入れます。

DoEvents関数の使用例

DoEvents関数を使っての実行テストをやってみましょう。ボタンを押すと数値を1から10まで表示するマクロです。DoEvents関数を入れたものと、入れていないものを作成しました。以下今回作成したセルの図です。

図1:DoEventsのテスト画面

DoEvents関数を開始1のマクロには入れず、開始2のマクロには入れています。開始1のボタンを押すとマクロが実行されます。実行中開始2のボタンは押せません。 次に開始2のボタンを押してみましょう。実行中でも開始1のボタンが押せます。開始1のボタンを押すと開始2の表示が止まり、開始1側の表示が始まります。開始1の処理が終了するとまた開始2の表示が続行し、終了します。ループ処理を実行中にユーザに処理が止まったと思わせないように、DoEvents関数を使って「待っている処理」を行います。 リストを見てみましょう。まずDoEvents関数を使っていない処理です。

以下説明するリストはsample.lzhの中に収録しています。サンプルとしてご活用ください。

[リスト1]DoEvents1(その他の関数.xlsm)

Sub Rei_DoEvents1()
    a = 1
    Do While a <= 10        '(1)
        Cells(3, 2) = a
        Cells(3, 2).Select  '(2)
        a = a + 1
        For j = 1 To 50000  '(3)
            For k = 1 To 1000
            Next
         Next
    Loop
    MsgBox ("DoEvents1 end")
End Sub

開始1のマクロです。(1)で1から10までループ処理を行っています。(2)はセルの内容を表示させるための命令です。(3)は表示があまり早いと人の目につかないのでfor文の二重ループで、少し待っています。 例題のイメージ図を書いてみました。処理が終了するまで他の処理は受け付けません。

図2:DoEvents関数を使っていない処理

次はDoEvents関数を使ったリストです。

[リスト2]DoEvents2(その他の関数.xlsm)

Sub Rei_DoEvents2()
    a = 1
    Do While a <= 10    '(1)
        Cells(3, 4) = a
        Cells(3, 4).Select
        a = a + 1
        For j = 1 To 50000  '(2)
            DoEvents        '(3)
         Next
    Loop
    MsgBox ("DoEvents2 end")

(1)で1から10までのループ処理を行っています。(2)で表示用に待ちを入れています。開始1マクロの待ち処理はFor文の二重ループにしていますが、DoEvents関数の処理時間があるので、待ちが長くなるため、For文1個のみにしています。

DoEvents関数を使った処理は、処理中に他の処理依頼が無いか、確認します。他の処理依頼があると、他の処理依頼を優先します。例題のイメージ図を書いてみました。

図3:DoEvents関数を使った処理

DoEvents関数は処理中の非常停止ボタン設定用に使ったり、別の操作が止まってしまわないようにするためなどに使用されます。