
Office Space へようこそ。Office Space は、Microsoft® Office アプリケーションのスクリプト作成に関するヒントとテクニックを紹介するコラムです。毎週火曜日と木曜日に新しいヒントを掲載します。過去のヒントについては、Office Space アーカイブを参照してください。Microsoft Office でのスクリプト作成について質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
ちょっとした雑学をお教えしましょう。ポール マッカートニー (そうです、あのポール マッカートニーです) には兄弟が 1 人います。ピーター マイケル マッカートニーと言い、彼も昔はロックンローラーでした。実際、マイク マクギアという名前でバンド Scaffolds で活動し、「Lily the Pink」という曲で実にイギリス ポップ チャートでナンバー ワン ヒットを飛ばしています。マイク マクギアも「Lily the Pink」も聞いたことがないですか。なるほど、現実的には、兄がポール マッカートニーであったとしたら、その弟の音楽に世間の注目を集めることは難しいものです。
ある意味では、Microsoft Word に組み込まれている数学関連機能は、ソフトウェア業界におけるマイク マクギアのようなものです。実際 Word には、加算や平均値を算出する機能などが実装されています。でも、現実問題として、兄が Microsoft Excel であったとしたら、その弟分である数学関連機能に世間の注目を集めることは難しいものです。
それでも、Word を使用して自動的にレポートを作成する場合は、Word の数学関連機能も利用できますよね。たとえば、次のような表を生成するとします。
Department (部門) | Number of Employees (従業員数) |
Administration (管理) | 211 |
Finance (財務) | 105 |
Human Resources (人事) | 45 |
Manufacturing (製造) | 673 |
Research (研究) | 38 |
Sales (営業) | 93 |
この表に、従業員数の合計を算出する行か、1 部門あたりの従業員数の平均を求める行をもう 1 行追加するとします。この場合、合計または平均を計算する VBScript コードをスクリプトに追加するか、Excel に処理を渡して、Excel を使って計算することができます。それ以外の方法としては、単純にコードを 1 行追加して、Word でこのような計算を行うこともできます。今日のコラムで取り上げるのは、この方法です。
より具体的には、表に数式を追加する方法について説明します。これには 2 つの理由があります。1 つ目の理由は、通常、いずれにしても数式を追加する必要があることです。2 つ目の理由は、先週のコラム「Microsoft Word で表を作成する」の続編として、このコラムを提供するためです (それに、これでこのコラム内のスクリプトのすべての行について細かい説明をしなくてもすみますから。ここでは、表を作成するコードについては説明せず、数式を挿入するコードについてのみ説明します)。
上記の表を作成するスクリプトを以下に示します (なお、このスクリプトでは書式設定も行っています)。
Const NUMBER_OF_ROWS = 1
Const NUMBER_OF_COLUMNS = 2
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.Documents.Add()
Set objRange = objDoc.Range()
objDoc.Tables.Add objRange, NUMBER_OF_ROWS, NUMBER_OF_COLUMNS
Set objTable = objDoc.Tables(1)
objTable.Cell(1, 1).Range.Text = "Department"
objTable.Cell(1, 2).Range.Text = "Number of Employees"
objTable.Rows.Add()
objTable.Cell(2, 1).Range.Text = "Administration"
objTable.Cell(2, 2).Range.Text = "211"
objTable.Rows.Add()
objTable.Cell(3, 1).Range.Text = "Finance"
objTable.Cell(3, 2).Range.Text = "105"
objTable.Rows.Add()
objTable.Cell(4, 1).Range.Text = "Human Resources"
objTable.Cell(4, 2).Range.Text = "45"
objTable.Rows.Add()
objTable.Cell(5, 1).Range.Text = "Manufacturing"
objTable.Cell(5, 2).Range.Text = "673"
objTable.Rows.Add()
objTable.Cell(6, 1).Range.Text = "Research"
objTable.Cell(6, 2).Range.Text = "38"
objTable.Rows.Add()
objTable.Cell(7, 1).Range.Text = "Sales"
objTable.Cell(7, 2).Range.Text = "93"
objTable.Rows.Add()
objTable.Cell(8, 1).Range.Text = "Total"
objTable.Cell(8, 2).AutoSum
objTable.AutoFormat(5)
前述のとおり、実際に表を作成するコードについての詳細な説明は省きます。ただし、簡単に説明すると、まず Word.Application オブジェクトのインスタンスを作成し、Visible プロパティを True に設定します。次に、新しい文書を作成し、Range オブジェクトのインスタンスを作成してから、Add メソッドを使用して新しいテーブルを Tables コレクションに追加しています。これについては、すべて先週のコラムで説明しています。
続いて、データを表に追加しています。すべてのデータを入力できたら、次のコードを使って空白の行を表の最後に追加します。
objTable.Rows.Add()
次に、次の 2 行のコードで、最後の行にデータを入力します。
objTable.Cell(8, 1).Range.Text = "Total" objTable.Cell(8, 2).AutoSum
1 つ目の行は、見ればわかりますね。単に、8 行目の最初のセルに「Total」(合計) という語を入力しています。
注 : おそらく覚えていらっしゃると思いますが、セルは "行, 列" という構文を使用して指定します。したがって、Cell(8, 1) は 8 行目の列 1 のセルを表します。 |
今回のコラムで注目すべきコードは、AutoSum メソッドを呼び出すコードです。このメソッドでは、数式を行 8 の 2 番目のセルに挿入しています。作成した表の構造から、ここでは AutoSum メソッドを使用することができます。AutoSum メソッドを呼び出すと、Word は数式があるセルのすぐ上のセル (この場合は行 7 の列 2) に、値があるかどうかを確認します。値がある場合は、自動的にその列のすべてのセル (つまり、数式の上にあるすべての値) を合計します。数式のすぐ上のセルには値がなく、左隣のセルに値がある場合は、自動的にその行内の値がすべて合計されます。ここまではよろしいでしょうか。すぐ上のセルにも左隣のセルにも値がない場合は、列内の値をすべて合計する動作に戻ります。
わかりにくいので、例をいくつかお見せします (どの例でも、AutoSum メソッドが呼び出されるセルには「AutoSum」という語を表示しています)。まず、1 つ目の例です。
A | 99 | 224 |
B | 23 | 445 |
合計 | AutoSum |
このとき、AutoSum で合計される 2 つの数値はどれでしょうか。それは簡単です。224 と 445 ですね。理由は、数式 AutoSum のすぐ上のセルに値があるからです。このため、列内の数値を合計しています。
もう 1 つ例を示します。
67 | 23 | AutoSum |
ええ、こちらはもっと簡単ですね。でも、要点をよく示しています。この場合は、67 と 23 が合計されます。その理由は、数式のすぐ上のセルに値がなく、左隣のセルに値があるからです。したがって、行内の値を合計します。
おわかりになったでしょうか。よろしいですね。
それでもまだよくわからないという場合も、ご心配なく。AutoSum の代わりに数式 Sum を使うと、列 (ABOVE) または行 (LEFT) のどちらの数値を合計するかを指定できます。たとえば、次のコードでは列の数値が合計されます。
objTable.Cell(8, 2).Sum(ABOVE)
簡単ですね。このコラムの表の例では、各行の数値の合計を算出しても意味はありませんが、このような計算をする場合は次のコードを使用します。
objTable.Cell(8, 2).SUM(LEFT)
なお、Average、Min、Max など、Word の他の数学関数を呼び出す場合も、この方法を使います。たとえば、部門あたりの従業員の平均数を算出する場合、コードは次のようになります。
objTable.Cell(8, 2).Formula "=Average(ABOVE)"
注 : このコラムの表の例では、「194.17」のような値が得られます。小数点以下が表示されないように数値の書式設定をする方法については、将来のコラムで説明します。ここではとにかく、平均値を計算し、小数点以下を省略するコードをご紹介しておきます。 objTable.Cell(8, 2).Formula "=Average(ABOVE) \# " & chr(34) & "0" & chr(34) & "" |
数式の計算対象とするセルの範囲を指定することもできます。たとえば、管理部門、財務部門、人事部門の従業員数のみを合計したいとします。この 3 つの数値は、B2、B3、B4 の各セルにあります (そうです、ここで Excel と同様の構文を使って、表内の個々のセルを参照します。なぜでしょう。とにかく、そういうものだからです)。次のコードは、これら 3 つのセルの値のみを合計します。
objTable.Cell(8, 2).Formula "=Sum(B2:B4)"
おわかりでしょうか。元に戻って最初のスクリプト (AutoSum メソッドを呼び出すスクリプト) を実行すると、次のような表が生成されます。

補足すると、次のコードを使って表の書式設定を行っています。
objTable.AutoFormat(5)
AutoFormat メソッドの詳細については、先週のコラムを参照してください (はい、たしかに、先週のコラムを利用してばかりいますね。バーゲンでもしなくてはならないかもしれませんね)。
これで、Microsoft Word の表に数式を挿入するスクリプトは完成しました。なにも Excel を使用しないように薦めているわけではありません。ご覧いただいたとおり、Word に組み込まれている数学機能はとても便利です。少なくとも、試してみてください。そして、ついでに、マイク マクギアの CD もチェックしてみてください。よろしくお願いします。