2016-12-22 12 views
1

ワークシートにリストボックスがあり、指定されたセルをクリックするとアクティブになります。このセルに書いてリストボックスをフィルタリングしたいと思います。例えば、そのセルに "asd"と書くと、リストボックスは "asd"で始まる行をリアルタイムで返します。VBAリアルタイムフィルタリストボックスのセル値

Private Sub Worksheet_Change(ByVal Target As Range) 
    On Error Resume Next 
    If Target.Value <> "" Then 
     With ListBox1 
     For i = .ListCount - 1 To 0 Step -1 
      If InStr(1, LCase(.List(i, 0)), LCase(Target.Value)) = 0 And _ 
      InStr(1, LCase(.List(i, 1)), LCase(Target.Value)) = 0 And _ 
      InStr(1, LCase(.List(i, 2)), LCase(Target.Value)) = 0 And _ 
      InStr(1, LCase(.List(i, 3)), LCase(Target.Value)) = 0 Then 
       .RemoveItem i 
      End If 
      Next i 
     End With 
    End If 
End Sub 

私はそれを持っていますが、動作しません。

+0

実際には「機能しない」とはどういう意味ですか?スローされたエラーとそれらをスローしている行についての詳細を指定してください – user3598756

+0

セルの非アクティブ化を待っています。つまり、別のセルを選択したときに機能します。しかし、私はあなたが書いている間にそれを実行したいと思います。したがって、適切な線を見て正しい線を選択することができます。 – Tumurtay

+0

AFAIK、 'worksheet_change'イベントではできません。すべての変更が完了したときにこのイベントが発生するので、セルを非アクティブ化したときには起動しません(はい、Enterボタンを押しても - 選択は変更されますが、セルがアクティブで変更されています)。このようなイベントテキストボックスにはTextBoxが含まれているため、リストにTextBoxを追加すると、必要なものを構築できます。 – CommonSense

答えて

0

あなたがこの方法を試すことができます - 特定のセルが変更されたときにちょうどListBoxからすべての項目を削除し、ソースRangeからアイテムを照合して移入:例えば

Option Explicit 

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim strFilter As String 
    Dim rngData As Range 
    Dim lngCounter As Long 

    ' check changed cell is our specific cell and exit if not 
    If Intersect(Target, Sheet1.Range("B1")) Is Nothing Then 
     Exit Sub 
    End If 

    'get reference to data range 
    Set rngData = Sheet1.Range("A1:A12") 

    'get value of changed cell 
    strFilter = Target.Value 

    'clear listbox and add matching items 
    Sheet1.ListBox1.Clear 
    For lngCounter = 1 To rngData.Rows.Count 
     If Left(rngData.Cells(lngCounter, 1).Value, 1) = Target.Value Then 
      Sheet1.ListBox1.AddItem rngData.Cells(lngCounter, 1).Value 
     End If 
    Next lngCounter 

End Sub 

enter image description here

関連する問題