コンボボックスで1文字目一致で入力候補を表示するには?

Question 23.5 Previous Next
はじめまして。私は高校で数学の教員をしています。コンボボックスとテキストボックスの連携についてお尋ねします。
生徒の氏名をコンボボックスから入力しようと思いますが、数が多いため探すのが大変です。
そこで、たとえばテキストボックスに「い」と入力したら、コンボボックスに苗字の先頭が「い」の生徒の氏名だけが、出てくるようにしたいと思いました。
いろいろ試行錯誤しましたが、うまく行きません。良い方法があったらお教えください。Excel 2000を使っています。
Answer   Copyright (C) 1999.12.21 永井善王
コンボボックスは、Excel 97で大幅に改良され、きめ細かな制御が可能になりました。
質問の「苗字の先頭の1文字が、入力した1文字と一致したもの
だけを表示する」ことは可能と思いますが、かなり複雑なマクロを組むことになるのではないでしょうか。 しかし、ドロップダウン・リストボックスの中で、一致した最初の生徒の氏名に位置付けすることで良ければ、比較的簡単に実現できます。
ただし、「い」と入力したら「い」の生徒…… ということは、ふりがなで作業する前提でよいと判断して回答します。 もしも、漢字で入力するのであれば、先頭の数文字を入力すれば一致する候補を表示してくれる Excelのオートコンプリート機能が、標準で利用可能ですから、わざわざマクロを組む必要はないでしょう。 このことは、ふりがなでも同じことが言えますが、リスト表示を工夫すると使い易い仕組みができそうで、あなたの期待に近づけると思いますので、サンプルを作ってみました。

 【名簿シート】
名簿シート Excelには、自動ふりがな機能があるので、左図のように、わざわざ「ふりがな」を別の列にする必要は、ないかとも思いますが、この回答では一般的なレイアウトを使ってみます。

 【コンボボックスのドロップダウン・リストボックス】
コンボボックス



コンボボックスのリストには、左図のとおり「ふりがな」と「氏名」の両方を、表示することにします。

準備するオブジェクトとしては、(1) 選択した氏名をセットするワークシート、(2) 名簿シート、(3) コンボボックスを配置したユーザーフォーム、(4) 標準モジュール です。

マクロは、上記の(3)と(4)に組み込みます。
(4)の標準モジュールには、ユーザーフォームを表示するための下記のマクロを記述します。
Sub 一文字目一致で入力候補を表示する_ふりがな()
10  Worksheets("SSS").Activate                  '「SSS」シートをアクティブにする
20      Range("D11").ClearContents              'D11セルの内容をクリアする
30      Range("N17").Select                     'カーソルを定位置へ
40  UserForm1.Show                              'ユーザーフォームを表示する
End Sub
(注)・40行のコードは必須で、10~30行は必要により記述する
   ・このサンプルはワークシートに設けたボタンがクリックされるとユーザーフォームを表示する
   ・コンボボックスで入力された値は、D11セルにセットする仕組みにしている
(3)のユーザーフォームのコードには、下記の3つのマクロを記述します。
a. ユーザーフォームを初期化するマクロ …… 名簿シートの内容をコンボボックスのリストにセットする
Private Sub UserForm_Initialize()               'ユーザーフォームを初期化する
10  下 = Worksheets("名簿").Range("A2").End(xlDown).Row '下端検出
20  ComboBox1.ColumnCount = 2                   'コンボボックスの列は2列にする
30  For I = 0 To 下 - 2                         'Iが0(2行-2)から下-2まで
40      ComboBox1.AddItem Worksheets("名簿").Cells(I + 2, 1).Value '名簿シートA列
50      ComboBox1.List(I, 1) = Worksheets("名簿").Cells(I + 2, 2).Value '同B列
60  Next                                        '繰り返す
70  ComboBox1.TextColumn = 1                    '選択されたら1列目を表示する
End Sub

(注)・Initializeイベントで、ユーザーフォームを初期化している
   ・20行目のColumnCountプロパティで、コンボボックスに表示する列数を設定
   ・30から60行目は、名簿シートの2行目から、10行目で取得した下端行に達するまで反復処理する
   ・40行目のAddItemメソッドと、50行目のListプロパティで、名簿の内容をリストに読み込みする
   ・70行目のTextColumnプロパティは、選択されたらリストの1列目を表示するように設定
b. 選択結果を取り出して、ワークシートに氏名をセットするマクロ
Private Sub ComboBox1_Change()
10  氏名 = ComboBox1.Text                       '選択結果を取り出す
20  Worksheets("SSS").Range("D11").Value = 氏名 'セルにセットする
End Sub

(注)・Changeイベントは、コンボボックスで新しい文字列値を入力または選択したときに発生する
   ・10行目のTextプロパティで、選択結果を取り出す
c. 一致する項目の有無に合わせて処理を切り替えするマクロ

Private Sub CommandButton1_Click()
10  If ComboBox1.MatchFound Then                '一致する項目がリストの中にあれば
20      Unload Me                               'ユーザーフォームを閉じる
30  Else                                        'そうでなければ
40      MsgBox "やり直してください", vbExclamation, "みつかりません"
50  End If
End Sub

(注)10行目のMatchFoundプロパティは一致する項目がリストの中にあればTrue、なければFalseを返す
サンプルブックを作っておきましたので、マクロを動かしてコードと対比しながら、研究してください。そして、理解が進んでだんだん意欲が出てきたら、マクロを改良してみてください。覚えるチャンスです。
サンプルブックのダウンロードは ここをクリック  (YNxv98314_ComboBox.xls 67KB)
※ 一旦、ブックをハードディスクに保存し、後で改めて開いてから実行してください。

Excel VBA Macro