Excel Grouped Columns检查子项是否包含数据

时间:2012-09-26 12:42:39

标签: excel vba excel-formula

我有一个电子表格,其中包含一些软件产品列表,一些产品达到模块级别,其他产品只是一个产品。我有一个分组,将每个供应商的产品或产品模块分组......

excel表旨在将供应商产品(或模块,如果存在)映射到某些功能。单元格中的“X”表示支持该功能。在图片模块中,A1.1支持功能1. ...而产品A2(没有定义的模块)也支持功能1。

当处理分组列的“树”时出现问题...我需要一个子/函数来完成映射的其余部分。即...如果我检查单元格D2和E2我想运行一个函数,将单元格C2更新为X,然后单元格B2更新为X.(X表示所有模块都支持该函数)

因此,在图形中,手动输入红色单元格,并自动添加非红色“X”和“O”单元格。

我知道这种格式看起来似乎很懒,但我会很感激帮助,甚至可以指导正确的想法,大脑是炒的,我甚至无法思考如何解决这个问题......

enter image description here

1 个答案:

答案 0 :(得分:3)

您可以使用列中的OutlineLevel属性根据工作表大纲逻辑找到父级和子级。

尝试:

'This function goes thru the outline childrens of a cell and can apply some logic based on their value
Function SubComponentsPresent() As String
    Application.Volatile

    Dim RefRange As Range
    Set RefRange = Application.Caller

    Dim Childrens As Range
    Set Childrens = OutLineChildren(RefRange)

    Dim oCell As Range
    For Each oCell In Childrens
        '-----------
        'Insert code here
        '-----------
    Next oCell

    SubComponentsPresent = tOut
End Function

'This functions returns the childrens of a cell (Considering a column outLine)
Function OutLineChildren(RefCell As Range) As Range
    Dim oCell As Range
    Dim tOut As String

    With RefCell.WorkSheet
        If .Outline.SummaryColumn = xlSummaryOnRight Then
            Set oCell = RefCell.Offset(0, -1)
            Do Until oCell.EntireColumn.OutlineLevel <= RefCell.EntireColumn.OutlineLevel
                If oCell.EntireColumn.OutlineLevel = RefCell.EntireColumn.OutlineLevel + 1 Then
                    If tOut <> "" Then tOut = tOut & ","
                    tOut = tOut & oCell.Address
                End If
                Set oCell = oCell.Offset(0, -1)
            Loop
        Else
            Set oCell = RefCell.Offset(0, 1)
            Do Until oCell.EntireColumn.OutlineLevel <= RefCell.EntireColumn.OutlineLevel
                If oCell.EntireColumn.OutlineLevel = RefCell.EntireColumn.OutlineLevel + 1 Then
                    If tOut <> "" Then tOut = tOut & ","
                    tOut = tOut & oCell.Address
                End If
                Set oCell = oCell.Offset(0, 1)
            Loop
        End If
    End With
    Set OutLineChildren = RefCell.Worksheet.Range(tOut)
End Function