Создание цикла для скрытия строк, если строки скрыты на другом рабочем листе - PullRequest
0 голосов
/ 30 апреля 2018

Я новичок в 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

Прошу прощения, это первый раз, когда я публиковал сообщения, поэтому я очень незнаком с тем, как формулировать вещи или что я должен публиковать.

Позвольте мне повторить попытку:

У меня есть мастер лист. Он содержит текстовые данные в столбце A в строках 10: 185. Если какая-либо из этих строк НЕ имеет числовых данных в столбцах B - T, я написал макрос, который скрывает эти строки. Строки 10: 185 разбиты по категориям на 5 других листах. Я хочу иметь возможность скрывать те же строки в других листах, которые скрыты на мастер-листе. Я надеюсь, что это проясняет ситуацию.

Спасибо за вашу помощь.

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Если я правильно понимаю, вам нужен макрос, который проверяет каждую строку на мастер-листе, если она скрыта, то соответствующая строка, содержащая эту запись на одном из остальных 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
0 голосов
/ 30 апреля 2018

2 версии ниже работают одинаково

  • Если значения в Sheet1.ColA соответствуют значениям в Sheet2.ColB (Sheet3.ColB и т. Д.)
  • И, если строка в Sheet1 скрыта
    • Он будет скрывать (идентичные) строки в Sheet2, 3 и т. Д.

.

Версия 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
0 голосов
/ 30 апреля 2018

Чтобы оператор If возвращал значение true, если строка на активном листе скрыта или нет, вам нужно изменить

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

до

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

Это на самом деле вернет TRUE или False. Вам также понадобится 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, обновите ваши вопросы, чтобы мы могли помочь вам в дальнейшем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...