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 さん、よろしくお願いします。電子メール アドレスにリンクされたハイパーリンクを含む Excel ブックがあります。ワークシートでは、単に Yes というテキストが表示されています。テキストに設定されている電子メール アドレスを取得するスクリプトを記述する方法はありますか。

-- AK

SpacerHey, Scripting Guy! AnswerScript Center

AK さん、こんにちは。今日はあまりコラムに集中できていないことをお許しください。今日は 10 月 11 日木曜日で、2007 年度ノーベル文学賞の受賞者が発表される日です。確かに、皆さんは「でも、Scripting Guys は TechNet でスクリプトの日刊コラムを書いているのだから、ノーベル文学賞を受賞するチャンスはないだろう」と思っているでしょう。正直なところ、私たちも最初は同じように思いました。なにしろ、スクリプトの日刊コラムの執筆者でノーベル賞を受賞したことがある人はほとんどいないですからね (ええ、キュリー夫人でもです。彼女は 2 回ノーベル賞を受賞していますが、ノーベル物理学賞とノーベル化学賞を、それぞれ 1 回ずつ受賞しました)。

ノーベル賞の豆知識 : キュリー一家は 5 つのノーベル賞を受賞しました。キュリー夫人が 2 つ (化学賞と物理学賞)、夫のピエールが 1 つ (物理学賞)、娘のイレーヌ ジョリオ キュリーが 1 つ (化学賞)、そして娘の夫のフレデリック ジョリオ キュリーが 1 つ (化学賞) を受賞しました。ええ、とてもすばらしい功績です。ただし、Scripting Guys がキュリー一家全員が受賞したのと同じ数のノーベル文学賞を受賞していることをお伝えしておきたいと思います。

でも、ノーベル賞の歴史について調べ始めると、突然、期待が少し高まり始めました。たとえば、次のような理由からです。

ノーベル文学賞のこれまでの受賞者のリストを調べたときに、受賞者のほとんどが知らない人だということに気が付きました。彼らの作品を読んだことがないのは言うまでもありません。Selma Ottilia Lovisa Lagerlöf ですって。かっこいい名前ですが、聞いたことがありません。私たちが知る限りでは、だれも聞いたことがない作家で、だれも読まない作品を執筆していれば、ノーベル賞を受賞する可能性が大幅に高くなります。Scripting Guys よりも無名で、作品が読まれていない人は、おそらくいないでしょう。

2000 年の受賞者、Gao XingJian が同賞を受賞した少なくとも 1 つの理由は、"厳しい洞察力と言語の独創性" です。確かに、よく見積もっても私たちにはあまり洞察力がありませんし、言語の独創性も乏しいとしか言いようがありません。しかし、Scripting Guys よりも厳しい人などいません (そして、今年の賞を受賞し損なったら、さらに厳しくなりそうです)。

1974 年度は 2 人の受賞者がいましたが、そのうちの 1 人である Harry Martinson は、"露のしずくを捕らえて宇宙を映す作品" だという賞賛を受けました。どういう意味なのかわかりません。しかし、Hey, Scripting Guy! のコラムも露のしずくでも何でも捕らえていると思わずにはいられません。

まあ、実際の露のしずくキャッチャーは、捕らえられないかもしれませんが。

1931 年度のノーベル文学賞は Erik Axel Karlfeldt に贈られましたが、そのとき彼は既に亡くなっていました。いやだなあ、Scripting Guys だって故人が書くのと同じくらいの文章は書くことができますよね。

そうですね。"平均的な" 故人が書くのと同じくらいの文章は書くことができます、と言うべきでしたね。

とにかく、私たちは 1 日のほとんどを、電話が鳴るのを待ちながらぼんやり過ごすつもりです。ですが、Excel ワークシートに含まれているハイパーリンクの情報を取得するスクリプトを記述することにしましょう。これで AK さんの質問にお答えすることができます。また、今年のノーベル賞を受賞し損なうわずかな可能性があるため、このスクリプトを 2008 年度のノーベル賞を受賞するためのとても説得力のある事例にもなります。

スクリプトは次のとおりです、AK さん (そしてスウェーデン アカデミーの選考委員の皆さん)。

Set objExcel = CreateObject("Excel.Application") 
objExcel.Visible = True 
 
Set objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Test.xls") 
Set objWorksheet = objWorkbook.Worksheets(1) 
 
Set colLinks = objWorksheet.Hyperlinks 
 
For Each objLink in colLinks 
    Wscript.Echo "Displayed text: " & objLink.TextToDisplay 
    Wscript.Echo "Hyperlink: " & objLink.Address 
    Wscript.Echo 
Next

では、このスクリプトのしくみはどうなっているのか、ですって。私たちに聞くのではなく、2006 年度のノーベル文学賞受賞者の Orhan Pamuk に聞いてください。Orhan さん、あなたが本当にこの賞を受賞するに値した人物かどうか確かめてみましょう。

そうですか。ええと、ありがとうございます。どうやら、まず Excel.Application オブジェクトのインスタンスを作成し、Visible プロパティを True に設定するようです。この設定により、画面上に表示される Excel の実行インスタンスが作成されます。次に以下の 2 行のコードを使用して、C:\Scripts\Test.xls ファイルを開き、ファイルの 1 つ目のワークシートにバインドします。

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

