
Office Space へようこそ。Office Space は、Microsoft® Office アプリケーションのスクリプト作成に関するヒントとテクニックを紹介するコラムです。毎週火曜日と木曜日に新しいヒントを掲載します。過去のヒントについては、Office Space アーカイブを参照してください。Microsoft Office でのスクリプト作成について質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
1、2 週間前、Microsoft アシスタントの概要を説明し、アシスタントをスクリプトに組み込む方法を紹介する Office Space コラムを執筆しました。そのとき、アシスタントの吹き出しにチェック ボックスを追加できることに触れ、いずれその方法を紹介すると約束しました。
予想されたかもしれませんが、そのことを表明してから、大勢の人々が Scripting Guys のオフィスの外の芝生の上でキャンプをし、そのだれもがアシスタントの吹き出しにチェック ボックスを追加する方法をだれよりも先に知ろうとしています (まあ、少なくともオフィスの外で大勢の人がキャンプをしていると想定しています。いつも裏の出口を使うので、確かにはわかりません)。
あなたが外でキャンプをしているうちの 1 人だとしたら、テントの杭を引き抜いて、キャンプファイアを消し、家に帰る時が来ました (ちなみに、その最後のハンバーガーを召し上がる人はいますか)。今日のコラムでは、ついに、アシスタントの吹き出しにチェック ボックスを追加する方法をお教えします。
ありがたいことですが、Scripting Guys は、みんなで抱き合って喜びを分かち合ったりするタイプではないんです...。
このシリーズの第 1 部 (Microsoft アシスタントを初めて紹介したコラム) を読んでいない場合は、今の時点で読まれることをお勧めします。アシスタントを表示したり応答するための基本的なコードについては、ここでは説明しません (また、どうしてここ 1、2 週間もこの芝生の上でキャンプなんかしていたのかと自問自答されていることでしょう)。最初のコラムをお読みになっている方は、アシスタントの吹き出しに 3 つのチェック ボックスを表示する以下の簡単なスクリプトをご覧ください。
Const msoButtonSetOkCancel = 3
Const msoBalloonButtonOK = -1
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
objExcel.Assistant.On = True
objExcel.Assistant.Visible = True
objExcel.Assistant.Sounds = True
Wscript.Sleep 2000
Set objBalloon = objExcel.Assistant.NewBalloon
objBalloon.Heading = "Welcome to Excel"
objBalloon.Button = msoButtonSetOkCancel
objBalloon.Text = "Please select one or more of the following options:"
objBalloon.CheckBoxes(1).Text = "Option A"
objBalloon.CheckBoxes(2).Text = "Option B"
objBalloon.CheckBoxes(3).Text = "Option C"
objBalloon.Show
Set objWorkbook = objExcel.Workbooks.Add()
Set objWorksheet = objWorkbook.Worksheets(1)
objExcel.Assistant.Animation = 3
objExcel.Assistant.Visible = False
objExcel.Assistant.On = False
基本的なスクリプトをお探しなら、これはまさにうってつけです。このスクリプトは吹き出しに 3 つのチェック ボックスを表示しますが、どのチェック ボックスをオンまたはオフにするかには関係なく、Excel でワークシートを新規作成する操作と同じ操作を行います。でも、ご心配なく。これについては、すぐに説明します。
この時点では、チェック ボックスを表示する処理に注目しましょう。このスクリプトでは、まず 2 つの定数を定義しています。1 つは msoButtonSetOkCancel で、吹き出しに [OK] および [キャンセル] ボタンを表示するために使用します。2 つ目は msoBalloonButtonOK で、ユーザーが [OK] ボタンをクリックしたかどうかを特定するために使用します。前述のとおり、このスクリプトでは、どのボタンがクリックされても何の動作も行いません。これについては、後で対処します。
スクリプトの残りの部分は、次の 3 行のコードを除いて、前回使用したコードと同じです。
objBalloon.CheckBoxes(1).Text = "Option A" objBalloon.CheckBoxes(2).Text = "Option B" objBalloon.CheckBoxes(3).Text = "Option C"
おそらくおわかりでしょうが、これは実際に 3 つのチェック ボックスを吹き出しに追加するコードです。チェック ボックスを追加することは、非常に簡単です。チェック ボックスのインデックス番号と、そのチェック ボックスに表示するラベルとを合わせて指定するだけです。CheckBoxes コレクションの 1 つ目のチェック ボックスのインデックス番号は 1 であるため、このコードでは 1 つ目のチェック ボックスがコレクションに追加され、Option A というラベルが割り当てられます。
objBalloon.CheckBoxes(1).Text = "Option A"
既に 9 つのチェック ボックスがコレクションにあるとして、10 個目のチェック ボックスを追加したい場合、そのラベルは Option Number 10 にしてもよいでしょうか。もちろんです。
objBalloon.CheckBoxes(10).Text = "Option Number 10"
チェック ボックスを追加したら、Show メソッドを呼び出しています。これにより、アシスタントを吹き出しを付けて表示します。その後ユーザーが [OK] または [キャンセル] をクリックするのを待機しています。実際の表示は次のようになります。

