
Office Space へようこそ。Office Space は、Microsoft® Office アプリケーションのスクリプト作成に関するヒントとテクニックを紹介するコラムです。毎週火曜日と木曜日に新しいヒントを掲載します。過去のヒントについては、Office Space アーカイブを参照してください。Microsoft Office でのスクリプト作成について質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
古い諺にあるように、"人 (man) はパンのみで生きているのではありません"。
注 : "人間 (human being) は性別に関係なく、パンのみで生きているのではない" と言う方が適切かもしれません。しかし、これはあまり語呂が良くありませんよね。さらに私たちは古い諺を書くことはなく、考えを述べる際、面白いことを何も考えつかなかった場合にそれらの諺をただ暗唱するだけです。 |
もちろん、諺の背景にあるのは、いろいろあるからこそ人生には味があるという考えです。つまり、同じことを何度も繰り返すことはできないということです。パンが悪いわけではありませんが、パイのように、他の物も必要です。
これは、他のすべての場合と同様に、スクリプト作成にも当てはまります。Microsoft Excel でのグラフの作成に関するこの連載のうち、最初の何回かは、縦棒グラフの作成に重点を置いて説明しました。しかし諺にあるように、人間は性別に関係なく、縦棒グラフだけで生きているのではありません。パイのように他の物も必要です。
少なくとも円グラフ (pie chart) は必要です。
今回は、円グラフ作成の芸術をご覧に入れましょう。まず、標準的な 3-D 円グラフを作成する簡単なスクリプトを次に示します。
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Add()
Set objWorksheet = objWorkbook.Worksheets(1)
objWorksheet.Cells(1,1) = "Operating System"
objWorksheet.Cells(2,1) = "Windows Server 2003"
objWorksheet.Cells(3,1) = "Windows XP"
objWorksheet.Cells(4,1) = "Windows 2000"
objWorksheet.Cells(5,1) = "Windows NT 4.0"
objWorksheet.Cells(6,1) = "Other"
objWorksheet.Cells(1,2) = "Number of Computers"
objWorksheet.Cells(2,2) = 145
objWorksheet.Cells(3,2) = 487
objWorksheet.Cells(4,2) = 211
objWorksheet.Cells(5,2) = 41
objWorksheet.Cells(6,2) = 56
Set objRange = objWorksheet.UsedRange
objRange.Select
Set colCharts = objExcel.Charts
colCharts.Add()
Set objChart = colCharts(1)
objChart.Activate
objChart.ChartType = -4102
今回はこのコードについて詳しく解説しません。UsedRange とは何か、なぜ Activate メソッドを呼び出したのかなどがわからない場合は、この連載の以前のコラムを参照してください。今回取り上げるのは、グラフ化されるデータと、データを 3-D 円グラフに変換する 1 行のコードの 2 つだけです。
今回使用する、組織内のコンピュータの使用分布を示すデータを次に示します。
オペレーティング システム | コンピュータ数 |
Windows Server 2003 | 145 |
Windows XP | 487 |
Windows 2000 | 211 |
Windows NT 4.0 | 41 |
その他 | 56 |
ところで、円グラフはこのようなデータに役立ちます。相対的な割合を示すときは必ず、円グラフを使用するはずです。この場合、487 台のコンピュータで Windows XP が実行されていることはあまり重要ではありません。本当に重要なのは、組織内の半数を超えるコンピュータで Windows XP が実行されていることです。円グラフならば、このような情報がひとめでわかります。
データを円グラフに変換することについてですが、今回のスクリプトでは、縦棒グラフを作成した以前のスクリプトとまったく同じコードを最初に使用します。まず Excel のインスタンスを作成してから、新しいブックとワークシートを作成します。次に、新しく作成したワークシートにデータを入力し、そのデータを選択してから、新しいグラフを追加します。その後、そのグラフを選択し、次のコード行を実行します。
objChart.ChartType = -4102
このコード行により、3-D 円グラフが作成されます。Microsoft Excel では、多くの種類のグラフを作成できます。各種類には、一意の ChartType 番号が割り当てられています (これらの番号については、MSDN の Microsoft Excel VBA ランゲージ リファレンスに記載されている xlChartType 列挙を参照してください)。たとえば、分割ドーナツ グラフを使用する場合はどうすればよいでしょうか。その場合は、グラフの種類を次のように設定します。
objChart.ChartType = 80
もちろん、ここで必要なのは分割したドーナツではなく、そういう名前の 3-D 円グラフです (ドーナツが粉々になる可能性まで考える Scripting Guy が少なくとも 1 人は大騒ぎするので断っておきます)。したがって、ChartType プロパティの値を -4102 に設定し、スクリプトを実行して、次のようなグラフを作成し直します。

いいですね。分割円グラフを作成する場合は、ChartType プロパティの値を 70 に設定します。作成されるグラフを次に示します。

なかなかですが大きいパイは渡しませんよ。
全体として見れば、完璧なグラフです。しかし、円の要素がやや見にくいですね。少しグラフを傾けると見やすくなるかもしれません。また、関心の対象は割合なので、すべてのコンピュータの何パーセントが異なるオペレーティング システムを実行しているのかがグラフからわかると良いですね。グラフの背景が灰色というのもあまり好きではありません。
わかりました。今回すべての希望に応えることはできませんが、古い円グラフの見栄えを良くする操作が実行できるかどうかについてはわかるでしょう。
それではまず、グラフを傾けることができるかどうかについて説明します。グラフの世界では、これはグラフの "仰角" の変更として知られています。既定では、新しいグラフの仰角は 0 度です。この角度を変更するには、Elevation プロパティの値を変更するだけで済みます。たとえば、次のコード行をスクリプトの最後に追加すると、仰角が 30 度のグラフが作成されます。
objChart.Elevation = 30
現時点のスクリプトを実行すると、次のようなグラフが作成されます。

既に大分見た目は良くなっていますね。また、グラフは上下に傾けるだけでなく、回転させることもできます。Windows XP を表す要素 (下の大きい要素) の位置を変更する場合は、次のように Rotation プロパティの値を変更するだけで済みます。
objChart.Rotation = 80
もちろん、まだコンピュータの割合は表示されていません。しかし、それについても処理できます。要素ごとの割合を表示するには、xlDataLabelsShowPercent という定数を定義 (この定数に値 3 を代入) してから、次のコード行をスクリプトの最後に追加する必要があります。
objChart.ApplyDataLabels xlDataLabelsShowPercent
次のようなグラフが作成されます。

ご覧のとおり、単純に ApplyDataLabels メソッドを呼び出して定数 xlDataLabelsShowPercent を渡しています。これは、ラベルを全体の割合として表示することを意味します。予想したかもしれませんが、データ ラベルを適用する方法は他にもあります。詳細については、Microsoft Excel VBA ランゲージ リファレンスを参照してください。
フォントが小さすぎますか。では大きくしましょう。データ ラベルのサイズ、色、フォント スタイル、およびその他のプロパティを変更するのは簡単です。行う操作は、最初の SeriesCollection (このような円グラフでは 1 つしかありません) にバインドし、DataLabels.Font プロパティを変更することだけです。たとえば、次のコード行では、フォント サイズを 14 ポイントに変更します。
objChart.SeriesCollection(1).DataLabels.Font.Size = 14
また、次のコード行では、ColorIndex を白に変更します。
objChart.SeriesCollection(1).DataLabels.Font.ColorIndex = 2
注 : グラフでの色の使用の詳細については、グラフに関する以前のコラムを参照してください。 |
もう 1 つ説明したいものがあります。3-D 円グラフだけでなく、すべての種類のグラフに適用されるちょっとした巧妙な技です。ここまで、円グラフはプロット エリアとして知られる小さい灰色のボックスにバインドされていました。この灰色のボックスがグラフにもたらす効果は (少なくともこの場合) まったくないと言えます。それに、このボックスはあまり好きではありません。好きでないのなら、削除しましょう。
objChart.PlotArea.Fill.Visible = False objChart.PlotArea.Border.LineStyle = -4142
プロット エリアまたはグラフ エリアを削除するには、適切なオブジェクト (PlotArea または ChartArea) を参照し、次に示す 2 つの操作を行うだけで済みます。
| • | Fill.Visible プロパティを False に設定します。 |
| • | Border.LineStyle プロパティを -4142 に設定します。これは、罫線を一切表示しないことを示す定数です。Visible プロパティを設定するだけでは目的を達することはできません。グラフの周りには、灰色の罫線が引き続き表示されます。この灰色の罫線を削除するには、LineStyle プロパティも構成する必要があります。 |
次のようなグラフが作成されます。

パンだけで生きることはできないかもしれませんが、上記のような円グラフは、幸せで充実した生活をそれだけで十分保証してくれるでしょう。
さあいよいよ大詰めです。コードを紹介するつもりはありませんが、今回学習したことと以前に学習したことを組み合わせれば、次のようなグラフを作成できるはずです。

まあ、コードをお見せしましょうか。これが最後ですよ。
Const xlDataLabelsShowPercent = 3
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Add()
Set objWorksheet = objWorkbook.Worksheets(1)
objWorksheet.Cells(1,1) = "Operating System"
objWorksheet.Cells(2,1) = "Windows Server 2003"
objWorksheet.Cells(3,1) = "Windows XP"
objWorksheet.Cells(4,1) = "Windows 2000"
objWorksheet.Cells(5,1) = "Windows NT 4.0"
objWorksheet.Cells(6,1) = "Other"
objWorksheet.Cells(1,2) = "Number of Computers"
objWorksheet.Cells(2,2) = 145
objWorksheet.Cells(3,2) = 487
objWorksheet.Cells(4,2) = 211
objWorksheet.Cells(5,2) = 41
objWorksheet.Cells(6,2) = 56
Set objRange = objWorksheet.UsedRange
objRange.Select
Set colCharts = objExcel.Charts
colCharts.Add()
Set objChart = colCharts(1)
objChart.Activate
objChart.ChartType = 70
objChart.Elevation = 30
objChart.Rotation = 80
objChart.ApplyDataLabels xlDataLabelsShowPercent
objChart.PlotArea.Fill.Visible = False
objChart.PlotArea.Border.LineStyle = -4142
objChart.SeriesCollection(1).DataLabels.Font.Size = 14
objChart.SeriesCollection(1).DataLabels.Font.ColorIndex = 2
objChart.ChartArea.Fill.ForeColor.SchemeColor = 49
objChart.ChartArea.Fill.BackColor.SchemeColor = 23
objChart.ChartArea.Fill.TwoColorGradient 1,1
objChart.ChartTitle.Font.Size = 24
objChart.ChartTitle.Font.ColorIndex = 2
objChart.Legend.Shadow = True