次の方法で共有


Office Space: Excel ワークシートにコメントを追加する

Office Space

Office Space へようこそ。Office Space は、Microsoft® Office アプリケーションのスクリプト作成に関するヒントとテクニックを紹介する新しいコラムです。毎週火曜日と木曜日に新しいヒントを掲載します。過去のヒントについては、Office Space アーカイブを参照してください。Microsoft Office でのスクリプト作成について質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

Excel ワークシートにコメントを追加する

Scripting Guys がサマー タイムの入れ替わりを非常に恐れていたときがありました。光と闇に対して異様な恐怖心を持っているからではなく、単純に時刻が変わると車の時計を変更しなければならないからです。どんなに大変なことかって。とにかく大変なのです。車の時計を変更するということは、ラジオのボタンを 2 つ押し続け (!) 、同時に時間を進めるために 3 番目のボタンを押すということでした。これで時間だけが変更されます。分を変更するには、また別の 2 つのボタンを押し続け、操作を繰り返します。時計をサマー タイムに切り替えるころには、もう一度それを元に戻す時がやってきました。

これは明らかにユーザー フレンドリなデザインではありませんでした。しかし、車のメーカーが何をしようとしていたかは理解できます。メーカーはスペースを節約し、できる限り多くの特徴と機能を 1 つの小さなダッシュボードに詰め込もうとしていたのです。これはスクリプト作成者が高く評価できる点です。結局私たちは、常にできる限り多くの情報をレポートに詰め込もうとしています。それは別に責めることではありませんが、必然的に、ユーザーに対して横や上下のスクロールを要求するワークシートやテキスト ファイルを作成することになります。これでもよいのですが、横にスクロールすることは、時計を変更するためにラジオの 3 つのボタンを使用するのとだいたい同じです。それでもうまくいくかもしれませんが、誰もそんなことをしたくありません。

Microsoft Excel では、セルにコメントを追加できるようにすることによってこの問題を解決しようとしました。コメントに含まれる情報は、直ちに画面に表示されません。そのセル上にマウス ポインタが置かれた場合に限り表示されます。たとえば、以下にワークシートのセルに追加されたコメントがあります。

Microsoft Excel

これは最善の方法ではありませんが、多くの場合、とんでもない横スクロールのワークシートよりは 1 歩先を進んでいます。つまり必要な情報を取得し、なおかつ同時にその情報を画面いっぱいに表示することができます。横スクロールは必要ありません。

それで、スクリプトを使用してセルにコメントを追加することはできますか。まだ質問があったのですね。

Set objExcel = CreateObject("Excel.Application") 
objExcel.Visible = True 
 
Set objWorkbook = objExcel.Workbooks.Add() 
Set objWorksheet = objWorkbook.Worksheets(1) 
 
k = 1 
For i = 1 to 5 
    For j = 1 to 3 
        objWorksheet.Cells(i,j) = k 
        k = k + 1 
    Next 
Next 
 
objWorksheet.Cells(1, 1).AddComment "Test comment." 
objWorksheet.Cells(2, 3).AddComment "This is another test comment."

このスクリプトにごまかされないようにしてください。スクリプトは少し複雑に見えますが、データをワークシートに自動的に追加するためにいくつかの For Next ループを使用しているだけです。それ以外は、特にコメントを 2 つのセルに追加する部分が非常に簡単です。

スクリプトは、我々の大部分の Excel スクリプトと同じ方法から始まります。まず、Excel.Application オブジェクトのインスタンスを作成し、Visible プロパティを True に設定します (設定しない場合は、Excel は見えないウィンドウで実行され、我々は見ることができません)。Add メソッドを使用して新規ワークブックを作成し、オブジェクトへの参照 (objWorksheet) を worksheets コレクションの最初のワークシートに設定します。これには、次の 2 行のコードを使用します。

Set objWorkbook = objExcel.Workbooks.Add() 
Set objWorksheet = objWorkbook.Worksheets(1)

この時点では、ワークシートは見事にクリーンな状態です。ワークシートにはデータが何も入力されていません。このコードを使用して、単純に任意のデータをワークシートに書き込みます。

k = 1 
For i = 1 to 5 
    For j = 1 to 3 
        objWorksheet.Cells(i,j) = k 
        k = k + 1 
    Next 
Next