ワークシートへのオブジェクト参照を作成したら、次のコード行を実行して、ワークシートに含まれているすべてのハイパーリンクのコレクションを取得できます。

Set colLinks = objWorksheet.Hyperlinks

次はどうするのか、ですって。ちょっと待ってください。Orhan さんに相談しなくてはいけませんから・・・。

お待たせしました。次に、ハイパーリンクのコレクションをループ処理する For Each ループを設定します。このループで行っている処理は、TextToDisplay プロパティと Address プロパティの値をエコー バックしているだけです。

Wscript.Echo "Displayed text: " & objLink.TextToDisplay 
Wscript.Echo "Hyperlink: " & objLink.Address

そうすると、次のような結果が出力されます。

Displayed text: Hey, Scripting Guy! 
Hyperlink: http://www.microsoft.com/technet/scriptcenter/resources/qanda/default 
.mspx 
 
Displayed text: Yes 
Hyperlink: mailto:scripter@microsoft.com?subject=Test

そうです。電子メール アドレスが少し変わった形式で表示されていますよね。この形式に問題がある場合は、代わりに次の For Each ループを使用してみてください (このループ処理の詳細の説明は割愛します)。

For Each objLink in colLinks 
    Wscript.Echo "Displayed text: " & objLink.TextToDisplay 
    strLink = objLink.Address 
    strLink = Replace(strLink, "mailto:", "") 
    arrLinks = Split(strLink, "?") 
    Wscript.Echo "Hyperlink: " & arrLinks(0) 
    Wscript.Echo 
Next

このコード ブロックでは、Replace 関数を使用して mailto: という文字列値のすべてのインスタンスを置き換えているだけです。その後 Split 関数を使用して、ハイパーリンク文字列を疑問符の箇所で分割します。すると、件名から電子メール アドレスを切り離すことができます (これが従来の単純な URL で、アドレスに疑問符が含まれていない場合はどうすればいいでしょうか。大丈夫です。この処理の結果として作成されるのは 1 つの項目を持つ配列で、その唯一の項目が URL になります)。その後、配列内の最初の項目の値をエコー バックすると、次のようになります。

scripter@microsoft.com

おわかりですね。

うーん、そうですね。アーネスト ヘミングウェイは、座り込んで、単純で短いスクリプトを 1 つ記述してノーベル賞を受賞したのではありません (これは Lucila Godoy Y Alca-Yaga にも当てはまるでしょうか。正直なところ、確信はありませんが、多分そうでしょう)。そのため、Excel ワークシートに含まれているハイパーリンクについて実行できる、ちょっとしたすばらしい処理をもう 1 つご紹介しましょう。ワークシート全体を処理し、すべてのハイパーリンクを抽出してから、各リンクを新しいウィンドウで開くスクリプトを次に示します。

Set objExcel = CreateObject("Excel.Application") 
objExcel.Visible = True 
 
Set objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Test.xls") 
Set objWorksheet = objWorkbook.Worksheets(1) 
 
Set colLinks = objWorksheet.Hyperlinks 
 
For Each objLink in colLinks 
    objLink.Follow(True) 
Next

このスクリプトと最初に説明したスクリプトの唯一の違いは、For Each ループにあります。最初に紹介した For Each ループでは、ワークシートに含まれる各リンクのプロパティ値をエコー バックしました。今回は、Follow メソッドを呼び出して、各リンクを新しいウィンドウで開きます。

For Each objLink in colLinks 
    objLink.Follow(True) 
Next

どうして、これらの各リンクが新しいウィンドウで開くとわかるのか、ですって。それは、NewWindow パラメータを True に設定したからです (これは、Follow メソッドで使用できる、いくつかの省略可能なパラメータの 1 つ目のパラメータです)。

: Follow メソッドで使用できる、他の省略可能なパラメータは何でしょうか。詳細については、MSDN の「Excel VBA ランゲージ リファレンス」を参照してください。

念のため、スクリプトをもう 1 つ説明しましょう。なにしろ、Knut Pedersen Hamsun でさえ、『The Growth of the Soil』以外の作品を執筆しているのですから。

: 「Knut Hamsun FAQ」(英語) は頻繁に寄せられる 2 つの質問で構成されています。彼がいつ生まれたのかと、いつ亡くなったのかという質問です。

ワークシートに含まれているすべてのハイパーリンクを取得して、Internet Explorer のお気に入りに追加するスクリプトを次に示します。

Set objExcel = CreateObject("Excel.Application") 
objExcel.Visible = True 
 
Set objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Test.xls") 
Set objWorksheet = objWorkbook.Worksheets(1) 
 
Set colLinks = objWorksheet.Hyperlinks 
 
For Each objLink in colLinks 
    objLink.AddToFavorites 
Next

ご覧のとおり、これは前述のスクリプトに非常によく似ています。唯一違うのは、今回は Follow メソッドではなく AddToFavorites メソッドを呼び出したことです。

AK さん、これでうまくいくでしょう。では、私たちは座って電話が鳴るのを待つことにします。そろそろでしょう。ええ、私たちのオフィスにある旧式の電話が鳴り止まなくなるのは時間の問題でしょう。そろそろだと思うのですが・・・。


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