3流プログラマのメモ書き

元開発職→現社内SEの三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.Net)C#からExcelへの遅延バインディングで、ソートする

(.Net)C#から遅延バインディングでExcelファイルに読み書きするで、C#からExcelへ遅延バインディングを使ったアクセスを書きましたが、今回は任意の範囲のデータの並び替え(ソート)を行う方法です。

並び替えはRangeオブジェクトの Sort メソッドで設定できます。

例えば、A19:C25の範囲で、まずA列を昇順に、ついでB列を降順に並び替えるには以下のようにします。 (シートオブジェクトまでは生成していることとします。)

//oSheetはシートオブジェクト
object oRange=null;
object oRangeKey1=null;
object oRangeKey2=null;

//1番目の並び替えとなるフィールドを指定。
oRangeKey1 = oSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null
    , oSheet, new object[] { "A1", Missing.Value });
//2番目の並び替えとなるフィールドを指定。
oRangeKey2 = oSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null
    , oSheet, new object[] { "B1", Missing.Value });
//並び替えの対象範囲指定
oRange = oSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null
    , oSheet, new object[] { "A19:B25", Missing.Value });
//ソート をおこなう。
oRange.GetType().InvokeMember("Sort", BindingFlags.InvokeMethod, null
    , oRange, new object[] { 
        oRangeKey1 ,    //Key1 1番目の並べ替えの対象の最初のフィールドを指定。
        1 ,             //XlSortOrder 省略可能。引数Key1で指定した範囲の並べ替え順序を指定。1(既定値):昇順 2:降順
        oRangeKey2 ,    //Key2 省略可能。2番目の並べ替えの対象の最初のフィールドを指定。
        Missing.Value,  //Type 省略可能。並べ替える要素を指定。ピボットテーブル レポートを並べ替えるときにのみ使用。
        2 ,             //Order2 省略可能。引数Key2で指定した範囲の並べ替え順序を指定。1(既定値):昇順 2:降順
        Missing.Value , //Key3 省略可能。3番目の並べ替えの対象の最初のフィールドを指定。
        Missing.Value , //Header 省略可能。最初の行にヘッダーかどうかを指定。0:ヘッダーがあるかどうかをExcelが調べる。1(既定値):範囲全体が並べ替えられない。2:範囲全体が並べ替えの対象。
        Missing.Value , //OrderCustom ユーザー設定の並べ替え順のリスト内の番号を示す、1 から始まる整数。
        Missing.Value , //MatchCase 省略可能。true:大文字小文字を区別して並べ替え。false:大文字小文字は区別しない。
        Missing.Value , //Orientation 省略可能。並べ替えの方向を指定。2(既定値):行単位で並び替え。1:列単位で並び替え。
        Missing.Value , //SortMethod 省略可能。並べ替えの種類を指定。1(規定値):中国語の発音表記の順で並べ替え。2:各文字の総画数で並べ替え。
        Missing.Value , //DataOption1 省略可能。key1の文字列並び替え方法指定。0(既定値):数値とテキストを別々に並べ替え。1:テキストを数値として並べ替え。
        Missing.Value , //DataOption2 省略可能。key2の文字列並び替え方法指定。0(既定値):数値とテキストを別々に並べ替え。1:テキストを数値として並べ替え。
        Missing.Value   //DataOption3 省略可能。key3の文字列並び替え方法指定。0(既定値):数値とテキストを別々に並べ替え。1:テキストを数値として並べ替え。
    });

Key1-3の引数に並び替え対象データが入った列を含むRangeオブジェクトを指定しています。 引数が多いメソッドなので、ちょっとでも間違えると例外を吐いてしまうのでよく検証してから実装することが必要だと思います。

参考:
MSDN:Range.Sort メソッド (Microsoft.Office.Interop.Excel)
鵜原パソコンソフト研究所:エクセル(Excel)関数・超技(定数の値がまとめられています)