SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

ExcelとWordで簡易ドキュメント・データベースを作る

VBAによるアプリケーション連携プログラミング


  • X ポスト
  • このエントリーをはてなブックマークに追加

ExcelとWordを組み合わせた簡易ドキュメント・データベースのようなものを作成しました。ExcelでTipsタイトルを選してマクロを実行すると、Word文書から詳細な解説文を抜き出して表示します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 ExcelとWordを組み合わせた簡易ドキュメント・データベースを作成します。

 例として用意したマクロは、ExcelでTipsタイトルの一覧を作成し、このタイトルを選択してマクロを実行すると、対応するWord文書から「使用例」のコードを抜き出してワークシートに表示するというものです。

 文字列データの保存はWordで行い、この内容を取り出す形にしています。取り出す内容も、文書まるごとではなく必要な個所を自動的に検索し、その部分だけを抜き出してくるようにしています。

 このマクロを例にとって、Wordの文字列検索・範囲選択、Excelの文字列検索・セル範囲の取得を組み合わせ、テキスト処理を行うテクニックを紹介します。

Sheet1のTipsタイトルのセルをクリックし、マクロを実行すると
Sheet1のTipsタイトルのセルをクリックし、マクロを実行すると
Wordが起動して該当するファイルを開き、コードだけをコピーしてSheet2にペーストする
Wordが起動して該当するファイルを開き、コードだけをコピーしてSheet2にペーストする
 

対象読者

 Excel、Wordが使えてVBAでマクロを作ったことのある人

必要な環境

 Excel 2000、Word 2000以降のバージョンのExcelとWordが使用できる環境

プログラム実行時の注意事項

 ダウンロードファイルに同梱されているWordドキュメント「セルを操作する.doc」を、ドライブCのルートに配置してからマクロを実行してください。

処理の流れ

 使用するデータはExcelに格納します。ワークシートSheet1に、カテゴリ分けされたTipsのタイトルが入力されており、A列がカテゴリ名、B列がTipsタイトルです。各カテゴリは、行方向に空白のセルで区切られています。

カテゴリ分けされたTipsのタイトルが入力されているワークシート
カテゴリ分けされたTipsのタイトルが入力されているワークシート

 一方、Wordの文書ファイルは、このカテゴリ名ごとにTipsが記述されており、カテゴリ名がそのファイル名に使用されています。Tipsの中身は、

  1. (通し番号).Tipsタイトル
  2. <使用例 >
    コード
  3. <使用するメソッド・プロパティ>
  4. <解説>

 という構成で記述され、doc形式で保存されています。

1つのTipsは次のような構成でWordに保存されている
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パターンを作成します。実行方法が違うだけで、動作内容は全く一緒です。

ワークシート・バージョンのマクロ

  1. Sheet1で選択されたTipsタイトルが所属するカテゴリ全体のセル範囲を把握し、範囲の先頭にあるセルからカテゴリ名を取得します。そして、パスや拡張子を付けて文書のファイル名にし、Wordのインスタンスを作成してその文書を開きます。
  1. ここからWord内の操作になります。選択されているセルからTipsのタイトル名を取得し、Wordファイル内を検索します。一致したタイトル名を検出したら、その位置を開始位置としてコードの「Sub」という文字を検索します。検索が成功するとその文字が選択されるので、そこにブックマーク「sub」を設定します。また、その位置の行番号を変数に格納しておきます。
  1. 格納した行番号を開始位置として、「End Sub」という文字で検索を行います。検索が成功したら、その位置の行番号を変数に格納します。
  1. ブックマーク「sub」にジャンプし、「End Sub」の行番号から「Sub」の行番号を差し引いた行数を使って、「End Sub」までのコード全行を範囲選択します。
  1. 選択した範囲をクリップボードにコピーし、開いた文書を保存せずに閉じてWordを終了します。
  1. Excelに戻ったら新しいウィンドウを開き、Sheet2をアクティブにし、ウィンドウサイズを小さくします。そして、Sheet2にクリップボードのコードをペーストします。

ユーザーフォーム・バージョンのマクロ

コンボボックス、リストボックス、テキストボックス、コマンドボタン(3つ)
コンボボックス、リストボックス、テキストボックス、コマンドボタン(3つ)

 ユーザーフォーム・バージョンでは、上図のようなフォームを作成し、処理をフォームのコードモジュールに作成します。

  1. フォームのInitializeイベントで、ドロップダウンリストボックスのリスト項目を作成します。
    選択されているTipsタイトルのセルから、カテゴリ全体のセル範囲を取得し、カテゴリ名が入力されているセル番地を取得します。
    そして、そこに入力されているカテゴリ名を取得して、ドロップダウンリストボックスのリスト項目に組み込みます。
    これを、Sheet1に入力されているカテゴリ数分繰り返し、全カテゴリ名をリストに組み込みます。
  1. ドロップダウンリストボックスのリスト項目が選択されると、その項目名を使用してSheet1を検索し、該当するカテゴリのセル範囲を取得します。そして、Tips名が入力されているセルを先頭から順番に参照し、Tips名をリストボックスに組み込みます。
  1. [検索]ボタンが押されると、ドロップダウンリストボックスで選択されている項目名から文書名を作成し、Wordで開きます。そして、リストボックスで選択されている項目を使用して文書内を検索し、コードをクリップボードにコピーし、フォームのテキストボックスにペーストします。
  1. [コピー]ボタンをクリックすると、テキストボックスの内容をクリップボードにコピーすることができます。

 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メソッドによるデータ操作

次のページ
ワークシート・バージョンのコード作成

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

瀬戸 遥(セト ハルカ)

8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/831 2008/08/26 14:01

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング