
Office Space へようこそ。Office Space は、Microsoft® Office アプリケーションのスクリプト作成に関するヒントとテクニックを紹介するコラムです。毎週火曜日と木曜日に新しいヒントを掲載します。過去のヒントについては、Office Space アーカイブを参照してください。Microsoft Office でのスクリプト作成について質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
詩人やロマンチストに言わせると、本物の芸術ははかなくて移ろい行くものだということです。ほんの一瞬存在したかと思うとすぐに消え行き、再び現れることはないのです。とても素敵な言葉ですね。でも、おそらくこれは、上司にこれまで作業してきたグラフやチャートを見せて欲しいと言われたときに返す言葉にはなりません (「〜さん、本物のグラフやチャートは、はかなくて移ろい行くものなんですよね・・・」)。何もこれまで苦労して作成したグラフやチャートが真の芸術ではないと言っているのではありません。ただ、グラフやチャートを少なくともしばらくの間保存しておくのは悪い考えではないということです。
ここまでの話で、おそらく皆さんは今日のコラムのトピックが何かは既にお分かりですね。そう、Microsoft Outlook の予定の削除についてです。いえいえ、これではちょっと行き過ぎです。今日はグラフやチャートを保存する方法についてお話します。実際、このコラムでは、今後さらに磨きをかけて (上司さえも) 見とれてしまうようなグラフを作成できるように、皆さんの素敵なグラフを保存するためのいくつかの方法をご紹介します。
注 : 今日のコラムは、実は、シリーズでお届けしている Microsoft Excel でのグラフやチャートの作成についてのコラムの 4 番目に当たります。このため、グラフおよびチャート作成の基礎についてはここでは説明しません。今日のコラムの中でさらに詳しい説明が必要な事項がある場合は、「Office Space」のセクション「Microsoft Excel Graphs and Charts」(英語) からこのシリーズの過去のコラムを参照してください。 |
グラフとこれに関連するワークシート (つまり、グラフの作成に使用したデータを含むワークシート) の両方を保存する場合は、SaveAs メソッドを呼び出すだけで保存できます。ただし、SaveAs メソッドを使用する場合、かなり複雑になる場合があります。パスワードでワークシートを保護するオプションや、別のファイル形式で保存するオプション、自動的にバックアップ ファイルを作成するオプションを指定できるためです。今日のコラムでは、これらのオプションは特に使用しないことにします。ここでは 2 つの作業を実行するスクリプトを作成することだけが目的ですから。スクリプトの 1 つ目の作業は、次のような小さめの簡単なグラフを作成することです。

2 つ目は、新しく作成したグラフ (とワークシート) を C:\Scripts\Test.xls という名前で保存することです。ここで必要なのはこれだけです。
そしてなんとも幸運なことに、この 2 つの作業を実行できるスクリプトが偶然にもここにあります。
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Add()
Set objWorksheet = objWorkbook.Worksheets(1)
objWorksheet.Cells(1,1) = "Africa"
objWorksheet.Cells(2,1) = "Asia"
objWorksheet.Cells(3,1) = "Europe"
objWorksheet.Cells(4,1) = "North America"
objWorksheet.Cells(5,1) = "South America"
objWorksheet.Cells(1,2) = 33
objWorksheet.Cells(2,2) = 54
objWorksheet.Cells(3,2) = 23
objWorksheet.Cells(4,2) = 41
objWorksheet.Cells(5,2) = 56
Set objRange = objWorksheet.UsedRange
objRange.Select
Set colCharts = objExcel.Charts
colCharts.Add()
Set objChart = colCharts(1)
objChart.Activate
objChart.ChartType = -4100
objChart.SaveAs "c:\scripts\test.xls"
既に断ったとおり、すべてのコードの詳細な説明は省きますが、簡単に説明すると、まず、Excel.Application オブジェクトのインスタンスを作成し、新しいブックと新しいワークシートを追加しています。次に、このワークシートの Sheet 1 にデータを入力し、これを基にグラフを作成します。その後、グラフをアクティブにして、次のコードを使って素晴らしい 3-D 棒グラフを作成しています。
objChart.ChartType = -4100
どのコードもいい感じですね。ただし、今日のコラムの主題に本当に関係があるのは、このスクリプトの最後のコードです。つまり、新規作成したブックを実際に保存する次のコードです。
objChart.SaveAs "c:\scripts\test.xls"
ご覧のように、SaveAs メソッドを呼び出すからといって複雑にする必要はありません。ただ、SaveAs メソッドを呼び出して、新しいブックのパスを示すパラメータを 1 つ渡すだけです。簡単ですね。このコードを実行すれば、グラフ (とブックの他の部分) が保存されます。
ただし、このスクリプトは、C:\Scripts\Test.xls が存在していないことを前提にしています。このファイルが既に存在している場合は、このスクリプトでは自動的にこれを上書きすることはせず、次のようなメッセージ ボックスが表示されます。