ボタンがクリックされると、スクリプトは新しいワークシートを Excel のインスタンスに追加し、アシスタントを閉じます。これが、芝生の上で 2 週間もキャンプした価値のないものであれば、何がその価値に見合うかを教えて欲しいものです。
ところで、その残りのホット ドックはだれかのためにとってあるんですか。そうでなければ...。
まぁ、たしかに一理ありますね。このスクリプトは、実際に (チェック ボックスがある場合) どのチェック ボックスがオンにされているかを特定でき、それに基づいて何らかの処理を行うようにした方が、価値があるかもしれません。そんなことは可能でしょうか。もちろんです。
Const msoButtonSetOkCancel = 3
Const msoBalloonButtonOK = -1
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
objExcel.Assistant.On = True
objExcel.Assistant.Visible = True
objExcel.Assistant.Sounds = True
Wscript.Sleep 2000
Set objBalloon = objExcel.Assistant.NewBalloon
objBalloon.Heading = "Welcome to Excel"
objBalloon.Button = msoButtonSetOkCancel
objBalloon.Text = "Please select one or more of the following options:"
objBalloon.CheckBoxes(1).Text = "Option A"
objBalloon.CheckBoxes(2).Text = "Option B"
objBalloon.CheckBoxes(3).Text = "Option C"
If objBalloon.Show = msoBalloonButtonOK Then
If objBalloon.Checkboxes(1).Checked Then
strMessage = "You selected Option A." & vbCrLf
End If
If objBalloon.Checkboxes(2).Checked Then
strMessage = strMessage & "You selected Option B." & vbCrLf
End If
If objBalloon.Checkboxes(3).Checked Then
strMessage = strMessage & "You selected Option C."
End If
Wscript.Echo strMessage
End If
Set objWorkbook = objExcel.Workbooks.Add()
Set objWorksheet = objWorkbook.Worksheets(1)
objExcel.Assistant.Animation = 3
objExcel.Assistant.Visible = False
objExcel.Assistant.On = False
これは、スクリプトのうちアシスタントが実際に "しゃべる" 部分 (つまり、吹き出しが表示される部分) を変更したものです。最初のスクリプトでは、ただ Show メソッドを呼び出して、ボタンがクリックされるのを待機するだけでした。しかし今回は、Show メソッドを呼び出し、[OK] ボタンがクリックされたかどうかを確認しています。これには、この吹き出しのボタンに対する戻り値が、スクリプトの最初の部分で設定した定数 msBalloonButtonOK と等しいかどうかを特定します。
If objBalloon.Show = msoBalloonButtonOK Then
[OK] ボタンがクリックされなかった場合は、単純に If-Then ブロック全体を省略して、新しいワークシートを追加し、Office アシスタントを閉じます。
でも、ユーザーが [OK] をクリックした場合はどうなるのでしょう。その場合は、3 つの If-Then ステートメントを使って、チェック ボックスのいずれか (またはすべて) がオンにされているかどうかを確認します。これは、各チェック ボックス (インデックス番号により参照) の Checked プロパティが True であるかどうかで判断しています。
If objBalloon.Checkboxes(1).Checked Then strMessage = "You selected Option A." & vbCrLf End If
オンにされているチェック ボックスについては、strMessage という変数に保持されているメッセージにコメントを追加しています。各チェック ボックスの状態を確認したら、オンにしたチェック ボックスを表示するメッセージ ボックスを表示します。

これで全部です (なお、ここでは Wscript.Echo を使用しているため、このスクリプトを Cscript を使用してコマンド ウィンドウから実行した場合、結果はメッセージ ボックスではなくコマンド ウィンドウに表示されます)。
ええ、どのオプションが選択されたかをアシスタントが報告できるとしたら、そうしたいと思うでしょうか。まさにこの操作を実行する変更後のスクリプトを次に示します。このスクリプトでは、メッセージを作成したら、Close メソッドを使って最初の吹き出し (3 つのチェック ボックスが配置された吹き出し) を閉じ、新しい吹き出しを作成して表示しています。
Const msoButtonSetOkCancel = 3
Const msoBalloonButtonOK = -1
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
objExcel.Assistant.On = True
objExcel.Assistant.Visible = True
objExcel.Assistant.Sounds = True
Wscript.Sleep 2000
Set objBalloon = objExcel.Assistant.NewBalloon
objBalloon.Heading = "Welcome to Excel"
objBalloon.Button = msoButtonSetOkCancel
objBalloon.Text = "Please select one or more of the following options:"
objBalloon.CheckBoxes(1).Text = "Option A"
objBalloon.CheckBoxes(2).Text = "Option B"
objBalloon.CheckBoxes(3).Text = "Option C"
If objBalloon.Show = msoBalloonButtonOK Then
If objBalloon.Checkboxes(1).Checked Then
strMessage = "You selected Option A." & vbCrLf
End If
If objBalloon.Checkboxes(2).Checked Then
strMessage = strMessage & "You selected Option B." & vbCrLf
End If
If objBalloon.Checkboxes(3).Checked Then
strMessage = strMessage & "You selected Option C."
End If
objBalloon.Close
Set objBalloon2 = objExcel.Assistant.NewBalloon
objBalloon2.Text = strMessage
objBalloon2.Show
End If
Set objWorkbook = objExcel.Workbooks.Add()
Set objWorksheet = objWorkbook.Worksheets(1)
objExcel.Assistant.Animation = 3
objExcel.Assistant.Visible = False
objExcel.Assistant.On = False
2 回目に作成された吹き出しは、画面上では次のようになります。

非常にかっこいいですね。
Office アシスタントを使ってできるちょっとした操作は他にも 2、3 ありますが、これらについては特に約束はしません。Microsoft の警備員は、芝生でキャンプする人たちのことを快く思っていないようなので。でも、できるだけのことはしましょう。
とりあえず、そのポテトサラダを捨ててしまうのでしたら、...