ユーザフォームバージョンのコード作成
ユーザーフォーム処理-リスト4
ワークシートではちょっと使いづらいという場合は、ユーザーフォームで同じような処理を作成することができます。ここでは、2つのリストボックスとテキストボックス、コマンドボタンを組み合わせて、ユーザーフォーム内でコードの表示を行います。
- 下図のようなユーザーフォームを用意します。
コンボボックスコントロールは、
Style
プロパティでドロップダウンリストボックスにします。テキストボックスコントロールは、MultiLine
プロパティで複数行編集ができるようにし、ScrollBars
プロパティで水平・垂直スクロールバーを表示するようにします。
- フォームの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)
- そして、範囲の先頭のアドレスを取得し、そのセルの内容(カテゴリ名)を、
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)
- リストの組み込みが終わったら、アクティブセルを範囲の最下行にあるセルに移動します。もう一度
CurrentRegion
プロパティでカテゴリのセル範囲を取得し、そのままRange
オブジェクトのEnd
プロパティを使うと、範囲の終端のセルをRange
オブジェクトで取得できます。ここでは、プロパティの引数にxlDown
を指定し範囲の最下行のセルを取得し、Activate
メソッドでアクティブなセルにします。この位置が、次のカテゴリ名が入力されているセルになります。そして、処理をForループの先頭に戻し、同じようにカテゴリ名をドロップダウンリストボックスに組み込みます。そして、また次のカテゴリ名が入力されているセルをアクティブにし、同じ処理を繰り返すことで、10個のカテゴリ名をセルから取得しドロップダウンリストボックスのリストに組み込みます。リストが作成できたら、セルA1をアクティブにします。ActiveCell.CurrentRegion.End(xlDown).Activate Next Worksheets("Sheet1").Range("A1").Activate End Sub
- ドロップダウンリストボックスのリスト項目(カテゴリ名)が選択されたら、その下に配置したリストボックスのリストに、カテゴリ内の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
- そして、そのセルの横(Tipsタイトルが入力されているB列)のセルをアクティブにします。
後は、空白セルに出会うまでアクティブセルを順番に移動し、セルの値をリストボックスのリストに組み込みます。これで、ドロップダウンリストボックスで選んだカテゴリのTipsタイトルを、リストボックスに組み込むことができます。
ActiveCell.Offset(0, 1).Activate While ActiveCell.Value <> "" ListBox1.AddItem ActiveCell.Value ActiveCell.Offset(1, 0).Activate Wend End Sub
- フォームの[検索]ボタンは、ドロップダウンリストボックスで選ばれたカテゴリ名の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)
- そして、リストボックスの選択項目名を使って、文書内のTipsタイトルの検索を行います。
With Wd.Selection.Find .ClearFormatting '前回の検索入力をクリア .Text = ListBox1.List(ListBox1.ListIndex) .Forward = True .Wrap = wdFindContinue .MatchFuzzy = True .Execute End With
- 検索が成功したら、コードをコピーするプロシージャ「Code_Copy」を実行し、コードをクリップボードにコピーします。
そして、テキストボックスコントロールの
Paste
メソッドを実行し、コードをテキストボックスにペーストします。これで、選択したTipsタイトルに対応したコードをテキストボックスで表示できます。Call Module1.Code_Copy(Wd) TextBox1.Paste
- コードを表示したら、Wordの文書を閉じてWordを終了し、使用したオブジェクト変数を開放します。
これで、出来上がりです。
With Wd .ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges .Quit End With Set Wd = Nothing End Sub
- [コピー]ボタンは、テキストボックスの内容を再度クリップボードにコピーし、他のアプリケーションで利用できるようにします。これは、テキストボックスコントロールの
Copy
メソッドを実行するだけです。[終了]ボタンは、フォームを閉じマクロを終了します。Private Sub CommandButton2_Click() TextBox1.Copy End Sub Private Sub CommandButton3_Click() Unload Me End End Sub
まとめ
本稿ではコードの表示だけを例にとって処理を作成しましたが、「解説」や「使用例の説明」なども表示できるようにすると、使い勝手が向上します。
Excel内にすべての情報を組み込んで検索させる方法もあります。最初から作成するのであればそれでも構いませんが、既にテキストファイルや他のワープロ文書などで作成されているものをデータベース化するのであれば、今回紹介した方法も利用できるのではないかと思います。