わかります。このメッセージ ボックスは表示させたくないですよね。安心してください。例によって Scripting Guys は解決方法を知っています (たしかに、いつも正しい答えを知っているとは限りませんが・・・)。自動的に既存のファイルを上書きする場合は、SaveAs メソッドを呼び出すコードの前に次のコードを追加します。
objExcel.DisplayAlerts = False
DisplayAlerts を False に設定すると、エラー メッセージとメッセージ ボックスが表示されなくなり、スクリプトは自動的に既定のオプションの動作を行います。既存のファイルについてのメッセージ ボックスが表示された場合の既定のオプションは、ファイルの上書きです。DisplayAlerts を False に設定すると、スクリプトは自動的にファイルを上書きします。メッセージ ボックスは表示されません。
ところで、SaveAs メソッド (と DisplayAlerts の処理) は、ブックにグラフが含まれているかどうかにかかわらず機能します。つまり、新規作成したスプレッドシートを保存する場合も、ここで説明した簡単な手順に従えばいいだけです。
もちろん、関連するワークシートは保存せずに、グラフだけを保存したい場合もあるでしょう。これは、グラフを画像ファイルとしてエクスポートすることで実現できます。その場合は、ワークシートは保存されず、(レポートや Web ページにすぐに挿入できる) .GIF または .JPG イメージが作成されます。なんといっても、グラフをエクスポートする場合は、Export メソッドを呼び出すだけでよいので簡単です。
objChart.Export "c:\scripts\test.gif", "GIF"
ここでは、2 つのパラメータを渡しています。新しい画像ファイルへのパスと、グラフィック フィルタの名前です。ファイルを JPEG 形式でエクスポートする場合は、次のコードを使用します。
objChart.Export "c:\scripts\test.jpg", "JPG"
思ったよりも簡単だったかもしれませんが、どのようにすればいいかはわかりにくいですね。
でもちょっと待ってください。他にも方法があります。グラフをクリップボードにコピーして、画像を別のアプリケーションにすぐに貼り付けられるようにすることもできます。これはかなり複雑な操作に聞こえますが、グラフをクリップボードにコピーする場合でも、次のコード 1 行で済みます。
objChart.CopyPicture()
正直に言いますと、この方法はあまりに簡単で、呆れてしまうほどです。
クリップボードにグラフをコピーする必要などあるかとお考えの場合は、次のような状況を考えてください。以下のスクリプトは、グラフを作成し、そのグラフを画像としてクリップボードにコピーし、Microsoft Word を起動して、コピーした画像を Word 文書に貼り付けるものです (何ですか、「それしかしないのか」とは)。コードは次のようになります。
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Add()
Set objWorksheet = objWorkbook.Worksheets(1)
objWorksheet.Cells(1,1) = "Africa"
objWorksheet.Cells(2,1) = "Asia"
objWorksheet.Cells(3,1) = "Europe"
objWorksheet.Cells(4,1) = "North America"
objWorksheet.Cells(5,1) = "South America"
objWorksheet.Cells(1,2) = 33
objWorksheet.Cells(2,2) = 54
objWorksheet.Cells(3,2) = 23
objWorksheet.Cells(4,2) = 41
objWorksheet.Cells(5,2) = 56
Set objRange = objWorksheet.UsedRange
objRange.Select
Set colCharts = objExcel.Charts
colCharts.Add()
Set objChart = colCharts(1)
objChart.Activate
objChart.ChartType = -4100
objChart.CopyPicture()
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.Documents.Add()
Set objSelection = objWord.Selection
objSelection.Paste
たしかにこれは、はかなくも移ろい行くものでもないかもしれません。それでも、なかなか美しいですよ。

この場合もまた、必要なプログラミングはほんのわずかです。グラフをクリップボードにコピーしたら、単純に Word を起動して Visible プロパティを True に設定し (これは、単にすべてを画面上で確認できるようにするための操作です)、Add メソッドを使って新しい空白の文書を作成します。次に、Word の Selection オブジェクトのインスタンスを作成してから、Paste メソッドを呼び出してクリップボードの内容 (この場合はグラフ) を文書に貼り付けています。
objSelection.Paste
英国人の作家 D. H. ロレンスは、かつて「人間の魂には、パンよりも本物の美が必要だ」と言いました。つまり、このグラフという芸術作品を作成し、そしてこれを保存するスクリプトを手にした今、他に何が必要でしょうか。
となると、皆さんは本物の美を手にし、パンが必要でなくなったのですから、そのサンドイッチの残りをいただいてもいいですか。