2012-09-26 66 views
0

我有一個電子表格,其中包含例如軟件產品的列表,有些產品上升到模塊級別,其他產品只是一個產品。我有一個分組,將每個供應商的產品或產品模塊分組...Excel分組列檢查孩子是否包含數據

excel表旨在將供應商產品(或模塊,如果存在的話)映射到某些功能。單元格中的「X」表示該功能受支持。在圖片模塊A1.1中支持函數1. ...和產品A2(沒有定義的模塊)也支持函數1.

問題出現在處理分組列的「樹」時... i需要一個子/功能來完成映射的其餘部分。即...如果我檢查單元格D2和E2我想運行一個函數,將單元格C2更新爲X,然後將單元格B2更新爲X.(X表示所有模塊都支持該功能)

因此在圖形中,手動輸入紅色單元格,非紅色「X」和「O」單元格將自動添加。

我知道這似乎懶問這種格式,但是我將不勝感激幫助甚至獲得定向在正確的想法,大腦是油炸和思考如何解決這個我不能連...

enter image description here

+1

這似乎並不懶惰,似乎很難!我認爲這很容易打破。你的功能至少要走每個方向,如果他們停止滿足條件,就把細胞轉回到O's。另外,我不明白爲什麼B2是一個X,因爲G3是一個O.並且它與空白相同,例如I2?我唯一的建議是,如果供應商在行中列出,那麼供應商B出現在供應商A的最後一個功能之後,功能列表重新開始,這可能會更有效。我會認真考慮一個數據庫。 –

+0

我糾正了我的不一致性(即...我爲什麼要這個自動化的原因)..是的。這對於excel來說似乎有點太難了,應該放在數據庫中,然後可以在交叉表中顯示輸出。感謝您的輸入! – Hightower

+0

基於worksheet_change事件中的分組級別來做這件事相對容易,您是否還想要一個解決方案,還是將這個數據庫移動? – nutsch

回答

2

您可以使用位於列中的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 
+0

太棒了。謝謝!,這工作像一個魅力。真的很棒的代碼!,我需要做的就是在OutlineChildren(X)函數內循環時保持所有父節點的蹤跡,然後一旦找到沒有孩子的孩子,我可以執行我的邏輯並更新所有識別的父母... – Hightower

+0

+1。它似乎仍然是一個難以維護的系統,但是你的代碼非常好。 –