|
▼氷 さん:
おはようございます。
>A1にあい
>A2にあき
>A3にあきこ
>というデータが入っていて、あるテキストボックス(リストボックスを使うのかな?)に「あ」と入力すると、そのボックスの下に
>
>あ <----- ボックス
>あき
>あきこ
>
>という風に表示され、さらにマウスで「あき」を選択すると、ボックスに「あき」が入り、
>
>あき <------ ボックス
>あきこ
>
>という風に表示されるようなプログラムを作りたいのですが、やり方が全くわかりません><
>
>この処理はVBAでは可能なのでしょうか?
やって出来ない事はないと思います。
ユーザーフォーム(Userform1)にコンボボックス(Combobox1)を一つ配置します。
アクティブシートのA列の1行目からこのCombobox1のメンバデータが
入っているとします。
あ --A1
あき --A2
あきこ --A3
・
・
というように・・。
Userform1のモジュールに
'========================================================
Dim rng As Range 'リストデータのセル範囲
Dim ev As Boolean 'Changeイベントの有無フラグ True--発生可能 False---発生不可
'========================================================
Private Sub UserForm_Initialize()
ComboBox1.Style = fmStyleDropDownCombo '←これは事前設定でよいです
Set rng = Range("a1", Cells(Rows.Count, 1).End(xlUp))
ev = True
End Sub
'===============================================================
Private Sub ComboBox1_Change()
Dim svtext As String 'コンボボックスのTextの内容の一時保存
If ev = False Then Exit Sub
With ComboBox1 '←適当な名前に変更すること
svtext = .Text
If .Text <> "" Then
If rng.Count = 1 Then
If rng.Value = "" Then
.Clear
Exit Sub
End If
End If
myvalue = Evaluate("transpose(if(mid(" & rng.Address & ",1," & Len(.Text) & ")=""" _
& .Text & """," & rng.Address & ",""" & Chr(&HFF) & """))")
If UCase(TypeName(myvalue)) <> UCase("variant()") Then
myvalue = Array(myvalue)
End If
myvalue = Filter(myvalue, Chr(&HFF), False)
'↑あり得ない文字を使用してフィルタをおこなう
ev = False
.Clear
.List() = myvalue
.Text = svtext
ev = True
If UBound(myvalue) > 0 Then
.DropDown
End If
Else
.Clear
.Visible = False
.Visible = True
.SetFocus '↑ここは、こうしないと残像が残るので(Excel2000)
End If
End With
End Sub
以上です。
A列が更新された時(データが増えたとき)の処理はしていませんが、
A列にデータの登録などが行われた時点で処理をしなければなりません。
そうしないと追加データがコンボボックスに反映されません。
又、A列に登録されるメンバリストの数が多くなるようでしたら、
別の仕様を考えた方がよいかもしれませんよ。
400や500ぐらいの数でテストした限りは快適でしたが・・。
確認して下さい。
|
|