リスト1●指定したファイルが見つからないと,メッセージをOfficeアシスタントのバルーンに表示するプロシジャ。DoAlertメソッドを使っている
リスト1●指定したファイルが見つからないと,メッセージをOfficeアシスタントのバルーンに表示するプロシジャ。DoAlertメソッドを使っている
[画像のクリックで拡大表示]
図1●Officeアシスタントの冴子先生と表示されるメッセージ
図1●Officeアシスタントの冴子先生と表示されるメッセージ
[画像のクリックで拡大表示]
リスト2●リスト1と同じ処理を,Showメソッドを使って記述したプロシジャ。Showメソッドを使う場合はいくつか注意が必要だ
リスト2●リスト1と同じ処理を,Showメソッドを使って記述したプロシジャ。Showメソッドを使う場合はいくつか注意が必要だ
[画像のクリックで拡大表示]

 ちょっと前まで夏だと思っていたのに,もう秋ですねぇ。夏の海が恋しい。

今月の相談

「アプリケーションのいろいろな場面で,ユーザーにメッセージを伝えたいのですが,メッセージボックスだけでは味気なくて…。もっとエレガントでスマートなメッセージの表示方法はないでしょうか?」

 “エレガントでスマートな方法”って言われても,今ひとつピンと来ませんが,そこそこおもしろくてインパクトがあるメッセージ表示方法ならありますよ。私のお気に入りの冴子先生にしゃべってもらう方法です。おっと,しゃべると言っても声が出るわけではありません,文字だけです。

二通りの表示方法がある

 カイル(いるか)や冴子先生などの「Officeアシスタント」(Office製品に組み込まれているアニメーションを使ったヘルプ機能)は,Assistantオブジェクトとして提供されています。他のオブジェクト同様にVBAで操作できます。

 Officeアシスタント(以下,アシスタント)を使ってメッセージを表示するには,大きく二つの方法があります。Office XPから追加されたDoAlertメソッドを使う方法と,Office 2000でも使えるShowメソッドを使う方法です。DoAlertメソッドを使うほうが簡単ですので,まずはそちらから紹介しましょう。

 リスト1[拡大表示]のマクロは,指定されたExcelファイルを開こうとして,そのファイルが存在しない場合,エラー・メッセージをデフォルトのアシスタントのバルーンに表示します(図1[拡大表示])。リスト1[拡大表示]を見てわかるように,AssistantオブジェクトのDoAlertメソッドを呼び出すだけです(1)。このメソッドには七つの引数があります。すべて必須で省略できません。第1引数にタイトル,第2引数に表示する文字列を指定します。第3引数はボタンの種類,第4引数はアイコンの種類,第5引数はアシスタントを表示したときに選択状態にするボタン,第6引数はキャンセル・ボタンのタイプを指定します。第7引数はブール型(Boolean)の値を指定します。ここにTrueを指定するとメッセージボックスに,Falseを指定するとアシスタントのバルーンにメッセージを表示します。ただし,アシスタントが非表示の設定になっている場合は,第7引数の値に関係なく,メッセージボックスが表示されます。

リスト1●指定したファイルが見つからないと,メッセージをOfficeアシスタントのバルーンに表示するプロシジャ。DoAlertメソッドを使っている

Sub OpenWorkbok_Type1()
    Dim myBookName As String

    myBookName = "C:\日経BP.xls"

    On Error GoTo ErrHandler1
        Workbooks.Open myBookName
    On Error GoTo 0

Exit Sub
ErrHandler1:
    With Assistant
        .DoAlert "あかん", _
            "開こうとしたファイルがないでぇ。" _
            & Chr(13) & myBookName, msoAlertButtonOK, _
            msoAlertIconWarning, msoAlertDefaultFirst, _
            msoAlertCancelFirst, False
    End With

End Sub

エラーにならないように注意する

 一方,Showメソッドを使う方法(リスト2[拡大表示])は,いくつか注意が必要です。まず,アシスタントが有効かどうかを調べる必要があります。DoAlertメソッドはアシスタントが表示されていないときは自動的にメッセージボックスを表示しますが,NewBalloonオブジェクトのShowメソッドはアシスタントが無効(OnプロパティがFalse)の場合,メッセージを表示しないでマクロを終了します。そのため,Showメソッドを実行する前に,明示的にアシスタントを有効にしなければなりません。

リスト2●リスト1と同じ処理を,Showメソッドを使って記述したプロシジャ。Showメソッドを使う場合はいくつか注意が必要だ

Sub OpenWorkbok_Type2()
    Dim myBookName As String
    Dim ConditionOf_ON As Boolean
    Dim ConditionOf_Visible As Boolean

    With Assistant
        ConditionOf_ON = .On
        ConditionOf_Visible = .Visible

        On Error Resume Next
            .Filename = "saeko.acs"
        On Error GoTo 0
    End With

    myBookName = "C:\日経BP.xls"

    On Error GoTo ErrHandler1
        Workbooks.Open myBookName
    On Error GoTo 0

    With Assistant
        .On = ConditionOf_ON
        .Visible = ConditionOf_Visible
    End With

Exit Sub

ErrHandler1:
    With Assistant
        .On = True
        .Visible = True
        .Animation = msoAnimationGetAttentionMajor
    End With

    Call WaitTime(1)

    With Assistant.NewBalloon
        .Heading = "あかん"
        .Text = "開こうとしたファイルがないでぇ。" _
            & Chr(13) & myBookName
        .Icon = msoIconAlertWarning
        .Button = msoButtonSetOK
        .Show
    End With

    If ConditionOf_Visible = False Then
        Assistant.Visible = False
    End If
    If ConditionOf_ON = False Then
        Assistant.On = False
    End If
End Sub

 しかし,ユーザーによっては,通常アシスタントを非表示または無効にしている人もいるでしょうから,マクロの実行を終えたらもとの設定に戻してあげるサービスが必要でしょう。そこで,リスト2[拡大表示]では,最初にアシスタントの表示に関する現在の設定(OnプロパティとVisibleプロパティの値)を保存します(1)。もし非表示/無効設定の場合は,マクロ終了直前にそれぞれ戻します(4)(11)。ちなみに,OnプロパティがTrue(有効)であれば,VisibleプロパティがFalse(非表示)であっても,Showメソッドでアシスタントを表示できます。

 もう一つの注意点は,アシスタントのキャラクタを指定する場合,そのキャラクタ(ここでは冴子先生を意味するsaeko.acs)がインストールされているかどうかに配慮することです。Officeのインストール方法によっては,一部のキャラクタしかインストールされません。アシスタントのFilenameプロパティに,インストールされていないキャラクタを指定するとエラーになります。そこで,リスト2[拡大表示](2)では,エラートラップをしかけて,もし指定のアシスタントがインストールされていない場合(エラー発生時)は,Resume Nextによってキャラクタの指定のステートメントを無視する=キャラクタの指定をなかったことにします。

 (3)で開こうとするファイルの情報(フルパス+ファイル名)を文字列型の変数に格納します。そのファイルを開こうとしてエラーになると,処理はErrHandler1に飛びます。AssistantオブジェクトのOnプロパティとVisibleプロパティをTrueにします(5)(6)。そして(7)でアシスタントのアクション(アニメーションの種類)を指定します。ただ,前述のようにOnプロパティがTrueであれば,Showメソッドによってアシスタントは表示されますので,(6)のステートメントは省略しても構いません。しかし,VisibleプロパティがFalse(非表示)の場合,OnプロパティをTrueにした時点で,AnimationプロパティにmsoAnimationAppear(キャラクタ登場)が設定され,(7)で指定したアクションが表示されないことがあります。

 続く(8)で,WaitTimeプロシジャを呼び出します。このプロシジャは,指定時間(秒数)だけDoEventsメソッドを繰り返す以外に何もしていません(リストは省略)。これは単なる待ち時間です。実は,(7)でアクションを指定した後,(10)でShowメソッドを実行するまでの間には,少々時間が必要です。ここである程度の時間(マシンの能力に依存します)を置かないと,アクションがうまく実行されません。

 次のWithステートメントでNewBalloonオブジェクトを設定し(9),(10)のShowメソッドでバルーンを表示します。

 今回は,誌面の都合で割愛しましたが,バルーンに複数のボタンを表示して,クリックされたボタンによって処理を分岐したり,チェックボックスを表示し,ユーザーに項目を選択させるといった使い方もできます。

古庄 潤