【问题标题】:Creating Loop to Hide Rows if Rows are Hidden on another Worksheet如果行隐藏在另一个工作表上,则创建循环以隐藏行
【发布时间】:2020-07-03 16:40:47
【问题描述】:

我是 VBA 新手,并创建了一个宏,该宏将从工作表 1 中的单元格中获取一个值并将其与工作表 2 匹配。如果该行隐藏在工作表 1 上,它将隐藏工作表 2 上的行。我需要知道如何循环遍历工作表 1 和 2 上的所有行。然后我需要它继续将工作表 1 与工作表 3、4 和 5 匹配。我看过但似乎在各个论坛中找不到任何接近的东西。

这就是我所拥有的。我可以发布我尝试过的各种东西,但第一行都没有。

Sub HideRows

If ActiveSheet.Range("A10") = Worksheets("Sheet2").Range("B5") And _
ActiveSheet.Range("A10").EntireRow.Hidden = True Then
Worksheets("Sheet2").Rows(5).EntireRow.Hidden = True

End Sub

抱歉,这是我第一次发帖,所以我对如何措辞或应该发什么内容非常不熟悉。

让我再试一次:

我有一张主表。它在第 10:185 行的 A 列中有文本数据。如果这些行中的任何一个在 B 到 T 列中没有数字数据,我已经编写了一个隐藏这些行的宏。第 10:185 行在其他 5 个工作表上按类别细分。我希望能够在隐藏在主工作表上的其他工作表中隐藏相同的行。我希望这能让事情更清楚。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    要让 If 语句返回 true 是否活动工作表上的行是否隐藏,您需要更改

    ActiveSheet.Range("A10").EntireRow.Hidden = True Then
    

    ActiveSheet.Range("A10").EntireRow.Hidden Then
    

    这实际上会返回一个TRUEFalse 您还需要一个End If 用于多行If 语句。所以现在你的 If 语句看起来像这样:

    Sub HideRows
    
    If ActiveSheet.Range("A10") = Worksheets("Sheet2").Range("B5") And _ 
       ActiveSheet.Range("A10").EntireRow.Hidden Then
           Worksheets("Sheet2").Rows(5).EntireRow.Hidden = True
    End If
    
    End Sub
    

    所以这个宏只查看 A10 中的值,并测试它是否等于第二个工作表上的 B5,以及第 10 行是否隐藏在活动工作表上。如果您只想查看第一个单元格 A10,然后将它们与 B5 进行比较,那么下面的代码就可以做到这一点(注意:这假设工作表按名称顺序排列:

    Sub HideRows()
    
    Dim i As Integer
    
    For i = 2 To 5
        If ActiveSheet.Range("A10") = Sheets(i).Range("B5") And ActiveSheet.Range("A10").EntireRow.Hidden = True Then
            Sheets(i).Rows(5).EntireRow.Hidden = True
        End If
    Next i
    
    End Sub
    

    如果您需要对 A10 和 B5 以外的单元格进行更多分析,或者您需要的不仅仅是表格 1 到 5,请更新您的问题,以便我们进一步提供帮助。

    【讨论】:

    • 我很抱歉,这是我第一次发帖,所以我很不熟悉如何表达事物或我应该发布什么。
    • 让我再试一次:我有一张主表。它在第 10:185 行的 A 列中有文本数据。如果这些行中的任何一个在 B 到 T 列中没有数字数据,我已经编写了一个隐藏这些行的宏。第 10:185 行在其他 5 个工作表上按类别细分。我希望能够在隐藏在主工作表上的其他工作表中隐藏相同的行。我希望这能让事情变得更清楚。
    【解决方案2】:

    如果我理解正确,您需要一个宏来检查主工作表上的每一行,如果它被隐藏,那么其他 5 个工作表之一上包含该条目的相应行也应该被隐藏。

    因此,假设主工作表上 A 列中的文本现在位于其他工作表上的 B 列中,并假设其他 5 个工作表是工作表 (2) 到工作表 (6),这应该可以解决问题:

    Sub HideRows()
    Dim i, j As Integer
    Dim x As Range
    
    For i = 10 To 185
        'check if the row is hidden, if it isn't then no need to check the other sheets
        If ActiveSheet.Cells(i, 1).EntireRow.Hidden Then
            'loop through each of the other sheets and look for the value in column B, if found, hide the row.
            For j = 2 To 6
                'you have to "Set" an object variable such as a range reference
                'This Finds the value passed to it in the range that this is called from (in this case the entire B column)
                Set x = Sheets(j).Columns(2).Find(ActiveSheet.Cells(i, 1).Value, LookIn:=xlValues)
                If Not x Is Nothing Then
                    x.EntireRow.Hidden = True
                End If
            Next j
        End If
    Next i
    
    End Sub
    

    【讨论】:

    • @Pandora,这些回答是否回答了您的问题?如果是这样,请记住将其标记为已回答和/或为答案投票。
    【解决方案3】:

    以下两个版本的工作方式相同

    • 如果Sheet1.ColA 中的值与Sheet2.ColB 中的值匹配(Sheet3.ColB 等)
    • 而且,如果Sheet1 中的行被隐藏
      • 它将隐藏Sheet23等中的(相同的)行

    .

    版本 1


    Option Explicit
    
    Public Sub MatchAndHideRows()
    
        Const COL_1 = "A"   'column with text data in Sheet1 (Master Sheet)
        Const COL_2 = "B"   'column with text data in Sheets 2, 3, etc
    
        Dim ws1 As Worksheet, lr1 As Long, arr1 As Variant, d1 As Object
        Dim ws2 As Worksheet, lr2 As Long, arr2 As Variant, d2 As Object, r As Long
    
        Set ws1 = Sheet1    'Master Sheet (Or: Set ws1 = ThisWorkbook.Worksheets("Sheet1"))
        lr1 = ws1.Cells(ws1.Rows.Count, COL_1).End(xlUp).Row
        arr1 = ws1.Range(ws1.Cells(1, COL_1), ws1.Cells(lr1, COL_1)).Formula
    
        Set d1 = CreateObject("Scripting.Dictionary")
        Set d2 = CreateObject("Scripting.Dictionary")
    
        For r = 10 To lr1    'skip Header rows
            If ws1.Rows(r).Hidden Then d1(arr1(r, 1)) = 0   'remember all hidden rows
        Next
    
        For Each ws2 In ThisWorkbook.Worksheets 'iterate all sheets
            If ws1.Name <> ws2.Name Then        'except Master Sheet (Sheet1)
                lr2 = ws2.Cells(ws2.Rows.Count, COL_2).End(xlUp).Row
                arr2 = ws2.Range(ws2.Cells(1, COL_2), ws2.Cells(lr2, COL_2)).Formula
                For r = 5 To lr2    'skip Headers
                    If d1.Exists(arr2(r, 1)) Then d2(r) = 0
                Next
                ws2.UsedRange.Rows.Hidden = False
                If d2.Count > 0 Then
                    ws2.Range("A" & Join(d2.Keys, ",A")).EntireRow.Hidden = True
                End If
            End If
        Next
    End Sub
    

    .

    第 2 版


    Public Sub MatchAndHideRowsCheckRowByRow()
    
        Const COL_1 = "A"   'column with text data in Sheet1 (Master Sheet)
        Const COL_2 = "B"   'column with text data in Sheets 2, 3, etc
    
        Dim ws1 As Worksheet, lr1 As Long, rng1 As Range, c1 As Range
        Dim ws2 As Worksheet, lr2 As Long, rng2 As Range, c2 As Range
    
        Set ws1 = Sheet1    'Master Sheet (Or: Set ws1 = ThisWorkbook.Worksheets("Sheet1"))
    
        lr1 = ws1.Cells(ws1.Rows.Count, COL_1).End(xlUp).Row
    
        Set rng1 = ws1.Range(ws1.Cells(10, COL_1), ws1.Cells(lr1, COL_1)) 'skip Header rows
    
        Application.ScreenUpdating = False
        For Each c1 In rng1.Cells       'iterate each cell with data in Sheet1.ColA
            If Not IsError(c1) Then     'if current cell doesn't contain an error, continue
                For Each ws2 In ThisWorkbook.Worksheets 'iterate all sheets
                    If ws1.Name <> ws2.Name Then        'except Master Sheet (Sheet1)
                        lr2 = ws2.Cells(ws2.Rows.Count, COL_2).End(xlUp).Row
                        Set rng2 = ws2.Range(ws2.Cells(5, COL_2), ws2.Cells(lr2, COL_2))
                        For Each c2 In rng2.Cells   'iterate each cell in current sheet
                            If Not IsError(c2) Then
                                If c1.Value2 = c2.Value2 Then
                                    c2.EntireRow.Hidden = c1.EntireRow.Hidden
                                End If
                            End If
                        Next
                    End If
                Next
            End If
        Next
        Application.ScreenUpdating = True
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多