Hey, Scripting Guy!

Scripting Guys が皆さんの質問にお答えします

Hey, Scripting Guy!

TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

詳細情報

Hey, Scripting Guy! カテゴリ別アーカイブ

Hey, Scripting Guy! 日付別アーカイブ

Hey, Scripting Guy! ダウンロード

Spacer

*

あるワークシートから別のワークシートにデータをコピーする方法はありますか

Hey, Scripting Guy! Question

Scripting Guy さん、よろしくお願いします。ある Excel ワークシートから別の Excel ワークシートにデータをコピーする方法はありますか。

-- AC

SpacerHey, Scripting Guy! AnswerScript Center

AC さん、こんにちは。ここで、ちょっとした内緒話をお教えしましょう。このコラムを執筆している Scripting Guy は、今朝少し疲れています。というのも、ローマからシアトルまで飛行機で移動し、帰宅したのが昨晩遅く (真夜中過ぎ) だったからです (ご参考までに、飛行時間が非常に長いのです)。移動に丸一日かかったせいで疲れていて、時差ぼけがあるにもかかわらず、彼は今朝 6 時に起きて出社したのです。なぜもう 1 日多く休みを取らずに、仕事に行ったのでしょうか。それは、彼が献身的なマイクロソフトの社員で、自分の仕事が "大好き" だからです。

それに加えて、12 月に丸々 1 か月間休みを取れるように、有給休暇を十分に残しておこうとしているからです。しかし、だれも、とりわけ上司と同僚は、そのことを知る必要はありません。

実際、今日の記事は興味深いものになるはずです。というのも、このコラムを執筆している Scripting Guy は、しばしば社内の廊下をさまよい、不幸にも彼に遭遇した人に対してこう言っています。「ある Excel ワークシートから別のワークシートにデータをコピーするスクリプトですか? もちろん、そのようなスクリプトなら "寝ながら" だって記述できますよ」と。

では、彼は本当に寝ながらでもそのようなスクリプトを記述できるでしょうか。この後すぐに判明します。

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

Set objWorkbook = objExcel.Workbooks.Open("c:\Scripts\Test.xls")
Set objWorksheet = objWorkbook.Worksheets("Sheet1")

Set objRange = objWorksheet.Range("A1:A20")
objRange.Copy

Set objExcel2 = CreateObject("Excel.Application")
objExcel2.Visible = True

Set objWorkbook2 = objExcel2.Workbooks.Add
Set objWorksheet2 = objWorkbook2.Worksheets("Sheet1")

objWorksheet2.Paste

なかなかやりますね。では、ある Excel ワークシートから別のワークシートにデータをコピーするスクリプトを、彼が寝ながら説明できるかどうか見てみましょう。このスクリプトでは、まず、Excel.Application オブジェクトのインスタンスを作成し、Visible プロパティを True に設定します。この設定により、画面上に表示される Microsoft Excel の実行インスタンスが作成されます。次に、Open メソッドを使用して C:\Scripts\Test.xls ファイルを開き、次のコード行を使用してそのファイルの最初のワークシートにバインドします。

Set objWorksheet = objWorkbook.Worksheets("Sheet1")

これは、非常に簡単でしたね。

では、次は何でしょうか。まず、データをクリップボードにコピーするため、コピーするデータの範囲 (コピーするセル) を指定してから、Copy メソッドを呼び出す必要があります。これを行うのが次の 2 行のコードです。

Set objRange = objWorksheet.Range("A1:A20")
objRange.Copy

ご覧のとおり、1 行目では Excel の Range オブジェクトのインスタンスを作成しています。この場合、Range オブジェクトには、セル A1 からセル A20 までが含まれます (もちろん、これは必要なデータの範囲に変更できます)。2 行目では、Copy メソッドを呼び出し、セル A1 から A20 まで (範囲内のすべてのセル) をクリップボードにコピーします。

さて、これも非常に簡単でしたね。

でも待ってください。まだ続きがあります。このデータを 2 つ目のワークシートに貼り付ける必要があります。このサンプル スクリプトでは、その情報を新しいブックに貼り付けます。ただし、必要に応じて、別の既存のブックを開いてデータを貼り付けることもできます。これを念頭に置いて、Microsoft Excel の新しいインスタンスを作成し、そのインスタンスにオブジェクト参照 objExcel2 を設定して、その Visible プロパティを True に設定します。

Set objExcel2 = CreateObject("Excel.Application")
objExcel2.Visible = True

見覚えがありますね。

Excel の 2 つ目のインスタンスを作成したら、Add メソッドを使用して新しい空のブックを objExcel2 に追加します。続いて、次のコード行を使用して、その新しいブックのワークシートにバインドします。

Set objWorksheet2 = objWorkbook2.Worksheets("Sheet1")

これで、後は、Paste メソッドを呼び出せば完了です。

objWorksheet2.Paste

鋭いですね。確かに Paste メソッドは、Range オブジェクトに属する Copy メソッドとは異なり、Worksheet オブジェクトに属するメソッドです。既定では、データはセル A1 (および必要な場合は隣接するセル) に貼り付けられます。では、このデータをどこか別の場所に貼り付ける場合にはどうするのでしょうか。それを実行できる唯一の方法は、セル A1 以外のセルをアクティブ セルにすることです。たとえば、次のコード行を使用して、ワークシートのセル D5 をアクティブ セルにすることができます。

objWorksheet2.Range("D5").Activate

これで、Paste メソッドを呼び出すと、データがセル D5 (および隣接するセル) に貼り付けられます。

ところで、このコラムを執筆している Scripting Guy がひどく疲れていることをだれかに知らせないよう、よろしくお願いします。実際問題として、本当のことを知られたら彼は家に帰され、大事な有給休暇の一部を消化することになりますから。今、このコラムを執筆している Scripting Guy は、ぼうっとして目を半分閉じた状態で歩き回りながら、支離滅裂な独り言を言っています。いずれにしても、これが彼のいつもの行動であることを考えると、だれも何 1 つ疑いません。


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