次の方法で共有


Office Space: 利用可能なフォントの書式付きリストを取得する

Office Space

Office Space へようこそ。Office Space は、Microsoft® Office アプリケーションのスクリプト作成に関するヒントとテクニックを紹介する新しいコラムです。毎週火曜日と木曜日に新しいヒントを掲載します。過去のヒントについては、「Office Space アーカイブ」を参照してください。Microsoft Office でのスクリプト作成について質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

利用可能なフォントの書式付きリストを取得する

最近の若者は、このリストを簡単に手に入れることができます。Scripting Guys が若かりし頃、学校に行くためだけに 20 マイルも雪の中を歩かなければなりませんでした。そればかりか、学校に着いても、利用できるフォントは 1 つしかありませんでした。事をさらに悪くしているのは、その唯一のフォントが Courier だったのです。

わかります。そんな原始的な状況で、人々がなんとかやっていたなんて信じるのは難しいと思います。

もちろん、今は昔とは違います。現在のコンピュータには、Arial から Times New Roman、愛すべき古い Wingdings まで、ありとあらゆるフォントがあらかじめ同梱されています。これはすばらしい。しかし一連の問題が新しく発生しました。どのフォントがコンピュータにインストールされているかをどのように見分けることができますか。同じく重要なことですが、これらのフォントの形状をどのように知りますか(現実を直視すると、大部分の人々は Estrangelo Edessa と Eurostile™ Extended Two の区別がつかないからです。見たことがないはずはないのに)。

もちろん、時代遅れの古い Charmap.exe やコントロール パネルの [フォント] アイコンを常に使用して、コンピュータにある利用可能なフォントを表示することができます。フォントを 1 つずつ確認することが苦にならなければ、この 2 つのユーティリティでも十分に役立ちます。

文字コード表

しかし、印刷したり、時折参照したりすることができる、"すべての" フォントの書式付きリストやリファレンスが必要な場合はどうでしょう。Charmap.exe もコントロール パネルの [フォント] アイコンも、ここでは役に立たないことがわかります。しかし、多分そういうものを作成するスクリプトを使用する方法があるでしょう。多分。いや、スクリプトでも "そんなこと" はできないかもしれません。どうやらついていないようですね。

でもちょっと待ってください。結局のところ、そのとおりです。リファレンス シートなどを作成するために、Microsoft Word を活用するスクリプトを書くことができます。一体どうやってそんなことをお知りになったんですか。

ああ、そうでした。今日のコラムのタイトルは、秘密をばらしてしまうタイトルでしたよね。

それでいいんです。秘密がばれてしまったので、コンピュータにインストールされているフォントのコレクションを取得し、それぞれのフォントを使用して「The quick brown fox jumps over the lazy dog.」という文を入力するスクリプトをお見せしましょう。

スクリプトは次のとおりです。

On Error Resume Next 
 
Set objWord = CreateObject("Word.Application") 
objWord.Visible = True 
Set objDoc = objWord.Documents.Add() 
Set objSelection = objWord.Selection 
objSelection.Font.Size = 14 
 
For Each strFont in objWord.FontNames 
    If strFont <> "Courier" Then 
        objSelection.Font.Name = strFont 
        objSelection.TypeText strFont & _ 
            ": The quick brown fox jumps over the lazy dog." 
        objSelection.TypeParagraph 
    End If 
Next

最初に Microsoft Word のインスタンス (Word.Applcation) を作成し、Visible プロパティを True に設定します。結局のところ、このような装飾的なフォントをすべて使用する場合、そのフォントが実際に見えないことには意味がありません。Add メソッドを使用して空の文書を作成し、Word の Selection オブジェクトのインスタンスを作成します。最後に、Selection オブジェクトの Font.Size プロパティを 14 ポイントに設定し、処理に備えます。

Word オブジェクト モデルには、利用可能なフォントのコレクションを返すプロパティ FontNames が含まれています。私たちが行わなければならないのは、For Each ループを作成してそのコレクションをすべて取得することです。ループのたびに、異なるフォント名 Arial、New York、Rockwell Condensed を取り込み、その名前を変数 strFont に格納します。続いて、次のコード行を使用して、現在のフォントを strFont で表されるフォントに変更します。

objSelection.Font.Name = strFont

フォントを適切に設定してから、この 2 行のコードを使用して、フォント名とサンプル文 (「The quick brown fox jumps over the lazy dog.」) を入力し、最後に改行を挿入します。

objSelection.TypeText strFont & _ 
    ": The quick brown fox jumps over the lazy dog." 
objSelection.TypeParagraph

おわかりでしょうか。TypeText メソッドは、文書内に指定したテキストを入力するために使用し、TyepParagraph メソッドは、文の最後に復帰と改行を挿入する (キーボードで Enter キーを押すのと同等) ために使用します。

このプロセスは、利用可能なあらゆるフォントで対象の文を印刷するまで続きます。これによって、Word 文書は次のようになります。

文字コード表

すごいですね。私たちが唯一考えられたのは、"大成功だ" と喜んでいる姿でもあるのです。

全体的に見れば、これはかなりうまくできています。コンピュータにインストールされている各フォントの名前を示すだけでなく、各フォントの形状がわかる文書が作成されました。ただし、ある異常事態に遭遇してしまいました。For Each ループ内で、フォント名が Courier かどうかをチェックすることに留意した方がいいかもしれません。Courier の場合はサンプル文を印刷せず、その代わりループ内の処理を省略して次のフォントに移るようにします。

For Each strFont in objWord.FontNames 
    If StrFont <> "Courier" Then 
        objSelection.Font.Name = strFont 
        objSelection.TypeText strFont & _ 
            ": The quick brown fox jumps over the lazy dog." 
        objSelection.TypeParagraph 
    End If 
Next

その理由は、実を言うとわかりません。しかし Courier を残しておくと、スクリプトは Courier でサンプル文を忠実に印字して終了します。エラーは生成されずに、スクリプトは終了するだけです。Courier での印字を回避するためにスクリプトを修正し、"すべての" フォントを取得しました。期待どおりの動作ですね。これがバグであるか機能であるか、また、Word あるいは使用しているテスト コンピュータに問題があるのかどうか確信が持てませんが、詳しく調べる必要があります (Windows XP Service Pack 1 で発生する問題は、Windows XP Service Pack 2 で解決されているかもしれませんが)。ただし、Courier がどのように見えるかをたまらなく知りたい場合は、For Each ループを次のように変更して、どのように動作するかを確認します。

For Each strFont in objWord.FontNames 
    objSelection.Font.Name = strFont 
    objSelection.TypeText strFont & _ 
        ": The quick brown fox jumps over the lazy dog." 
    objSelection.TypeParagraph 
Next

すでに述べたように、我々古い人間は、MTV が実際にミュージック ビデオを放映した頃の昔話を終えたらすぐに、その動作を確認するでしょう (いえ、本当です。断言します。我々は作り話なんてしていませんよ)。