| 
    
     |  | ▼氷 さん: こんにちは。
 再投稿です。
 >コンボボックスが1つの場合は出来たのですが、実はこれと同じ処理を4つ(参照するセルもバラバラ(a1〜d1))のときの処理が出来ないんです><
 投稿されたコードを拝見すると大きい間違いはわかりました。
 
 でもね、氷 さんはもう既に何度かここに質問をされていますよね?
 今後の事もありますから敢えて申し上げますが、
 投稿されたコードで出来ない時の現象(こんなエラーメッセージが表示される等)を
 記述するようにして下さいね!!
 
 同じような処理をするコンボボックスが増えるようなら
 別の方法も考えなければなりませんが、
 4つ程度の個数なら以下のようなコードでよいかと思います。
 大きく前回とコードを変更しました。
 
 対象となっているシートのシートモジュールに
 
 '===================================
 Sub settei()
 'このプロシジャーは、例の
 '>コンボボックスに、「かく」と入れて確定すると、かくれんぼが出てきます。
 'をしないための設定
 'や
 '事前に氷 さんがListFillRangeにセル範囲を設定されいる事を
 '想定して記述したコードです。
 '一度だけ設定していただければ結構です。
 'もっと言えば、ここで設定してる事はコンボボックスのプロパティの設定で
 '可能です。
 With ネーム
 .ListFillRange = ""
 .MatchEntry = fmMatchEntryNone
 .Style = fmStyleDropDownCombo
 End With
 With コード
 .ListFillRange = ""
 .MatchEntry = fmMatchEntryNone
 .Style = fmStyleDropDownCombo
 End With
 ev = 0
 End Sub
 '======================================================
 Private Sub ネーム_Change()
 Dim rng As Range
 Set rng = Range("a1", Cells(Rows.Count, 1).End(xlUp))
 Call set_combobox(ネーム, rng)
 End Sub
 '=======================================================
 Private Sub ネーム_GotFocus()
 ネーム_Change
 End Sub
 '========================================================
 Private Sub コード_Change()
 Dim rng As Range
 Set rng = Range("b1", Cells(Rows.Count, 2).End(xlUp))
 Call set_combobox(コード, rng)
 End Sub
 '=========================================================
 Private Sub コード_GotFocus()
 コード_Change
 End Sub
 '=========================================================
 Sub set_combobox(cmb As MSForms.ComboBox, rng As Range)
 Dim myvalue As Variant
 With cmb
 If .Text <> "" Then
 If rng.Count = 1 Then
 If rng.Value = "" Then
 .List = Array()
 Exit Sub
 End If
 End If
 myvalue = get_match_array(rng, .Text)
 .List() = Array()
 If TypeName(myvalue) <> "Integer" Then
 .List() = myvalue
 .DropDown
 End If
 Else
 
 .List() = Array()
 .SelStart = 0
 End If
 End With
 End Sub
 '==========================================================
 Function get_match_array(rng As Range, ByVal f_str)
 Dim myarray()
 Dim crng As Range
 Dim cnt As Long
 f_str = StrConv(f_str, vbHiragana)
 cnt = 0
 For Each crng In rng
 If f_str = Mid(StrConv(crng.Text, vbHiragana), 1, Len(f_str)) Or _
 f_str = Mid(StrConv(crng.Phonetic.Text, vbHiragana), 1, Len(f_str)) Then
 ReDim Preserve myarray(1 To cnt + 1)
 myarray(cnt + 1) = crng.Text
 cnt = cnt + 1
 End If
 Next crng
 If cnt > 0 Then
 get_match_array = myarray()
 Else
 get_match_array = 0
 End If
 End Function
 
 コンボボックスのClearメソッドを使用していたので
 イベントの再発生を防ぐコードにしていましたが、
 Textプロパティをコードで変更する必要性がないので上記のように
 しました。
 
 コンボボックスを増やす場合は、ChangeイベントとGotfocusイベントの
 追加で可能かと思います。
 ChangeイベントとGotfocusイベントのどこを変更するかは
 上記のコードを見て試して下さい。
 
 
 |  |