Office Space: Microsoft Office アプリケーションのスクリプト作成に関するヒントとテクニック

Office Space

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

*

Microsoft Excel で折れ線グラフを作成する

今日のコラムで、シリーズでお届けした Excel でのグラフとチャートの作成についてのコラムをひとまず終了とします (まあ、まあ、泣かないでください。大丈夫ですよ)。グラフやチャートに関する操作をすべて取り上げたわけではありませんが、実際に作業にとりかかるには十分な情報をこれまでのトピックでご提供できていることを祈ります。基本を習得すれば、後はそれほど苦労せずに作業できると思います。これまでに WMI から ADSI にいたるまですべてを扱ってきたのですから、グラフやチャートもお手の物ですね。

締めくくりとして、2 つの作業を行いたいと思います。1 つ目は折れ線グラフを紹介することで、2 つ目は既に取り上げたコードの一部を使って、そのグラフを少しばかり装飾することです。これにより、折れ線グラフの作成および編集方法を説明できるだけでなく、書式設定を簡単に変更する方法についても少しご説明できます。2 つぶんのコラムを 1 つにまとめたようなものです。

どうですか。大丈夫だと申し上げたでしょう。

まず、折れ線グラフの基本について説明しましょう。折れ線グラフは、通常、時系列の変化の追跡に使われるグラフで、傾向や異常を簡単に見つけることができます。たとえば、次のようなデータセットがあるとします。これは、先週、3 つのドメイン コントローラへのログオンを試みたユーザーの数を示しています。

Monday (月曜日)

Tuesday (火曜日)

Wednesday (水曜日)

Thursday (木曜日)

Friday (金曜日)

atl-dc-01

82

85

91

178

91

atl-dc-02

104

87

93

100

96

atl-dc-03

78

76

95

90

91

この表をぱっと見ただけでは、特におかしなところはないと思えるかもしれません。しかし、実際にこのデータをグラフにしてみると、よくわかります。

Microsoft Excel


ご覧のとおり、木曜日に atl-dc-01 に対して異常に多数のログオンが試行されています。なぜでしょう。よくはわかりませんが、ユーザーをブロックして、ユーザーの再ログオンが必要になるようなネットワーク障害が発生していた可能性があります。ひょっとしたら、atl-dc-01 が停止して、すべてのユーザーが再ログオンする必要があったのかもしれません。または、単に可能性としてですが、第三者によりシステムのハッキングが試みられた可能性もあります。このようなグラフによって、必ずしも通常とは異なる状態が発生している理由を知ることができるというわけではありませんが、木曜日にいつもとは違う何かが起きていることははっきりとわかります。また、念のために、これを調査する必要があることもわかります。折れ線グラフはこのような形で役に立ちます。

Excel の折れ線グラフのまた別のメリットとしては、以前のコラムで説明した縦棒グラフや円グラフと同じように簡単に作成できることです。適切にデータ テーブルを作成 (この場合は、各コンピュータを行に、各曜日のログオン試行数を列に配置) している限り、ChartType を 65 に設定するだけで、目的の操作を実行できます。上記のグラフを作成するスクリプトを実際に見てみましょう。

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Add()

Set objWorksheet = objWorkbook.Worksheets(1)

objWorksheet.Cells(1,2) = "Monday"
objWorksheet.Cells(1,3) = "Tuesday"
objWorksheet.Cells(1,4) = "Wednesday"
objWorksheet.Cells(1,5) = "Thursday"
objWorksheet.Cells(1,6) = "Friday"

objWorksheet.Cells(2,1) = "atl-dc-01"
objWorksheet.Cells(2,2) = 82
objWorksheet.Cells(2,3) = 85
objWorksheet.Cells(2,4) = 91
objWorksheet.Cells(2,5) = 178
objWorksheet.Cells(2,6) = 91

objWorksheet.Cells(3,1) = "atl-dc-02"
objWorksheet.Cells(3,2) = 104
objWorksheet.Cells(3,3) = 87
objWorksheet.Cells(3,4) = 93
objWorksheet.Cells(3,5) = 100
objWorksheet.Cells(3,6) = 96

objWorksheet.Cells(4,1) = "atl-dc-03"
objWorksheet.Cells(4,2) = 78
objWorksheet.Cells(4,3) = 76
objWorksheet.Cells(4,4) = 95
objWorksheet.Cells(4,5) = 90
objWorksheet.Cells(4,6) = 91

Set objRange = objWorksheet.UsedRange
objRange.Select

Set colCharts = objExcel.Charts
colCharts.Add()

Set objChart = colCharts(1)
objChart.Activate

objChart.ChartType = 65

このコードがまったく理解できない場合は、グラフとチャートの作成についてのシリーズの最初のコラムを参照してください。簡単に説明すると、Excel.Application オブジェクトのインスタンスを作成し、Visible プロパティを True に設定しています。続いて、新しいブックとワークシートを作成して、データを入力しています。

データの入力後は、データを選択して新しいグラフを作成し、これをアクティブにしています。その後、次のコードを使って縦棒グラフ (標準のグラフ形式) を折れ線グラフに変更しています。

objChart.ChartType = 65

とても簡単です。

もちろん、もう少しこのグラフの見栄えをよくできないわけではありません。まず、プロット エリアに既定のグラデーション カラーである "海" を適用します。この操作に必要なのは 1 行のコードだけです。結果として、次のようなグラフが作成されます。

Microsoft Excel


注 : ご参考までに、ここで使用したコードは次のとおりです。

objChart.PlotArea.Fill.PresetGradient 1,1,7

PresetGradient メソッドの詳細については、「縦棒グラフに色と飾りを追加する」 を参照してください。

個々の折れ線、特に青い折れ線が見にくいことを除けば、悪くないですね (ええ、あえてこの折れ線が見にくくなるようにグラデーションで塗りつぶしました)。でも、これは簡単に修正できます。Excel の折れ線グラフでは、各折れ線は SeriesCollection コレクションのメンバになります (なお、SeriesCollection コレクションの各メンバは、Series オブジェクトになります)。また、各折れ線には一意のインデックス番号があります。1 つ目の折れ線のインデックス番号は 1、2 つ目の線のインデックス番号は 2、というぐあいです。折れ線グラフ内の折れ線のプロパティを変更する場合は、該当する SeriesCollection メンバを参照し、変更をすればよいのです。たとえば、以下の 3 行のコードは、3 本すべての SeriesCollection 線の太さを (1 本ずつ) 中程度の太さに変更します。

objChart.SeriesCollection(1).Border.Weight = -4138
objChart.SeriesCollection(2).Border.Weight = -4138
objChart.SeriesCollection(3).Border.Weight = -4138

注 : -4138 などの奇妙な数字によって線の太さが中程度になることが、どうしてわかるのでしょうか。ここでも例によって、Microsoft Excel 用の「VBA Language Reference」で「Constant Enumerations」(英語) を参照しました。この場合は、xlBorderWeight の値を調べました。

各 SeriesCollection 線の他のプロパティを変更することもできます。たとえば、次のコードでは、青い線がより読み取りやすい白の線に変更されます。

objChart.SeriesCollection(1).Border.ColorIndex = 2

線自体の色を変更したので、データ マーカーの色も変更しましょう。

objChart.SeriesCollection(1).MarkerBackgroundColorIndex = 2

いいえ、それほど難しくはありません。「VBA Language Reference」の「Series object」(英語) からプロパティの説明を参照してください。ここには、このコラムのスクリプトで変更した Border や MarkerBackgroundColorIndex をはじめとするプロパティ名が記載されています。このコラムで使用した例を参考に、応用してみてください。

今説明したすべての "付属の" コードをスクリプトの最後に追加したとしましょう。これにより、グラフはどのようになるでしょうか。これは、次のようになります。

Microsoft Excel


どうですか。これだけでも、見栄えよく、読みやすくなりました。

驚きの目で眺めているうちに、折れ線 1 (白の折れ線) のデータ マーカーが、濃い色のアウトラインで縁取られていることに気が付かれたかもしれません。これでデータ マーカーがよりはっきりと読み取れるようになっています。どうしてこれらのマーカーはアウトラインがあるのに、他の折れ線のマーカーにはアウトラインがないのでしょうか。それは、Excel の既定ではデータ マーカーの前景色 (アウトラインの色) と背景色 (塗りつぶしの色) は同じです。たとえば、黄色の折れ線は、前景色も背景色も黄色です。白の折れ線のマーカーについては、背景色しか変更していないので、これらのマーカーは変更前と同じ濃い青のアウトラインが残っています。このようなアウトラインを付けたい場合は、次のようなコードで折れ線の 2 および 3 のマーカーの前景色を濃い色 (黒など) に変更します。

