2012年8月25日土曜日

WordからExcelを操作するサンプルコード(Excelで作った辞書データを用いてWordで一括置換)

【まえがき】

Excelファイルに記載されたデータをもとにWord上で文章を作成するツールを作りたいという動機で、手始めに参考になりそうなプログラムを探していたところ、水野麻子さんの
というblog記事にて紹介されていた、渡辺真さんによる
というマクロが、『WordからExcelを操作する』実例としてコードの分量的にちょうど良かったので、参考に読んでみました。
マクロの概要を簡単に紹介すると、英日翻訳の補助ツールのようなもので、『下図に示すようなExcelに記載した日本語と英語の対訳表(以下では、「辞書ファイル」と呼んでいます)に基づいて、Wordファイル中の日本語を、対応する英語に置換する』といった内容になっています。

辞書ファイルの参考例 (渡辺真さんのマクロに付属のもの)
読んでみて、いくつか気になった点があったので、WordからExcelを操作するコードの動作テストも兼ねて、渡辺真さんが公開されているコードに自分なりに手を加えてみました。
「手を加えた」といいながら、練習もかねて、動作の流れのみオリジナルに合わせ、フルスクラッチで書き直しています。

 【オリジナルの仕様 (個人的に気になった点のみ)】

  • マクロ付きのWordファイルとして配布されている
    • Wordファイルの本文に配置した 「ボタン」からマクロを起動
    • 置換対象のWordファイルをダイアログで選択する必要あり
    • 置換に用いるExcelファイル(辞書ファイル)の配置場所が固定
    • 辞書ファイルのファイル名を、Wordファイル中の所定欄に記入することで指定
  • 利用にあたり「参照設定」が必要
    • ※ 使用中のOfficeが2010以外の場合
  • 辞書ファイルの仕様
    • あらかじめ 、置換に用いる語句を語数順(降順)に並べ替えておく必要あり
  • マクロ実行中にWordの画面が固まる

 【変更点】

  • アドインに変更
    • 現在開いている文章を置換対象に
      • マクロ実行にあたりWordファイルを開く手間を削減
      • 置換対象のWordファイルの選択を不要に
    • 辞書ファイルをダイアログで選択するように
  • 「参照設定」なしで動作するように
  • 辞書ファイルの仕様変更
    • 手作業での単語の並べ替えを不要に
  • マクロ実行中も、適宜、画面の更新を行うように
なお、翻訳を生業としているわけではないので、これらの変更が、実際の翻訳作業における使い勝手を改善するものなのか正直よくわかりません(『一般的には、こうした方がいいんじゃないかなぁ』という程度の曖昧とした感覚で変更を加えています)。

また、一部、オリジナルのマクロに比べ、改悪している(設定の自由度が落ちている)部分があります。具体的には、オリジナルのマクロでは、辞書ファイルの記入方法(置換対象の語句、置換後の語句を何列目に記載するか、どのシートを使うかなど)は、Wordファイル中の所定欄に記入することで変更できたのに対し、今回作成したコードでは、辞書ファイルの記入方法が固定(コード中で指定)されています。

【今回作成したコード】

以下に、メインのモジュール(ModuleReplaceWithExcel.bas) を表示しています。


実際に作成したコードには、他に、
  • 処理時間計測用のクラスモジュール (Stopwatch.cls) 
  • 辞書データ用の構造体を定義したモジュール (TypeReplaceData.bas) 
  • アドインとして機能させるためにドキュメントに直接記載したコード (ThisDocument.dcm)
が含まれています。これらを含む全コードを、GitHubで公開しています。
実際にテンプレートファイルとして使ってみたい場合は、下記の手順でご利用ください。
  1. GitHubを開いて [↓ ZIP]ボタンを押して、全コードをダウンロード
  2. 解凍後、build.bat を実行(ダブルクリック)
  3. binフォルダ内に、テンプレートファイルが作成されるので、適宜インストール
    ※ アドインのインストール方法については、添付のマニュアル(manual.doc)にも記載しています。
なお、ソースコードのライセンスについてですが

  クリエイティブ・コモンズ・ライセンス

余談ながら、オリジナルのものに従ってライセンスにCC(Creative Commons)を適用したのですが、プログラムのソースコードに対してCCを適用することにどの程度の意味があるのか自分自身よくわかっていません。識者の方からのコメントをお待ちしております。CCJapan自身、ソフトウェアへの適用は非推奨としているので、なにか不都合があるような気もするのですが…。閑話休題。

最後に、参考までに、渡辺真さんによるオリジナルのコードと、今回作成したコード(ModuleReplaceWithExcel.bas) との対応関係を下図に示しています。
変数名をはじめ、全面的に書き変えてはいますが、色を塗った範囲で実現している『機能』に関しては基本的に同等です。
同じ機能でも異なる書き方ができるという程度のサンプルになれば幸いです。

左:オリジナルのコード、右:今回作成したコード