Excel:过滤合并的单元格workarround

时间:2016-09-09 17:24:41

标签: excel vba excel-vba

我的问题:

我有一个包含ID和名称的电子表格,我希望用户可以搜索。 我以为我可以使用filter选项来做到这一点,但我遇到了以下问题:id或名称在合并的单元格中,因此filter选项只返回有关id或name的第一行数据。

我的电子表格

2

我的目的是:

How to sort/filter merged cells in Excel?

在这里,我了解到我可以通过取消合并单元格并为它们提供相同的值来获取所有数据。但是有一些问题:

  1. 这需要万无一失。用户很容易错误地给他们不同的名字或ID

  2. 名称ar通常很长,所以合并单元格让我完全显示它们而不会使B列太宽

  3. 我已编写代码来编写和阅读此数据,我需要查看我如何浏览电子表格

  4. How do I avoid merging cells vertically in excel?

    这篇帖子用单元格顶部的文本框替换合并的单元格,如果我有一个公式可以自动为文本框中的每个单元格赋予文本框中的值,这可能会有效。但同样:不是超级万无一失或干净

    解决方案?

    我不会想要过滤数据。我希望用户使用搜索框到达工作表的正确部分。所以我认为宏可以这样工作:

    1. 聆听用户在特定工作表上应用过滤器,特定标题

    2. 将第一个可见单元格的地址存储在变量MyCell的标题下

    3. 删除过滤器

    4. 选择MyCell

    5. 这可能吗?

      替代解决方案?

      1. 聆听用户在特定工作表上应用过滤器,特定标题

        1. 在每个已过滤的行下方显示2行
      2. 也可以,但不是必要的。

        谢谢

1 个答案:

答案 0 :(得分:0)

感谢@kyle指出我正确的方向。这就是我最终做的事情:

|--------------------------------------|
|Header 1| header 2|                   |
|--------|---------| header 3| header 4|
|search: |         |                   |  
|--------------------------------------|
|        |         |  data1  |  data1  |
|id1     | name1   |  data2  |  data2  |
|        |         |  data3  |  data3  |
|--------------------------------------|
|        |         |  data1  |  data1  |
|id2     | name2   |  data2  |  data2  |
|        |         |  data3  |  data3  |
|--------------------------------------|

我在第二个标题下面放了一个搜索框。然后我将此代码插入到搜索框所在的工作表的模块页面中:

    Private SearchTerm As String
    Private SearchLoc As Range
    Private SearchOld As Range
    Private SearchStart As Range

    Private Sub Worksheet_Change(ByVal SearchBox As Range)

    If SearchBox.Address = Me.Range("B2").Address And Not IsEmpty(Me.Range("B2").Value) Then

    If Not SearchOld Is Nothing Then
    Set SearchStart = SearchOld
    Set SearchOld = Nothing
    Else
    Set SearchStart = Range("B2")
    End If

    If Not SearchTerm = Trim(Me.Range("B2").Value) Then
    SearchTerm = Me.Range("B2").Value
    Set SearchStart = Range("B2")
    End If

    If Trim(SearchTerm) <> "" Then

    With ActiveSheet.Range("A:A, B:B")
    Set SearchLoc = .Find(What:=SearchTerm, _
    After:=SearchStart, _
    LookIn:=xlValues, _
    Lookat:=xlPart, _
    Searchorder:=xlByRows, _
    Searchdirection:=xlNext, _
    MatchCase:=False)

    If Not SearchLoc Is Nothing Then
    Set SearchOld = SearchLoc
    Application.Goto Cells(SearchLoc.Row, 1), True
    End If

    End With
    End If
    End If

    End Sub

此代码主要是从这里借来的 ripped http://www.rondebruin.nl/win/s9/win006.htm

我也使用了这个参考: https://msdn.microsoft.com/en-us/library/office/ff839775.aspx

它的作用

此代码侦听工作表上的任何更改。然后它检测B2和B2中是否发生了这种变化。然后它检查前搜索是否与当前搜索相等。如果是这种情况,它会查找同一searchTerm的下一个实例,否则它会从顶部搜索。然后转到结果。如果用户搜索不存在的内容,请转到顶部。

警告:在我的情况下,搜索框包含在搜索的列中。因此,如果用户搜索不存在的内容,则只需转到搜索框即可。如果您使用此代码并移动搜索框,则需要检查它是否无法无限循环。

再次感谢@Kyle