如何隐藏Excel VBA中“第二个”重复值下面的下30行

问题描述 投票:-2回答:1

我对此进行了大量搜索,并且不能自己做,所以试图获得专家意见

我想基于重复值隐藏行块,但保持第一个重复值和行可见,这意味着:

我有单元格B20, B50,B80,B110,B140等根据另一个表单条目自动填写“没问题”,所以数据不是唯一的“每次都相同”并且可能经常有重复值的时间,我想要隐藏下面的30行以下第二个重复,保留第一个块。示例:在下面的单元格值1111的示例中,我想保持第20到第49行可见“因为它是第一个副本”但是隐藏了行80到109并且还隐藏了行140到169,因为它们是第二个和第三个重复项并且等等。

B20 1111
B21 something
B22 something
.
.
.
B50 2222
B51 something
B52 something
.
.
.
B80 1111
B81 something
B82 something
.
.
.
B110 2222
B111 something
B112 something
.
.
.
B140 1111
B141 something
B142 something
.
.
.
Etc…

到目前为止,我尝试了很多东西但是根据上面的例子,不能根据重复进行选择性块行隐藏。所以如果你有时间请分享你的魔力。

excel vba excel-vba duplicates
1个回答
0
投票

将此代码放入工作表的私有代码表(右键单击工作表名称选项卡,查看代码)

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("B20,B50,B80,B110,B140")) Is Nothing Then
        On Error GoTo safe_exit
        Application.ScreenUpdating = False
        Application.EnableEvents = False
        Dim t As Range, r As Range, b As Boolean
        Range("B20").Resize(150, 1).EntireRow.Hidden = False
        For Each t In Range("B20,B50,B80,B110,B140")
            b = False
            For Each r In Range("B20,B50,B80,B110,B140")
                If r.Value = t.Value And b Then
                    r.Resize(30, 1).EntireRow.Hidden = b
                ElseIf r.Value = t.Value Then
                    r.Resize(30, 1).EntireRow.Hidden = b
                    b = True
                End If
            Next r
        Next t
    End If

safe_exit:
    Application.EnableEvents = True
    Application.ScreenUpdating = True

End Sub
© www.soinside.com 2019 - 2024. All rights reserved.