【问题标题】:Filter merged cells workaround过滤合并的单元格解决方法
【发布时间】:2016-09-09 17:24:41
【问题描述】:

我的问题:

我有一个包含要搜索的 ID 和名称的电子表格。
我以为我可以使用过滤器选项,但 id 或名称在合并单元格中,因此过滤器选项仅返回有关 id 或名称的第一行数据。

我的电子表格:

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

我调查的内容:

How to sort/filter merged cells in Excel?

在这里我了解到我可以通过取消合并单元格并赋予它们相同的值来获取所有数据。但是有几个问题:

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

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

  3. 我已经编写了代码来写入和读取这些数据,我需要查看我是如何浏览电子表格的

How do I avoid merging cells vertically in excel?

这篇文章建议用单元格顶部的文本框替换合并的单元格,如果我有一个公式可以自动为文本框下的每个单元格指定文本框中的值,这可能会起作用。但同样,不是超级万无一失或干净。

解决方案?

我实际上并不想过滤数据。我希望用户使用搜索框找到工作表的正确部分。

我在想一个宏可以这样工作:

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

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

  3. 移除过滤器

  4. 选择我的细胞

这可能吗?

替代解决方案?

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

  2. 使每个过滤行下的 2 行可见

也可以,但没必要。

【问题讨论】:

  • 如果他们只需要到达工作表上的正确位置,您可以让用户在单元格或用户表单中输入名称,然后执行Range.Find 将他们带到该位置.如果这不是一个可用的解决方案,还有其他几种方法。
  • @Kyle 这可以工作。但是,如果可能,我想使用过滤器选项的搜索框。用户可能不知道正确的名称或 ID,因此很高兴有建议。我想我可以创建一个可用名称和 ID 的数组,但如果可能的话,我想省去自己的麻烦。
  • 我会创建一个包含所有可能条目的列表框,或者一个链接到所有可能条目的组合框,并让用户通过它。我建议不要尝试为自己节省几行代码,以获得效率较低且更容易出错的解决方法。
  • @Kyle 我会调查的。但我会留下这个问题。看看是否有人知道如何按照我的建议去做会很有趣。
  • 当然可以读取用户过滤器数据,剥离过滤器并获取信息。我只是看不到这种方法的好处。坦率地说,我只会取出合并的单元格。当您计划使用数据而不是仅仅查看数据时,它们只会引起头痛。请参阅here,了解如何开始读取过滤器数据。

标签: excel vba


【解决方案1】:

感谢@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

这段代码大部分是从这里借来的rippedhttp://www.rondebruin.nl/win/s9/win006.htm

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

它的作用

此代码侦听工作表上的任何更改。然后它会检测 B2 中是否发生了该更改并且 B2 是否为空。然后它检查前向搜索是否等于当前搜索。如果是这种情况,它会查找相同 searchTerm 的下一个实例,否则它会从顶部开始搜索。然后它进入结果。如果用户搜索不存在的东西如果转到顶部。

一个警告:在我的例子中,搜索框包含在搜索的列中。因此,如果用户搜索不存在的内容,它只会转到搜索框。如果您使用此代码并移动搜索框,则需要检查它是否没有无限循环。

再次感谢@Kyle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2016-07-05
    • 2019-10-04
    • 2012-08-18
    相关资源
    最近更新 更多