VSTO C# Excelアドインで行や列をグループ化・グループ化解除する方法

C#

VSTOはVisual Studio Tools for Office の略で、officeのアドインやマクロ付きドキュメントを、VB.netやc#などで記述できるフレームワークです。Visual Studioで開発することができ、VBAとオサラバできるMS公式フレームワークです。

この記事では、c#で、行や列をグループ化したりグループ化を解除する方法を紹介します。

グループ化って?

グループ化とは行や列を非表示にすることができる機能です。セル幅や高さを小さくする非表示とは違い、グループ化すると行や列に表示と非表示を切り替えるボタンが追加されます。

アウトラインとも言われていますね。

選択した列をグループ化・グループ化解除するコード

まずは選択したセル範囲をselectedRangeオブジェクトに格納します。選択したセル範囲はGlobals.ThisAddIn.Application.Selectionで取得できます。

このselectedRangeからGroup()メソッドを呼ぶとグループ化されます。UnGroup()メソッドを呼ぶとグループ化が解除されます。

以下の関数GroupColumnは引数にbool型のgroupModeを持ちます。groupModeがTrueの場合はグループ化、Falseの場合はグループ化解除になります。

        public static void GroupColumn(bool groupMode)
        {
            Excel.Range selectedRange = Globals.ThisAddIn.Application.Selection;
            if (groupMode) selectedRange.Group();
            else selectedRange.Ungroup();
        }

選択した行をグループ化・グループ化解除するコード

行をグループ化するときも、列の時と基本的には一緒です。セル範囲オブジェクトのGroup()Ungroup()メソッドを呼び出します。

ただし、列の時より行の方がちょっと面倒です。何が面倒かというと、行全体指定のセル範囲表現にする必要があります。例えば、4:10と記述するとこれは4行目から10行目の行全体を範囲指定する表現です。このように、現在のセル範囲から行全体の範囲選択に変換するロジックが含まれています。

        public static void GroupRow(bool groupMode)
        {
            Excel.Range selectedRange = Globals.ThisAddIn.Application.Selection;

            int startRowIndex = selectedRange.Row;
            int endRowIndex = selectedRange.Row + selectedRange.Rows.Count - 1;

            Excel.Range groupRange = Globals.ThisAddIn.Application.ActiveSheet.Rows[startRowIndex + ":" + endRowIndex];

            if(groupMode) groupRange.Group();
            else groupRange.Ungroup();

        }

ソースコード全文

ソースコード全文は以下のgithubリポジトリに格納しています。

コンパイルすれば動作しますので、Visual Studioをお持ちの方は遊んでみてください。

https://github.com/harus0313/cliesx


コメント

タイトルとURLをコピーしました