【问题标题】:Select Range over multiple columns - Excel VBA选择多列范围 - Excel VBA
【发布时间】:2021-05-22 04:42:29
【问题描述】:

我正在尝试按下拉列表中设置的值对列进行排序。 我已经让它适用于一列。

在单元格中设置的值:B1 从 A5 中对 A 列进行排序并隐藏不包含该值的单元格。

但我希望能够通过 B1 中的值对多列(A、B 和 C)进行排序,并隐藏所有不包含该特定值的行。见附图。关联: https://i.stack.imgur.com/9NqC3.png

工作代码:

    Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("B1")) Is Nothing Then
    If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
    If Len(Range("B1").Value) > 0 Then Range("A5", Range("A" & Rows.Count).End(xlUp)).AutoFilter Field:=1, Criteria1:=Range("B1").Value
  End If
End Sub

【问题讨论】:

  • 不清楚你真正想要完成什么。您要排序还是过滤?如果要过滤,是否要同时过滤讨论中的所有列?是否要根据能够指定列的特定条件一次过滤每一列?
  • 我只是希望能够同时过滤所有列。
  • 我在 A、B 和 C 列中有不同的值,并且想要隐藏/过滤所有不包含单元格 B1 下拉列表中数据的行。
  • “B1”的值怎么看?
  • 您没有回答我的澄清问题...如果您说您向我们展示的代码正在运行,并且您需要隐藏过滤列值不等于某些值的行,则值为“ B1”应该类似于“Test”...如果是,请测试我发布的代码。

标签: excel vba dropdown


【解决方案1】:

请尝试下一个修改后的代码:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim lastR As Long, C As Range, rngDel As Range
  If Target.Address = "$B$1" Then
    If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
    If Target.Value <> "" Then
        lastR = Me.Range("A" & Rows.count).End(xlUp).row
        With Me.Range("A5:C" & lastR)
            .AutoFilter field:=1, Criteria1:=Target.Value
            For Each C In Me.Range("B6:C" & lastR)
                If C.Value = Target.Value Then
                    If rngDel Is Nothing Then
                        Set rngDel = C
                    Else
                        Set rngDel = Union(rngDel, C)
                    End If
                End If
            Next
            If Not rngDel Is Nothing Then rngDel.EntireRow.Hidden = False
        End With
    End If
  End If
End Sub

已编辑: 以下代码适用于您的最后一个工作簿结构。请尝试学习并理解它

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim lastR As Long, C As Range, rngDel As Range
  If Target.Address = "$E$1" Then
    If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
    If Target.Value <> "" Then
        lastR = Me.Range("B" & Rows.Count).End(xlUp).Row
        With Me.Range("G1:J" & lastR)
            .AutoFilter field:=1, Criteria1:=Target.Value
            For Each C In Me.Range("G2:J" & lastR)
                If C.Value = Target.Value Then
                    If rngDel Is Nothing Then
                        Set rngDel = C
                    Else
                        Set rngDel = Union(rngDel, C)
                    End If
                End If
            Next
            If Not rngDel Is Nothing Then rngDel.EntireRow.Hidden = False
        End With
    End If
  End If
End Sub

您必须使用完整的填充列才能计算最后填充的行!

以上代码使用 B:B 列。

【讨论】:

  • @David Johansson:很高兴我(终于)能帮上忙!但在一分钟后,我将发布一个更新速度更快的代码,保持范围在联合范围内取消隐藏并立即取消隐藏。适用于已处理列中的大范围...
  • @David Johansson:请测试/使用更新后的代码。
  • 是的,它工作正常,但我不知道如何移动要过滤的单元格。假设我想将 G 列过滤为 K。我需要改变什么。抱歉这个基本问题...
  • @David Johansson:“移动要过滤的单元格”是什么意思?我错过了你问题的这一部分吗?我只能看到与过滤相关的部分。
  • 是的,我希望能够自己更改单元格,具体取决于 Excel 表的结果。您的代码适用于我最初的问题,但我想了解如何更改应过滤的单元格。但是当我尝试修改您的代码以过滤例如列 G 到 K 时,我无法理解/让它工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
相关资源
最近更新 更多