Silverlight をインストールするには、ここをクリックします*
Japan変更|すべてのMicrosoft のサイト
Microsoft TechNet
|TechCenter|ダウンロード|TechNet プログラム|サブスクリプション|My TechNet|セキュリティ情報|TechNet アーカイブ|サイトマップ
サイトの検索


Hey, Scripting Guy!

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

Hey, Scripting Guy!

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

詳細情報

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

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

Hey, Scripting Guy! ダウンロード

Spacer

*

オーディオ ファイルの拡張データを Excel ブックにコピーする方法はありますか

Hey, Scripting Guy! Question

Scripting Guy さん、よろしくお願いします。多数のスピーチや音声によるトレーニング セッションのオーディオ ファイルを持っていますが、これらのファイルは分類していません。ただし、すべての ID3 タグ (ファイルの拡張データ) は最新の状態になっています。これらのファイルから ID3 情報を抽出して Excel ブックに入力する方法はありますか。
-- FB

SpacerHey, Scripting Guy! AnswerScript Center

FB さん、こんにちは。ここ Scripting Guys の世界本社で、私たちは常に一歩先を行こうとしています (何ですか。何の一歩先に行こうとしているのか、ですって。そんなことは聞かないでください)。たとえば、FB さんは、分類されていない一連のオーディオ ファイルがあるとおっしゃいました。また、すべての ID3 情報 (アーティスト名、トラック番号などの、ファイルのすべての拡張データ) を抽出し、その情報を Excel ブックに書き込む必要があるそうです。私たちは FB さんのお役に立てるのか、ですって。もちろんです。そのうえ、さらに一歩先に進み、スクリプトを使用して、選択したフィールドに基づいて情報を並べ替える方法についても、完全無料でご説明します。皆さんが、これ以上に良い取引を見つけられるかどうか見てみたいものです。

本当ですか。1 つ買えばあと 2 つ無料でもらえるのですか。まさか。それは私たちが提案していたのよりもずっと良い取引ですね。そのようなことをして、どうやって商売が成り立っているのか不思議ですよね。Scripting Guys は今日の午後にちょっと買い物に出掛けた方が良さそうですね。

もちろん、Scripting Guys がどうやって生計を立てているのかを不思議に思っている方もいらっしゃることでしょう。というのも、たいていの人がご存じのとおり、Scripting Guys がしていることといえばスクリプトの日刊コラムの執筆だけで、しかも、スクリプトについては、やっとのことで説明をしているという感じです。たとえば、最近読者の方から電子メールをいただきました。その方は、私たちが皆さんに紹介したスクリプトについて感謝していましたが、コラム自体にはいくつか "余分な (superfluous) 文章" が含まれていたと指摘していました。要点をわかりやすくするため、その読者の方はすべての余分な文章を緑色で強調表示していました。強調表示された余分な文章はたくさんあったのか、ですって。こう言えばわかっていただけるでしょう。次回皆さんが Word 文書でテキストを強調表示しようとすると、「世界中、どこを探しても緑色のインクがないようです」というメッセージが表示されると思います。このメッセージが表示された場合は、その理由はもうおわかりですね。

: Merriam-Webster 社の辞書によると、superfluous という単語には "一定の数量以上に余分のあること、不要な" という意味があるようです。これは、このコラムを表している言葉ではありません。このコラムを執筆している Scripting Guy を表している言葉です。

この Scripting Guy を監督する立場にある人は皆、すぐに納得するでしょう。

しかし、その話については、お終いです。私たちは提案があると言いましたよね。ええ、FB さんに提案があるのです。

Const xlAscending = 1 
Const xlYes = 1 
 
Set objExcel = CreateObject("Excel.Application") 
objExcel.Visible = True 
 
Set objWorkbook = objExcel.Workbooks.Add() 
Set objWorksheet = objWorkbook.Worksheets(1) 
 
objExcel.Cells(1, 1) = "Title" 
objExcel.Cells(1, 2) = "Artist" 
objExcel.Cells(1, 3) = "Album Title" 
objExcel.Cells(1, 4) = "Year" 
objExcel.Cells(1, 5) = "Track Number" 
objExcel.Cells(1, 6) = "Genre" 
objExcel.Cells(1, 7) = "Duration" 
objExcel.Cells(1, 8) = "Bit Rate" 
 
