SHOEISHA iD

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

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

特集記事

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

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


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

ユーザフォームバージョンのコード作成

ユーザーフォーム処理-リスト4

 ワークシートではちょっと使いづらいという場合は、ユーザーフォームで同じような処理を作成することができます。ここでは、2つのリストボックスとテキストボックス、コマンドボタンを組み合わせて、ユーザーフォーム内でコードの表示を行います。

  1. 下図のようなユーザーフォームを用意します。
    コンボボックスコントロールは、Styleプロパティでドロップダウンリストボックスにします。テキストボックスコントロールは、MultiLineプロパティで複数行編集ができるようにし、ScrollBarsプロパティで水平・垂直スクロールバーを表示するようにします。
    コンボボックス、リストボックス、テキストボックス、コマンドボタン(3つ)
    コンボボックス、リストボックス、テキストボックス、コマンドボタン(3つ)
  1. フォームのInitializeイベントプロシージャで、Sheet1のA列にあるカテゴリ名をドロップダウンリストボックスのリストに組み込みます。
    カテゴリは全部で10個ありますので、同じ処理を10回繰り返しカテゴリ名のリスト化を自動化します。
    まず、セルA1をアクティブにし、最初のカテゴリのセル範囲を求めます。
     
    Worksheets("Sheet1").Range("A1").Activate
    
    For i = 1 To 10
        C = ""
        ADS = ""
        j = 0
    
        BaseAddress = ActiveCell.CurrentRegion _
                      .Address(RowAbsolute:=False, _
                               ColumnAbsolute:=False)
    
  1. そして、範囲の先頭のアドレスを取得し、そのセルの内容(カテゴリ名)を、AddItemメソッドでドロップダウンリストボックスのリストに組み込みます。
    アドレスの取り出しは、ワークシートバージョンの場合と同様、While-WendループとMid関数で行います。
     
    While C <> ":"
        j = j + 1
        C = Mid(BaseAddress, j, 1)
        If C <> ":" Then
            ADS = ADS & C
        End If
    Wend
    
    ComboBox1.AddItem Worksheets("Sheet1").Range(ADS)
    
  1. リストの組み込みが終わったら、アクティブセルを範囲の最下行にあるセルに移動します。もう一度CurrentRegionプロパティでカテゴリのセル範囲を取得し、そのままRangeオブジェクトのEndプロパティを使うと、範囲の終端のセルをRangeオブジェクトで取得できます。ここでは、プロパティの引数にxlDownを指定し範囲の最下行のセルを取得し、Activateメソッドでアクティブなセルにします。この位置が、次のカテゴリ名が入力されているセルになります。
    そして、処理をForループの先頭に戻し、同じようにカテゴリ名をドロップダウンリストボックスに組み込みます。
    そして、また次のカテゴリ名が入力されているセルをアクティブにし、同じ処理を繰り返すことで、10個のカテゴリ名をセルから取得しドロップダウンリストボックスのリストに組み込みます。
    リストが作成できたら、セルA1をアクティブにします。
     
            ActiveCell.CurrentRegion.End(xlDown).Activate
        Next
        Worksheets("Sheet1").Range("A1").Activate
    End Sub
    
  1. ドロップダウンリストボックスのリスト項目(カテゴリ名)が選択されたら、その下に配置したリストボックスのリストに、カテゴリ内のTipsタイトルすべてを組み込みます。
    まず、選択されているリスト項目名を取得し、RangeオブジェクトのFindメソッドでそのセルを検索します。検索が成功したら、そのセルをアクティブにします。
     
    Private Sub ComboBox1_Change()
        Cells.Find(What:=ComboBox1.Value, After:=ActiveCell, _
                       LookIn:=xlFormulas, LookAt:=xlPart, _
                       SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                       MatchCase:=False).Activate
    
  1. そして、そのセルの横(Tipsタイトルが入力されているB列)のセルをアクティブにします。
    後は、空白セルに出会うまでアクティブセルを順番に移動し、セルの値をリストボックスのリストに組み込みます。
    これで、ドロップダウンリストボックスで選んだカテゴリのTipsタイトルを、リストボックスに組み込むことができます。
     
        ActiveCell.Offset(0, 1).Activate
    
        While ActiveCell.Value <> ""
            ListBox1.AddItem ActiveCell.Value
            ActiveCell.Offset(1, 0).Activate
        Wend
    End Sub
    
  1. フォームの[検索]ボタンは、ドロップダウンリストボックスで選ばれたカテゴリ名のWord文書を開き、リストボックスで選択されたTipsタイトルからコードをコピーしテキストボックスに表示する処理を行います。まず、ドロップダウンリストボックスの選択項目名にパス名とファイルの拡張子を組み合わせ、Wordの文書ファイル名を作成します。そして、既に標準モジュールに作成してある、Wordのインスタンスを作成して文書ファイルを開くFunctionプロシージャ「Word_Doc_Open」を実行します。ここでも、プロシージャの戻り値であるインスタンスへの参照を、オブジェクト変数に格納するのを忘れないでください。
     
    Private Sub CommandButton1_Click()
        Dim Wd As Word.Application
    
        TextBox1.Text = ""
    
        Fname = "C:\" & ComboBox1.Value & ".Doc"
        Set Wd = Module1.Word_Doc_Open(Fname)
    
  1. そして、リストボックスの選択項目名を使って、文書内のTipsタイトルの検索を行います。
     
    With Wd.Selection.Find
        .ClearFormatting '前回の検索入力をクリア
        .Text = ListBox1.List(ListBox1.ListIndex)
        .Forward = True
        .Wrap = wdFindContinue
        .MatchFuzzy = True
        .Execute
    End With
    
  1. 検索が成功したら、コードをコピーするプロシージャ「Code_Copy」を実行し、コードをクリップボードにコピーします。
    そして、テキストボックスコントロールのPasteメソッドを実行し、コードをテキストボックスにペーストします。
    これで、選択したTipsタイトルに対応したコードをテキストボックスで表示できます。
     
    Call Module1.Code_Copy(Wd)
    TextBox1.Paste
    
  1. コードを表示したら、Wordの文書を閉じてWordを終了し、使用したオブジェクト変数を開放します。
    これで、出来上がりです。
     
        With Wd
            .ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges
            .Quit
        End With
        Set Wd = Nothing
    End Sub
    
  1. [コピー]ボタンは、テキストボックスの内容を再度クリップボードにコピーし、他のアプリケーションで利用できるようにします。これは、テキストボックスコントロールのCopyメソッドを実行するだけです。
    [終了]ボタンは、フォームを閉じマクロを終了します。
     
    Private Sub CommandButton2_Click()
        TextBox1.Copy
    End Sub
    
    Private Sub CommandButton3_Click()
        Unload Me
        End
    End Sub
    

まとめ

 本稿ではコードの表示だけを例にとって処理を作成しましたが、「解説」や「使用例の説明」なども表示できるようにすると、使い勝手が向上します。

 Excel内にすべての情報を組み込んで検索させる方法もあります。最初から作成するのであればそれでも構いませんが、既にテキストファイルや他のワープロ文書などで作成されているものをデータベース化するのであれば、今回紹介した方法も利用できるのではないかと思います。

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

  • 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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング