- 締切済み
エクセル VBA リストボックス 一覧処理
エクセル VBA リストボックス 一覧処理 シートから文字列を検索 ↓ リストボックス表示 ↓ 表示結果をクリック ↓ 空欄時入力 ↓ 更新 上記の流れをVBAで行いたいのですが、結果表示されたリストを選択 詳細を表示し、空欄においては都度入力した物を更新ボタンでセルへ 反映させるにはどの様にすればいいのでしょうか? Public Sub 検索(ByVal Namae As String, ByRef MeNamae As Object) Dim Nagasa As Integer Dim i As Long Dim MaxRows As Long Dim SAGASU As Object Dim KensakuChar As String Dim ListNamae As String Dim ListChar As String Dim KBanme As Integer Dim LBanme As Integer Set SAGASU = Worksheets("2月") MaxRows = SAGASU.UsedRange.Rows.Count Nagasa = Len(Namae) MeNamae.ListBox1.Clear For i = 3 To MaxRows ListNamae = SAGASU.Cells(i, 3) KBanme = 0 LBanme = 0 Do Do While Nagasa >= KBanme KBanme = KBanme + 1 KensakuChar = Mid(Namae, KBanme, 1) If KensakuChar <> " " Then Exit Do End If Loop Do While Nagasa >= LBanme LBanme = LBanme + 1 ListChar = Mid(ListNamae, LBanme, 1) If ListChar <> " " Then Exit Do End If Loop If KensakuChar = ListChar Then If Nagasa = KBanme Then With MeNamae .ListBox1.AddItem (ListNamae) End With End If Else Exit Do End If Loop Until Nagasa <= KBanme Next End Sub --------------- Private Sub UserForm_Initialize() Set SAGASU = Worksheets("2月") Maxl = SAGASU.UsedRange.Rows.Count End Sub --------------- Private Sub CommandButton1_Click() Dim Namae As String Dim MeNamae As Object Namae = TextBox1.Text Set MeNamae = KensakuForm Call 検索(Namae, MeNamae) End Sub ---------------- Private Sub CommandButton2_Click() End End Sub ---------------- Private Sub ListBox1_Click() ListIdx = ListBox1.ListIndex Namae = ListBox1.List(ListIdx) End Sub 文字数制限の為、一部抜いていま
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
もし、私の読み違えでないなら、標準モジュールで、VBのアルゴリズムを使いこなしているなら、Office VBAとしては、上級者です。そのような初歩的な質問などするわけないはずですが、ご自身のコードではないのでしょうか?もし、そのコードが読めていないなら、アルゴリズムなどを使わないで、ブラックボックスとして、ワークシート関数やFindメソッドを使ったほうが良いと思うのです。 UserForm_Initializeの中のMax1 が生きていません。 CommandButton1_Clickで、検索して、見つからなかったら、リストボックスには反映しません。 「検索」ユーザー定義関数の中で、MeNamae.ListBox1.Clearしているけれども、その都度、ListBox1のItem をクリアしている。 そのコードでは、リストボックスの役割がはっきりしません。 リストボックスを使う理由は、見つからない文字列を複数の一覧を確認しながら、ワークシートに反映させる、というはずです。 私の理解した範囲では、 テキストボックスに文字を入れる --> ワークシートの列の中のセルを検索 -> 見つからなかったら、リストボックスに表示 -> リストボックスの中の文字列をクリック -> セルに反映 のはずです。 私のコードの読みと理解であっているなら、もっと簡単に、全面的にコードの書き換えたいですね。 なお、Worksheets("2月")は、ActiveSheet だけでも良いはずです。 ** Private Sub CommandButton1_Click() Dim Namae As String Dim flg As Boolean Namae = TextBox1.Text With ActiveSheet 'または、Worksheets("2月") If WorksheetFunction.CountIf(.Range("C3", .Cells(Rows.Count, 3).End(xlUp)), Namae) = 0 Then For i = 0 To ListBox1.ListCount - 1 If ListBox1.List(i) = Trim(Namae) Then Exit For Next If i > ListBox1.ListCount - 1 Then ListBox1.AddItem Namae Else MsgBox "'" & Namae & "'は、既にリストボックスに存在しています。", vbInformation End If Else MsgBox "'" & Namae & "'は、既にワークシートには存在しています。", vbInformation End If End With TextBox1.Value = "" End Sub 'LitBox1_Click は、使用中止 'Private Sub ListBox1_Click() ' 'End Sub '代わりに、DbleClickイベントにする Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Dim i As Integer For i = 0 To ListBox1.ListCount - 1 If ListBox1.Selected(i) Then ActiveSheet.Cells(Rows.Count, 3).End(xlUp).Offset(1).Value = ListBox1.List(i) ListBox1.RemoveItem i End If Next End Sub
- keithin
- ベストアンサー率66% (5278/7941)
一つ簡易な手としては,Listbox1のプロパティでColumnCountを2とかにしておいて,AddItemした際にその2列目に実際のシートの行位置を併せて記録しておくような手もあります。 .ListBox1.AddItem (ListNamae) .ListBox1.List(.listbox1.listcount-1, 1)=i とかでいいのかな? いったいどんな仕込みで一つ一つの追記データを検索してるのか,ちょっとdo loopとか複雑すぎて読み切れません。 選択項目の行位置がこれで判りますから,各テキストボックスに該当行の所定のデータを表示するのもデータをシートに戻すのも,容易に出来ます。