i = 2 
 
Set objShell = CreateObject ("Shell.Application") 
Set objFolder = objShell.Namespace ("C:\Audio") 
 
For Each strFileName in objFolder.Items 
    objExcel.Cells(i, 1) = objFolder.GetDetailsOf(strFileName, 10) 
    objExcel.Cells(i, 2) = objFolder.GetDetailsOf(strFileName, 16) 
    objExcel.Cells(i, 3) = objFolder.GetDetailsOf(strFileName, 17) 
    objExcel.Cells(i, 4) = objFolder.GetDetailsOf(strFileName, 18) 
    objExcel.Cells(i, 5) = objFolder.GetDetailsOf(strFileName, 19) 
    objExcel.Cells(i, 6) = objFolder.GetDetailsOf(strFileName, 20) 
    objExcel.Cells(i, 7) = objFolder.GetDetailsOf(strFileName, 21) 
    objExcel.Cells(i, 8) = objFolder.GetDetailsOf(strFileName, 22) 
    i = i + 1 
Next 
 
Set objRange = objWorksheet.UsedRange 
Set objRange2 = objExcel.Range("F1") 
 
objRange.Sort objRange2, xlAscending, , , , , , xlYes

あらゆるすばらしい取引がそうであるように、私たちの取引では、まず xlAscending および xlYes という 2 つの定数を定義します。

: どうすれば、中古車のディーラーが、本当に最高の取引を提案しているかどうかがわかるでしょうか。取引中に、そのディーラーが xlAscending および xlYes という定数を定義してくれるかどうかを確認するのです。定義してくれる場合は、その車をすぐに買うべきです。

ご参考までに、これらの定数は、どちらもブックのデータを並べ替えるときに使用します。xlAscending 定数はデータを昇順 (A から Z の順) に並べ替えるようスクリプトに指示します。一方、xlYes 定数はブックに見出し行があることをスクリプトに指示します。

2 つの定数を定義したら、Excel.Application オブジェクトのインスタンスを作成し、Visible プロパティを True に設定します。この設定により、画面上に表示される Microsoft Excel の実行インスタンスが作成されます。この Excel の新しいインスタンスを使用して何を行うのかというと、まず、以下の 2 行のコードを使用して、新しいブックを追加し、そのブックの最初のワークシートにバインドします。

Set objWorkbook = objExcel.Workbooks.Add() 
Set objWorksheet = objWorkbook.Worksheets(1)

次は、このコード ブロックです。

objExcel.Cells(1, 1) = "Title" 
objExcel.Cells(1, 2) = "Artist" 
objExcel.Cells(1, 3) = "Album Title" 
objExcel.Cells(1, 4) = "Year" 
objExcel.Cells(1, 5) = "Track Number" 
objExcel.Cells(1, 6) = "Genre" 
objExcel.Cells(1, 7) = "Duration" 
objExcel.Cells(1, 8) = "Bit Rate"

ここでは、ワークシートの 1 行目に列見出しを挿入しています。たとえば、1 行目では、セル A1 (つまり、行 1、列1) に Title という値を設定しています。2 行目では、セル B1 に Artist という値を設定しています。これ以降についても同様です。見出し行を構成したら、i という名前のカウンター変数に値 2 を代入します。このカウンター変数は、ワークシート内の現在の行の位置を追跡するのに使用します。

: この変数に 2 という値を代入するのはなぜでしょうか。そのとおりです。ワークシートに拡張データを入力し始めるときに、行 2 から開始する必要があるからです (おわかりのように、行 1 には列見出しが設定されています)。

これで、オーディオ ファイルを取得する準備ができました。そのためには、まず Shell.Application オブジェクトのインスタンスを作成し、Namespace メソッドを使用して C:\Audio フォルダーにバインドします。

Set objFolder = objShell.Namespace ("C:\Audio")

どのようにして C:\Audio に格納されているすべてのファイルを取得するのか、ですって。簡単です。フォルダーの Items コレクション内のすべてのアイテムをループ処理する For Each ループを設定するだけです。

For Each strFileName in objFolder.Items

