ソリューションエクスプローラを全て折りたたむマクロ

  1. Visual Studioのメニューバーから[ツール] - [マクロ] - [マクロ IDE]を選択
  2. マクロ IDEのプロジェクトエクスプローラーでプロジェクトを選択してメニューバーから[ファイル] - [新しい項目の追加]を選択
  3. 新しい項目の追加ダイアログでモジュールを選択して開く
  4. 以下のソースをモジュールに記述
  5. 実行する際はメニューバーから [ツール] - [マクロ] - [マクロエクスプローラー]を選択して実行する

 


   ' ソリューションTree内のプロジェクトをすべて折りたたむ
    Sub CollapseAllProject()
        ' ソリューションエクスプローラーオブジェクトを取得
        Dim solutionExplorer As UIHierarchy = DTE.Windows.Item(Constants.vsext_wk_SProjectWindow).Object()

        ' ソリューション以下の階層アイテムがなければスルー
        If (solutionExplorer.UIHierarchyItems.Count = 0) Then
            Return
        End If

        ' ルートノードを取得。操作中断。
        Dim rootNode As UIHierarchyItem = solutionExplorer.UIHierarchyItems.Item(1)
        rootNode.DTE.SuppressUI = True

        ' すべてのプロジェクトをたたむ。再帰。
        CollapseProject(rootNode, solutionExplorer)

        ' ルートノードを選択。
        ' ドキュメント選択時にソリューションTreeを同期する設定に。
        rootNode.Select(vsUISelectionType.vsUISelectionTypeSelect)

        ' 操作再開。
        rootNode.DTE.SuppressUI = False
    End Sub

    ' ノード内にあるプロジェクトを折りたたむ
    Private Sub CollapseProject(ByVal item As UIHierarchyItem, ByRef solutionExplorer As UIHierarchy)
        ' 対象ノードの子ノードを対象。
        For Each innerItem As UIHierarchyItem In item.UIHierarchyItems
            If innerItem.UIHierarchyItems.Count > 0 Then

                ' 下の子がいれば再帰
                CollapseProject(innerItem, solutionExplorer)

                ' 折りたたむ
                If innerItem.UIHierarchyItems.Expanded Then
                    innerItem.UIHierarchyItems.Expanded = False
                    If innerItem.UIHierarchyItems.Expanded = True Then
                        ' VisualStudio2005のバグ用
                        innerItem.Select(vsUISelectionType.vsUISelectionTypeSelect)
                        solutionExplorer.DoDefaultAction()
                    End If
                End If

            End If
        Next
    End Sub