Select 跨多列的范围 - Excel VBA

Select Range over multiple columns - Excel VBA

我正在尝试按下拉列表中设置的值对列进行排序。 我已经让它为一个专栏工作。

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

但我希望能够通过 B1 中的值对多列(A、B 和 C)进行排序,并隐藏所有不包含该特定值的行。见附图。 Link: 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

请尝试下一个改编代码:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim lastR As Long, C As Range, rngDel As Range
  If Target.Address = "$B" 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" 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 列。