Accessライクなコンボボックス(自動候補選択)!!
==オートコンプリートコンボボックス==


'===========================================================================
'    ファイル名    : frmAutoComp.frm
'    ファイル説明  : オートコンプリートコンボボックス
'    作成者        : Uz
'       E-Mail     : uz@violet.plala.or.jp
'       HomePage   : http://www1.plala.or.jp
'    作成日        : 1998/02/11 (Wed)
'    修正日        : 1998/02/11 (Wed)
'    備考          : なし
'===========================================================================
Option Explicit

' -- API定数宣言
Private Const CB_FINDSTRING = &H14C
' -- API 関数宣言
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
    ByVal hwnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    lParam As Any _
) As Long

' -- 変数宣言
Private blnComboDelete As Boolean           'コンボボックスで文字が削除されたかどうかを
                                            'Changeイベントで取得するための変数
                                            ' True  -  削除されたことによるテキストの変化
                                            ' Flase -  何か入力されたことによるテキストの変化

'///////////////////////////////////////////////////////////////////////////
'      関数名    : cmbComboBoxChange(コンボボックスのChangeイベント)
'      目的説明  : 入力文字列をリスト内から検索し選択する
'                  Accessライクなコンボボックス(Accessにはこのような機能があるらしい)
'      前提条件  : なし
'      結果      : なし
'      引数      : なし
'      戻り値    : なし
'      備考      ; なし
'///////////////////////////////////////////////////////////////////////////
Private Sub cmbComboBox_Change()
    Dim lSelStart As Long               '現在のカーソル位置
    
    If blnComboDelete Then
        'このチェンジイベントが文字列の削除によって発生した時、処理を行わない
        '  これがないと(Delete,BackSpaceによる)文字の削除が出来ない
        blnComboDelete = Not blnComboDelete
    Else
        ' -- 検索処理
        '現在のカーソル位置を保存
        lSelStart = cmbComboBox.SelStart
        '現在の文字列をもとに検索し選択状態にする
        cmbComboBox.ListIndex = SendMessage(cmbComboBox.hwnd, CB_FINDSTRING, -1, ByVal cmbComboBox.Text)
        '発見できれば
        If cmbComboBox.ListIndex <> -1 Then
            'カーソル位置を戻して
            cmbComboBox.SelStart = lSelStart
            'カーソル以降を選択状態に
            cmbComboBox.SelLength = Len(cmbComboBox.Text)
        End If
    End If
End Sub

'///////////////////////////////////////////////////////////////////////////
'      関数名    : cmbComboBoxKeyDown(コンボボックスのChangeイベント)
'      目的説明  : 文字削除かどうかフラグを変更する
'      前提条件  : なし
'      結果      : なし
'      引数      : ※ヘルプ参照
'      戻り値    : なし
'      備考      ; なし
'///////////////////////////////////////////////////////////////////////////
Private Sub cmbComboBox_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyBack Or KeyCode = vbKeyDelete Then
        '文字削除の時 フラグを真に
        blnComboDelete = True
    Else
        '文字削除でない時 フラグを偽に
        blnComboDelete = False
    End If
End Sub

'///////////////////////////////////////////////////////////////////////////
'      関数名    : FormLoad(フォームロード)
'      目的説明  : コンボボックスの初期化
'      前提条件  : なし
'      結果      : なし
'      引数      : なし
'      戻り値    : なし
'      備考      ; なし
'///////////////////////////////////////////////////////////////////////////
Private Sub Form_Load()
    'コンボボックスのリストを作成
    With cmbComboBox
        Call .AddItem("41050")
        Call .AddItem("41060")
        Call .AddItem("41070")
        Call .AddItem("41080")
        Call .AddItem("42010")
        Call .AddItem("51100")
    End With
End Sub