はじめに
ExcelとWordを組み合わせた簡易ドキュメント・データベースを作成します。
例として用意したマクロは、ExcelでTipsタイトルの一覧を作成し、このタイトルを選択してマクロを実行すると、対応するWord文書から「使用例」のコードを抜き出してワークシートに表示するというものです。
文字列データの保存はWordで行い、この内容を取り出す形にしています。取り出す内容も、文書まるごとではなく必要な個所を自動的に検索し、その部分だけを抜き出してくるようにしています。
このマクロを例にとって、Wordの文字列検索・範囲選択、Excelの文字列検索・セル範囲の取得を組み合わせ、テキスト処理を行うテクニックを紹介します。
対象読者
Excel、Wordが使えてVBAでマクロを作ったことのある人
必要な環境
Excel 2000、Word 2000以降のバージョンのExcelとWordが使用できる環境
プログラム実行時の注意事項
ダウンロードファイルに同梱されているWordドキュメント「セルを操作する.doc」を、ドライブCのルートに配置してからマクロを実行してください。
処理の流れ
使用するデータはExcelに格納します。ワークシートSheet1に、カテゴリ分けされたTipsのタイトルが入力されており、A列がカテゴリ名、B列がTipsタイトルです。各カテゴリは、行方向に空白のセルで区切られています。
一方、Wordの文書ファイルは、このカテゴリ名ごとにTipsが記述されており、カテゴリ名がそのファイル名に使用されています。Tipsの中身は、
- (通し番号).Tipsタイトル
- <使用例 >
コード
- <使用するメソッド・プロパティ>
- <解説>
という構成で記述され、doc形式で保存されています。
2.あるセル範囲内にある特定の値のセルをすべて塗りつぶす <使用例 ワークシートSheet1のセル範囲A1:A7の中で、 「1234」という文字を含むセルをすべてマゼンタで塗りつぶす> Sub 特定の値のセルをすべて塗りつぶす() Dim r1 As Range Dim Adrs As String With Worksheets("Sheet1").Range("A1:A7") Set r1 = .Find(("1234"), LookIn:=xlValues) r1.Interior.ColorIndex = 7 Adrs = r1.Address Do Set r1 = .FindNext(r1) r1.Interior.ColorIndex = 7 Loop While r1.Address <> Adrs End With End Sub <使用するメソッド・プロパティ> <解説>
作成する2パターンのマクロ
今回のドキュメント・データベースは、ワークシートから直接マクロを起動して検索するバージョンと、ユーザーフォームから検索するバージョンの2パターンを作成します。実行方法が違うだけで、動作内容は全く一緒です。
ワークシート・バージョンのマクロ
- Sheet1で選択されたTipsタイトルが所属するカテゴリ全体のセル範囲を把握し、範囲の先頭にあるセルからカテゴリ名を取得します。そして、パスや拡張子を付けて文書のファイル名にし、Wordのインスタンスを作成してその文書を開きます。
- ここからWord内の操作になります。選択されているセルからTipsのタイトル名を取得し、Wordファイル内を検索します。一致したタイトル名を検出したら、その位置を開始位置としてコードの「Sub」という文字を検索します。検索が成功するとその文字が選択されるので、そこにブックマーク「sub」を設定します。また、その位置の行番号を変数に格納しておきます。
- 格納した行番号を開始位置として、「End Sub」という文字で検索を行います。検索が成功したら、その位置の行番号を変数に格納します。
- ブックマーク「sub」にジャンプし、「End Sub」の行番号から「Sub」の行番号を差し引いた行数を使って、「End Sub」までのコード全行を範囲選択します。
- 選択した範囲をクリップボードにコピーし、開いた文書を保存せずに閉じてWordを終了します。
- Excelに戻ったら新しいウィンドウを開き、Sheet2をアクティブにし、ウィンドウサイズを小さくします。そして、Sheet2にクリップボードのコードをペーストします。
ユーザーフォーム・バージョンのマクロ
ユーザーフォーム・バージョンでは、上図のようなフォームを作成し、処理をフォームのコードモジュールに作成します。
- フォームのInitializeイベントで、ドロップダウンリストボックスのリスト項目を作成します。
選択されているTipsタイトルのセルから、カテゴリ全体のセル範囲を取得し、カテゴリ名が入力されているセル番地を取得します。そして、そこに入力されているカテゴリ名を取得して、ドロップダウンリストボックスのリスト項目に組み込みます。これを、Sheet1に入力されているカテゴリ数分繰り返し、全カテゴリ名をリストに組み込みます。
- ドロップダウンリストボックスのリスト項目が選択されると、その項目名を使用してSheet1を検索し、該当するカテゴリのセル範囲を取得します。そして、Tips名が入力されているセルを先頭から順番に参照し、Tips名をリストボックスに組み込みます。
- [検索]ボタンが押されると、ドロップダウンリストボックスで選択されている項目名から文書名を作成し、Wordで開きます。そして、リストボックスで選択されている項目を使用して文書内を検索し、コードをクリップボードにコピーし、フォームのテキストボックスにペーストします。
- [コピー]ボタンをクリックすると、テキストボックスの内容をクリップボードにコピーすることができます。
Wordのインスタンス作成と文書を開く処理、文書内を検索しコードをクリップボードにコピーする処理は、それぞれプロシージャとして作成し、ワークシートバージョンとユーザーフォームバージョンの両方から利用できるようにします。
使用したVBAの機能
VBAタイプ | 機能 |
<VBA> | CreateObject 関数でアプリケーションインスタンスの作成 |
<VBA> | Mid 関数による文字列処理 |
<VBA> | While-Wendステートメントを使ったループ処理 |
<Word VBA> | Open メソッドで文書を開く |
<Word VBA> | Find オブジェクトによる文字列検索処理 |
<Word VBA> | Bookmarks オブジェクトでブックマーク設定 |
<Word VBA> | Information プロパティで行番号を取得する |
<Word VBA> | GoTo メソッドで指定位置へジャンプする |
<Word VBA> | MoveDown メソッドを使った選択範囲の拡大 |
<Word VBA> | Copy メソッドでクリップボードにデータをコピーする |
<Word VBA> | Close メソッドで文書を閉じる |
<Excel VBA> | CurrentRegion プロパティでアクティブなセル範囲の取得 |
<Excel VBA> | Address プロパティを使ったセル番地の取得 |
<Excel VBA> | ClearContents メソッドで文字と数式をクリアする |
<Excel VBA> | PasteSpecial メソッドによる書式指定付きペースト |
<Excel VBA> | NewWindow メソッドで新しいウィンドウを開く |
<Excel VBA> | Windows オブジェクトのプロパティでウィンドウを設定 |
<Excel VBA> | End プロパティで範囲の終端位置を把握 |
<Excel VBA> | Offset メソッドでアクティブセルを移動させる |
<Excel VBA> | Find メソッドによるワークシート内検索の実行 |
<Forms> | テキストボックスのCopy・Paste メソッドによるデータ操作 |