objChart.SeriesCollection(2).MarkerForegroundColorIndex = 1
objChart.SeriesCollection(3).MarkerForegroundColorIndex = 1

この場合も、これらのプロパティ (その説明と設定方法) については、「VBA Language Reference」(英語) を参照してください。

しかし、グラフのタイトルを追加したり、グラフ エリアの背景を変更したり、影付きの枠内に凡例を表示する場合はどうでしょうか。つまり、次のようなグラフです。

Microsoft Excel


実のところ、このシリーズの過去のコラムをお読みいただいていれば、既にこの方法はご存知でしょう。ここでは、コードのすべてを説明することはしませんが (説明については過去のコラムを参照してください)、上記のような凝ったグラフを作成するスクリプトを以下に示します。

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Add()

Set objWorksheet = objWorkbook.Worksheets(1)

objWorksheet.Cells(1,2) = "Monday"
objWorksheet.Cells(1,3) = "Tuesday"
objWorksheet.Cells(1,4) = "Wednesday"
objWorksheet.Cells(1,5) = "Thursday"
objWorksheet.Cells(1,6) = "Friday"

objWorksheet.Cells(2,1) = "atl-dc-01"
objWorksheet.Cells(2,2) = 82
objWorksheet.Cells(2,3) = 85
objWorksheet.Cells(2,4) = 91
objWorksheet.Cells(2,5) = 178
objWorksheet.Cells(2,6) = 91

objWorksheet.Cells(3,1) = "atl-dc-02"
objWorksheet.Cells(3,2) = 104
objWorksheet.Cells(3,3) = 87
objWorksheet.Cells(3,4) = 93
objWorksheet.Cells(3,5) = 100
objWorksheet.Cells(3,6) = 96

objWorksheet.Cells(4,1) = "atl-dc-03"
objWorksheet.Cells(4,2) = 78
objWorksheet.Cells(4,3) = 76
objWorksheet.Cells(4,4) = 95
objWorksheet.Cells(4,5) = 90
objWorksheet.Cells(4,6) = 91

Set objRange = objWorksheet.UsedRange
objRange.Select

Set colCharts = objExcel.Charts
colCharts.Add()

Set objChart = colCharts(1)
objChart.Activate

objChart.ChartType = 65

objChart.PlotArea.Fill.PresetGradient 1,1,7

objChart.SeriesCollection(1).Border.Weight = -4138
objChart.SeriesCollection(2).Border.Weight = -4138
objChart.SeriesCollection(3).Border.Weight = -4138

objChart.SeriesCollection(1).Border.ColorIndex = 2
objChart.SeriesCollection(1).MarkerBackgroundColorIndex = 2

objChart.SeriesCollection(2).MarkerForegroundColorIndex = 1
objChart.SeriesCollection(3).MarkerForegroundColorIndex = 1

objChart.HasTitle = True
objChart.ChartTitle.Text = "Attempted Logons"
objChart.ChartTitle.Font.Size = 18

objChart.ChartArea.Fill.Visible = True
objChart.ChartArea.Fill.PresetTextured 15

objChart.ChartArea.Border.LineStyle = 1

objChart.HasLegend = True
objChart.Legend.Shadow = True

わかります。素敵なグラフの作成方法を説明したばかりなのに、グラフおよびチャートについてのコラムを少なくともしばらくの間は休止することにしてしまいました。でも、これは、皆さんがこれらの基本のレッスンを受けて、自ら素晴らしいグラフやチャートを作成できることを完全に信用しているというだけのことです。

ええ、もちろん、グラフおよびチャートについてのコラムを書くのが億劫になっただけという事実の言い訳に過ぎないかもしれません。でも "皆さんを完全に信用している" と言ったほうが聞こえがいいと思いませんか。というわけで、皆さんが作成されたグラフで、息を呑むほど美しく素晴らしいグラフがあれば、scripter@microsoft.com (英語) までお送りください。楽しみにしています。


ページのトップへページのトップへ