Excel用户窗体可在文本框中搜索并在列表框中过滤

时间:2019-02-04 19:16:41

标签: excel vba search listbox userform

您好,我正在寻求帮助,我在一个Excel用户窗体中有一个文本框和一个列表框,除了一个小的Detail之外,它都可以正常工作:结果出现在列表框中后,它们代表所有列中的搜索。但是,当我在文本框中键入内容时,第一列是隐藏的,如何确保在搜索过程中该列仍然可见? 预先感谢

这是代码:

Private Sub UserForm_Initialize()

End Sub

Private Sub TextBox1_Change()

With Sheets("Sheet1")

lr = .Range("A" & Rows.Count).End(xlUp).Row
ReDim arr(1 To lr - 1)
ReDim sn(1 To lr - 1, 1 To 13)
For i = 1 To UBound(arr)
    arr(i) = .Range("A" & i + 2) & " " & .Range("B" & i + 2) & " " & .Range("C" & i + 2) & " " & .Range("D" & i + 2) & " " & .Range("E" & i + 2) & " " & .Range("F" & i + 2)
    If InStr(1, arr(i), TextBox1) > 0 Then
        j = j + 1
        For X = 2 To 8
            sn(j, X - 1) = .Cells(i + 2, X)
        Next
    End If
Next
ListBox1.List = sn

End With

End Sub 

1 个答案:

答案 0 :(得分:0)

一致性数组方法

您的原始代码显示了创建过滤列表框列表时 array range 循环的混合。为了在此处仅通过遍历数组*)来保持一致,您可以按以下方式优化代码(例如,通过Instr使用相同的匹配检查):

用户表单事件过程TextBox1_Change()

Private Sub TextBox1_Change()
  Const STARTROW = 3
  Dim i&, iCnt&, r&, c&                                                       ' array counters for "rows" and "columns"
  Dim sn, tmp                                                                 ' variant 2-dim 1-based arrays
  With Sheets("Sheet1")
      iCnt = .Range("A" & Rows.Count).End(xlUp).Row - STARTROW + 1            ' items counter
      ReDim sn(1 To iCnt, 1 To 13)                                            ' provide for filtered data array
      For i = 1 To iCnt
         'assign current data row to 2-dim 1-based temporary array
          tmp = .Range("A" & (i + 2) & ":F" & (i + 2))                        ' current data row (c.f. OP)
         'compare search string with concatenated data string from current row
          If InStr(1, concat(tmp), TextBox1.Text) > 0 Then                    ' check occurrence e.g. via Instr
              r = r + 1                                                       ' new rows counter
              For c = 1 To UBound(tmp, 2)                                     ' col counter
                  sn(r, c) = tmp(1, c)                                        ' collect found row data
              Next
          End If
      Next
      ListBox1.List = sn                                                      ' assign array to .List property
  End With

End Sub

上述事件过程调用的辅助函数concat()

Private Function concat(ByVal arr, Optional ByVal delim$ = " ") As String
' Purpose: build string from 2-dim array row, delimited by 2nd argument
' Note:    concatenation via JOIN needs a "flat" 1-dim array via double transposition
  concat = Join(Application.Transpose(Application.Transpose(arr)), delim)
End Function

注释

*)通过VBA遍历一个范围总是很耗时,因此可以使用数组来代替。

您可能还对以下说明使用列表框Column property的解决方案感兴趣。通过玩转,可以帮助您删除列表框中多余的空白行。

相关问题