
TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
詳細情報
| • | |
| • | |
| • |
![]()
Scripting Guy さん、よろしくお願いします。定期的に行うデモンストレーションで、Excel ブックを開き、Sheet1 にあるすべての情報をコピーし、そのデータを新しい PowerPoint スライドに貼り付けたいと思っています。スクリプトを使用してこれを行う方法はありますか。
-- JG

JG さん、こんにちは。Hey, Scripting Guy! コラムはいつも、公開日の前日に執筆しています。つまり、今日のコラムが実際に執筆されたのは月曜日だということです。フットボール シーズンの真っ只中にある月曜日なので、今日のコラムは先週末に行われたフットボールの試合の中で感動的ないくつかの試合についての話題から始まると思っている方がいらっしゃるかもしれませんね (実際、感動的な試合はたくさんありました。ケンタッキー大学が LSU を破った試合、ボイシ州立大学がネバダ大学を 69 対 67 で破った試合、オレゴン州立大学が Cal を破った試合などです)。でも、そう思った方は間違いです。実を言うと、このコラムを執筆している Scripting Guy は、あまりフットボールの話をしたい気分ではないのです。少なくとも今日は。
その理由は、Scripting Guys は全員、ワシントン州に住んでいるからです。
注 : ええ、厳密に言えば、Dean Tsaltas はノヴァスコシア州ハリファックスに住んでいて、それがワシントン州でないのは私たちもよくわかっています。ですが、Dean はフットボールが頭に当たってもそれがフットボールだとわからないような人なので、先週末のフットボールの試合について彼がどう思っているかということは考慮する必要はないでしょう。 ええ、言われてみれば、私たちも、もしかすると Dean は実際に頭にフットボールを当てられたことが 1 〜 2 回あるのではないかと思ったことがあります。そう考えると、いろいろつじつまが合いますよね。 |
先週末は何がそんなに問題だったのでしょうか。まず、ワシントン ハスキーズは、前半では、全勝中のアリゾナ州立大学を 17 対 13 でリードしていたのに、結局、第 3 クォーターで大逆転されたのです。ハスキーズの過去 4 試合のハーフタイムの状況をご紹介しましょう。
| • | 全勝中で首位のオハイオ州立大学と同点でした。 |
| • | UCLA をリードしていました (UCLA は、Pac-10 Conference の試合で現在全勝中のチームです)。 |
| • | 13 位の USC をリードしていました。 |
| • | 12 位のアリゾナ州立大学をリードしていました。 |
そして、ハスキーズが勝利を収めたのは、この中の何試合かということについては、こう言えばわかっていただけるでしょうか。私たちは、とにかく今日はあまりフットボールの話をしたい気分ではないのです。
さらに、シアトル シーホークスの問題もあります。大丈夫です。私たちは今日はフットボールの話をしたくありませんが、シーホークスの話ならできます。シーホークスの最近の試合は、とてもフットボールなどと呼べるものではありませんから。シーホークスは、ピッツバーグ スティーラーズに敗れた 1 週間後、本拠地での試合でニューオリンズに完敗しました。ニューオリンズは、年間で 1 試合も勝利していなかったチームです。シーホークスの寛大さのおかげで、NFL で 1 回も勝利していないチームはセントルイスとマイアミの 2 チームだけになりました。しかも、セントルイスは来週シーホークスと対戦するので・・・。この先は言わなくても、おわかりいただけますよね。
そして、さらに追い討ちをかけるように、ワシントン州立大学クーガーズまでオレゴン大学に 53 対 7 で完敗したのです。
注 : ええ、確かに、このコラムを執筆している Scripting Guy は、ワシントン州立大学が負けても涙を流すことはめったにありません。ですが、このコラムを執筆している Scripting Guy は、(住んでいる地域にかかわらず、気のいい方々は皆そうでしょうが) オレゴン大学が勝つところは絶対に見たくないのです。 絶対にです。 |
もちろん、フットボールの話をしたくないとなると、1 つ問題があります。フットボールの話をしないなら、一体何の話ができるのか、ということです。ええと、野球のプレーオフの話ならいつでもできますよ。コロラド ロッキーズの話はいかがですか。それとも、ええと・・・。ちょっとお待ちください・・・。
ふむふむ。編集者から、Microsoft Excel ブックからデータをコピーしてそのデータを Microsoft PowerPoint スライドに貼り付けることができるスクリプトの記述方法について話したらどうかという提案がありました (彼女が言うには、彼女が最近家族と集まったときに皆で話したのはこの話題だそうです。そして皆で大いに楽しんだそうです)。私たちは、それが本当かどうか少し疑わしく思っています (編集者の家族の集まりに招待されたことがなくて本当に良かったとも思っています)。でも仕方がありません。試してみましょう。
Const ppPasteOLEObject = 10
Const ppLayoutBlank = 12
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Test.xls")
Set objWorksheet = objWorkbook.Worksheets(1)
objWorksheet.Activate
Set objRange = objWorkSheet.UsedRange
objRange.Copy
Set objPPT = CreateObject("PowerPoint.Application")
objPPT.Visible = True
Set objPresentation = objPPT.Presentations.Add
Set objSlide = objPresentation.Slides.Add(1,1)
objPresentation.Slides(1).Layout = ppLayoutBlank
objPPT.Windows(1).View.PasteSpecial ppPasteOLEObject
objExcel.Quit
では、このスクリプトのしくみをご説明しましょう (今日は他にすることもないので、まあいいでしょう)。まず、ppPasteOLEObject および ppLayoutBlank という 2 つの定数を定義します。ppPasteOLEObject 定数はクリップボードに OLE データが含まれていることをスクリプトに通知するのに使用し、ppLayoutBlank 定数は白紙のスライド (何も書かれていないスライド) を作成するのに使用します。
2 つの定数を定義したら、Excel.Application オブジェクトのインスタンスを作成し、Visible プロパティを True に設定します。これにより、Microsoft Excel のインスタンスが実行され、画面上に表示されます。次に、Open メソッドを使用して C:\Scripts\Test.xls ファイルを開き、次の 2 行のコードを使用して、この xls ファイルの最初のワークシートにバインドし、そのワークシートをアクティブにします。
Set objWorksheet = objWorkbook.Worksheets(1) objWorksheet.Activate
ワークシートに接続したら、次は、すべての情報 (データと書式の両方) をクリップボードにコピーします。信じられないかもしれませんが、この処理は次のたった 2 行の簡単なコードで行うことができます。
Set objRange = objWorkSheet.UsedRange objRange.Copy
1 行目では、単に Excel の Range オブジェクトのインスタンスを作成しています。このオブジェクトはワークシート上の全データを含む範囲を表します。どうして、この範囲にワークシート上の全データが含まれるとわかるのかというと、その理由は簡単で、ワークシートの UsedRange プロパティの値を設定しているからです。以前のコラムからご存知の方もいらっしゃるかもしれませんが、UsedRange プロパティの範囲は、データが存在する最初のセルからデータが存在する最後のセルまでで、この 2 つのセルの間にあるすべてのセルが含まれます。
つまり、データを保持するのに使用されているセル範囲全体です。
範囲を定義したら、Copy メソッドを呼び出して、データをクリップボードにコピーします。
では、今度は PowerPoint 側の処理に移ります。まず、PowerPoint.Application オブジェクトのインスタンスを作成し、Visible プロパティを True に設定します。これで、PowerPoint のインスタンスと Excel のインスタンスの両方が実行され、画面上に表示されていることになります。続いて、次の 2 行のコードを使用して、新しいプレゼンテーションを作成し、そのプレゼンテーションに新しいスライドを追加します。
Set objPresentation = objPPT.Presentations.Add Set objSlide = objPresentation.Slides.Add(1,1)
(特に理由はありませんが) 1 枚目のスライドは白紙にすることにしたので、次のコード行を使用して、スライドの Layout プロパティに ppLayoutBlank 定数の値を設定します。
objPresentation.Slides(1).Layout = ppLayoutBlank
ここで必要な処理は、次のように、ppPasteOLEObject 定数を渡して PasteSpecial メソッドを呼び出すことだけです。
objPPT.Windows(1).View.PasteSpecial ppPasteOLEObject
注 : PasteSpecial メソッドは View オブジェクトに属しています。また、View オブジェクトは Windows コレクションの子オブジェクトで、Windows コレクションは PowerPoint Application オブジェクトの子オブジェクトです (いやはや)。ですから objPPT.Windows(1).View.PasteSpecial という構文を使用したのです。 ご参考までに申し上げておくと、1 という数字は単に、1 つ目の PowerPoint ウィンドウ (このスクリプトの場合は唯一のウィンドウですが) を対象とするという意味です。 |
データを貼り付けたら、Quit メソッドを呼び出して Excel のインスタンスを終了します。データを貼り付けるまでは Excel を終了しないことをお勧めします。というのも、貼り付ける前に Excel を終了してしまうと、クリップボードにデータが存在しないという内容のエラーが発生することがあるからです。
ちなみに、ppPasteOLEObject という定数名が示すとおり、このスクリプトを使用すると Excel データは OLE 埋め込みオブジェクトとして貼り付けられます (貼り付けたデータをダブルクリックすると、スライド プレゼンテーション内で Excel のインスタンスを起動することができます)。動的に Excel にリンクすることなくデータだけを貼り付けたい場合は、次のように、PasteSpecial メソッドを呼び出す際にパラメータを省略します。
objPPT.Windows(1).View.PasteSpecial
どちらが良いか、両方の方法を試してみてください。
ところで、このコラムを執筆している Scripting Guy については心配無用です。彼は既に、今週行われるフットボールの試合 (ワシントン大学対オレゴン大学など) に備えて準備をしています。ハスキーズはダックスに勝つでしょうか。来週の火曜日になればわかるでしょう。火曜日のコラムがシステム管理スクリプトに関するコラムだった場合、それが意味することはたった 1 つです。ワシントン大学が負けて、再び、このコラムを執筆している Scripting Guy が、またしてもフットボールの話をしたい気分ではなくなっているということです。
または、彼が編集者の家族の集まりに招待されたということです。