ループ内では、まず次のような数行のコードを実行します。

objExcel.Cells(i, 1) = objFolder.GetDetailsOf(strFileName, 10)

ここでは、GetDetailsOf メソッドを使用して、フォルダー内の 1 つ目のファイルから拡張データを取得しています (もっと正確に言うと、現在、strFileName 変数にパスが格納されているファイルから拡張データを取得します)。ここではどのような拡張データを取得しているのかというと、1 行目では、項目 10 、つまりオーディオ ファイルのタイトルを取得しています。

そうですね。1 つはっきりさせておくことがあります。Windows XP を実行しているコンピューターでこのスクリプトが実行される限りは、タイトルが取得されます。Windows Vista コンピューターでスクリプトを実行した場合は、ファイルの所有者名が取得されます。これは、Windows Vista では、多くの拡張データの値の番号が変更されているからです。

: このコラムを執筆している Scripting Guy は、いまだに Windows XP を実行しているのか、ですって。そうかもしれません。しかし、そうだとしても、それは彼流の Windows Vista を奨励する方法だということです。Windows Vista にアップグレードしますか。それとも、このコラムを執筆している Scripting Guy のようになりたいですか。

皆は Windows Vista を勧めるときにそう言います。

でも、慌てないでください。次の表に、このスクリプトで使用した各プロパティの名前と、Windows XP および Windows Vista のそれぞれに対応する値を示します。

プロパティ

Windows XP

Windows Vista

Title

10

21

Artist

16

13

Album Title

17

14

Year

18

15

Track Number

19

27

Genre

20

16

Duration

21

36

Bit Rate

22

28

必要なのは、該当 OS の列の値を使用するだけです。

さて、どこまで説明したでしょうか。そうでした。GetDetailsOf メソッドを使用して Title プロパティの値を取得したら、その値をセル "i、1" に代入します。現在、カウンター変数 i の値は 2 であるため、行 2、列 1 のセル、つまりセル A2 を指しているということになります。その後、他のすべてのプロパティの値についても同じ処理を繰り返します。カウンター変数の値を 1 増加したら、ループ処理の先頭に戻り、今度はコレクション内の 2 つ目のファイルに対して同じ処理を繰り返します。

すべてのオーディオ ファイルの拡張データをワークシートに追加したら、どうするのか、ですって。その処理が完了したら、次のコード ブロックを実行します。

Set objRange = objWorksheet.UsedRange 
Set objRange2 = objExcel.Range("F1") 
 
objRange.Sort objRange2, xlAscending, , , , , , xlYes

ここで、ワークシートのデータを並べ替えます。今日のコラムでは、ワークシートの並べ替えの詳細については説明しません。何しろ、この処理をメイン トピックとして取り上げている Office Space の記事 (英語) がありますからね。このコラムでは、最初に UsedRange プロパティを使用して、ワークシート内のデータが含まれているすべてのセルを選択するということだけ説明しておきましょう。その後、次のコード行を使用して、セル F1 のみで構成される小さな Excel の範囲を作成します。

Set objRange2 = objExcel.Range("F1")

なぜセル F1 なのか、ですって。私たちはワークシートのデータをジャンルで並べ替えることにしたからです (ジャンルは、列 F に一覧表示されているデータです)。プログラムで、列 F に基づいてワークシートのデータを並べ替えるには、列 F のいずれかのセルを 1 つ選択する必要があります。そして、セル F1 は適切なように思えました。

最後に、Sort メソッドを呼び出して、ワークシートをジャンルで昇順で並べ替え、並べ替えの対象から見出し行を除外します。

objRange.Sort objRange2, xlAscending, , , , , , xlYes

これで全部です。

今日のコラムはこれで終了です。私たちは月曜日もこれと同じような別の取引を使用してコラムを執筆するのか、ですって。正直なところ、当初、月曜日には、これとまったく同じ取引を使用してコラムを執筆するつもりでした。というのも、今日のコラムを見逃した人がいるかもしれないので、月曜日もこれと同じコラムを再度掲載しようと思っていたのです。ですが、月曜日は新しいコラムを公開した方が良いのではないかと、編集者に諭されました。編集者、ありがとう。本当にどうもご親切に…。


 

Microsoft