Изменить значение родительской ячейки на основе значения всех дочерних ячеек - PullRequest
0 голосов
/ 11 апреля 2019

Надеюсь, что кто-то может помочь.

У меня есть следующие данные. В основном я хочу написать формулу / макрос, чтобы иметь возможность изменять статус Parent, когда все дочерние элементы закрыты. например, поскольку все дочерние элементы (1.1,1.2,1.3,1.4) родителя 1 закрыты, статус родителя 1 должен быть закрыт. Я не уверен, как это сделать.

Key Type    Status Parent Code
1   Parent   Open       1
1.1 Child   Closed      1
1.2 Child    Closed     1
1.3 Child   Closed      1
1.4 Child    Closed     1
2   Parent  Open        2
2.1 Child   Closed      2
2.2 Child   Open        2
2.3 Child   Open        2

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Вы можете попробовать:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim LastRow As Long, i As Long, ParentKey As Long
    Dim arr As Variant
    Dim booClose As Boolean

    With ThisWorkbook.Worksheets("Sheet1")

        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

        If Not Intersect(Target, .Range("C2:C" & LastRow)) Is Nothing And Target.Count = 1 Then

            If InStr(1, .Cells(Target.Row, 1).Value, ".") = 0 Then

                MsgBox "You are trying to manually change Parent Status."

            Else

                ParentKey = Mid(.Cells(Target.Row, 1).Value, 1, InStr(1, .Cells(Target.Row, 1).Value, "."))

                For i = 2 To LastRow

                    If InStr(1, .Cells(i, 1).Value, ".") <> 0 Then

                        If Mid(.Cells(i, 1).Value, 1, InStr(1, .Cells(i, 1).Value, ".")) = ParentKey Then

                            If .Cells(i, 3).Value = "Closed" Then

                                booClose = True

                            Else

                                booClose = False

                                Exit For

                            End If

                        End If

                    End If

                Next i

                For i = 2 To LastRow

                    If InStr(1, .Cells(i, 1).Value, ".") = 0 Then

                        If .Cells(i, 1).Value = ParentKey Then

                            Application.EnableEvents = False

                                If booClose = True Then
                                    .Cells(i, 3).Value = "Closed"
                                    Exit For
                                Else
                                    .Cells(i, 3).Value = "Open"
                                    Exit For
                                End If

                            Application.EnableEvents = True

                        End If

                    End If

                Next i

            End If

        End If

    End With

End Sub
0 голосов
/ 11 апреля 2019

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

=IF(B2="Parent",IF(COUNTIFS($B$2:$B$10,"Child",$C$2:$C$10,"Closed",$D$2:$D$10,D2)=COUNTIFS($B$2:$B$10,"Child",$D$2:$D$10,D2),"Closed","Open"),"")

enter image description here

Если вам нужно заполнить пробелы в столбце «Состояние», вы можете автоматически выполнить фильтрацию по типу = «Родитель», а затем вставить формулу в видимые поля столбца «Статус»:

=E1

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