ここで何が起こるのか十分に理解していなくても心配しないでください。前にも言いましたが、これはセルにデータを入力するためだけに実行するのです。

あなたが心配すべき部分 (少なくとも興味を持っている部分) は、次です。

objWorksheet.Cells(1, 1).AddComment "Test comment." 
objWorksheet.Cells(2, 3).AddComment "This is another test comment."

これは、実際に 2 つのセルにコメントを追加している箇所です。最初の行では、行 1、列 1 のセル (セル A1) に接続し、AddComment メソッドを呼び出します。セルに追加するコメントとなる単一パラメータを AddComment に渡します。2 行目ではプロセスを繰り返しますが、今度は行 2、列 3 のセル (セル B3) にコメントを追加します。これによって、ワークシートは次のようになります (小さな赤い三角形は、セル A1 にコメントが含まれていることを示しています)。

Microsoft Excel

なかなか便利だと思いませんか。もちろんこのデモ スクリプトでは、ワークシートへのコメントの追加をめぐって大いに盛り上がるようなことはないかもしれません。偽データを含むセルに作りもののコメントを追加することは、この世で最もワクワクするようなことではないかもしれないということも認めましょう (他のものに比べれば、Scripting Guys はワクワクするのですが)。それでは、もっと現実的な例を見てみましょう。コンピュータにインストールされているすべてのサービスに関する情報を返すスクリプトがあります。サービスごとに、次の情報が記録されます。

  • サービス Name は、列 1 に書き込まれます。

  • サービス DisplayName は、列 2 に書き込まれます。

  • サービス State は、列 3 に書き込まれます。

  • サービス Description は、列 1 にコメントとして追加されます。

このスクリプトを実行すると、ワークシートは次のようになります。

Microsoft Excel

はい。作りもののコメントと偽データの例よりはずっとワクワクしますね。

スクリプトは次のとおりです。1 行 1 行見ていくことはしませんが、WMI を使用してサービス情報を取得し、その情報をワークシートに書き込むと言えば十分でしょう。さらに付け加えるなら、スクリプトの末尾でセルをすべて選択し (UsedRange プロパティを使用)、AutoFit メソッドを使用してすべての列を自動サイズ調整することによって、非常にきれいに見えるようになります。Scripting Guys からのちょっとしたおまけです。

そうでした。スクリプトは次のとおりです。

On Error Resume Next 
 
Set objExcel = CreateObject("Excel.Application") 
objExcel.Visible = True 
 
Set objWorkbook = objExcel.Workbooks.Add() 
Set objWorksheet = objWorkbook.Worksheets(1) 
 
strComputer = "." 
 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
Set colServices = objWMIService.ExecQuery("Select * From Win32_Service") 
 
i = 1 
 
For Each objService in colServices 
    objWorksheet.Cells(i, 1) = objService.Name 
    objWorksheet.Cells(i, 2) = objService.DisplayName 
    objWorksheet.Cells(i, 3) = objService.State 
    objWorksheet.Cells(i, 1).AddComment objService.Description 
    i = i + 1 
Next 
 
Set objRange = objWorksheet.UsedRange 
objRange.EntireColumn.Autofit

注目すべきなのは、スクリプトの最初の行が On Error Resume Next であるということです。通常、この最低限のエラー処理でさえサンプル スクリプトには含めません。サンプルをできる限り短くするためです。ただしこの場合、On Error Resume Next を使用しないと、問題が発生するおそれがあります。その理由は、いくつかのサービスには説明がないためです。つまり Description プロパティの値は Null です。WMI はそれでいいですが、AddComment メソッドはそうはいきません。Null 値をコメントとして追加しようとすると、スクリプトは失敗します。しかし On Error Resume Next が存在している限り、スクリプトは Null 値を書き込もうとして失敗しますので、単純にそのステップをスキップしてコードの次の行に移動します。

さらに追加すべきことは、本当に長い説明がある場合は、すべてのコメントが画面上に表示されない場合があるということです。しかしそれでも問題ありません。次のようなコードを追加して、コメントの高さと幅を大きくすることができます。

For Each objComment in objWorksheet.Comments 
    objComment.Shape.Height = 125 
    objComment.Shape.Width = 300 
Next

あるいは、ラジオのボタンを 3 つ押し続けてみることもできます。それで時計の時間を変更できるんだったら、他に何ができるかなんて想像もつきませんね。