黙々とC#

"In a mad world of VBA, only the mad are sane" 『VBAという名の狂った世界で狂っているというのなら私の気は確かだ』


ソート

本記事は、Excel C# Script入門講座の1記事です。

ソート

Excelのソート機能を利用するには、ソートしたい範囲を示すRangeオブジェクトを用意し、当該RangeオブジェクトのSortメソッドを使用します。引数により昇順、降順などを指定できます。

※ Excel2007以降では、Sortメソッドに代えて、RangeオブジェクトにSortオブジェクトが用意されています。Sortオブジェクトの方が、オプションが豊富に用意されています。

Sortメソッドの構文

(Rangeオブジェクト).Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase, Orientation, SortMethod, DataOption1, DataOption2, DataOption3)

Sortメソッドの戻り値

何かが返ってくるが、使うことはないと思われる(未調査)。

Sortメソッドの引数

引数名 必須 / オプション 内容
Key1 省略可能 最初の並べ替えフィールドを指定します。
Order1 省略可能 Key1で指定した値の並び替え順序を指定します。
Key2 省略可能 2番目の並べ替えフィールドを指定します。
Type 省略可能 並べ替え基準にする要素を指定します。
Order2 省略可能 Key2で指定した値の並び替え順序を指定します。
Key3 省略可能 3番目の並べ替えフィールドを指定します。
Order3 省略可能 Key3で指定した値の並び替え順序を指定します。
Header 省略可能 最初の行にヘッダー情報が含まれているかどうかを指定します。
OrderCustom 省略可能 ユーザー設定の並べ替え基準を指定します。
MatchCase 省略可能 大文字小文字の区別を行うか指定します。
Orientation 省略可能 並べ替えを列単位で行うか、行単位で行うかを指定します。
SortMethod 省略可能 並べ替えの方法を指定します。
DataOption1 省略可能 Key1 で指定した範囲でテキストを並べ替える方法を指定します。
DataOption2 省略可能 Key2 で指定した範囲でテキストを並べ替える方法を指定します。
DataOption3 省略可能 Key3 で指定した範囲でテキストを並べ替える方法を指定します。
引数Key1, Key2, Key3

Rangeオブジェクトまたは文字列(範囲名かピボットテーブル名)で指定します。

Key2, Key3については、ピボットテーブルレポートを並び替える場合には使用できません。

引数Order1, Order2, Order3

XlSortOrder 列挙型を指定します。

名前 説明
xlAscending 1 指定したフィールドを昇順で並べ替えます。(デフォルト値)
xlDescending 2 指定したフィールドを降順で並べ替えます。
引数Type

XlSortType 列挙型を指定します。

この引数は、ピボットテーブル レポートを並べ替えるときにだけ使用します。

名前 説明
xlSortValues 1 ピボットテーブル レポートをで並べ替えます。
xlSortLabels 2 ピボットテーブル レポートをラベルで並べ替えます。
引数Header

XlYesNoGuess列挙型を指定します。

名前 説明
xlGuess 0 見出しがあるかどうか、ある場合はその場所を Excel が自動判定します。
xlYes 1 範囲全体が並べ替えられません。
xlNo 2 範囲全体が並べ替えの対象になります。 (デフォルト値)
引数OrderCustom

『ユーザー設定リストの何番目』の基準を用いるかを整数値で指定します。

ユーザー設定の並べ替え基準は、あらかじめユーザー設定リストに登録されているものしか使えません。

引数MatchCase

true の場合、大文字と小文字を区別して並べ替えを行います。false の場合、大文字と小文字を区別しないで並べ替えを行います。

この引数は、ピボットテーブルの並べ替えには使用できません。

引数Orientation

XlSortOrientation 列挙型を指定します。

名前 説明
xlSortColumns 1 |列単位で並べ替えます。
xlSortRows 2 行単位で並べ替えます。(デフォルト値)
引数SortMethod

XlSortMethod 列挙型を指定します。

名前 説明
xlPinYin 1 中国語の発音表記の順で並べ替えます。(デフォルト値)
xlStroke 2 各文字の総画数で並べ替えます。
引数DataOption1, DataOption2, DataOption3

XlSortDataOption 列挙型を指定します。

名前 説明
xlSortNormal 0 数値データとテキスト データを別々に並べ替えます。(デフォルト値)
xlSortTextAsNumbers 1 テキストを数値データとして並べ替えます。

サンプルコード

//Sheet1のセル範囲"A1:B100"を、2列目をキーにして昇順にソートする
Excel.Worksheets("Sheet1").Activate();
var range = Excel.Worksheets("Sheet1").Range(Cells(1, 1), Cells(100, 2));
range.Sort(Key1:Worksheets("Sheet1").Cells(1, 2), Order1:xlAscending);

下記例では、複数のキーを用いてソートする場合を示しています。

//セル範囲"A1:C100"を1列目は降順、2列目は昇順、3列目は降順にソート

var range = Excel.Worksheets("Sheet1").Range(Cells(1, 1), Cells(300, 3));
var col_1 = Excel.Worksheets("Sheet1").Cells(1, 1);
var col_2 = Excel.Worksheets("Sheet1").Cells(1, 2);
var col_3 = Excel.Worksheets("Sheet1").Cells(1, 3);
range.Sort(Key1:col_1, Order1:2, Key2:col_2, Order2:1, Key3:col_3, Order3:2);

下記例では、列Aに並んでいる色をSortメソッドで並べ替えます。

f:id:d_ymkw:20160804191843p:plain

ソートを行うにあたっては、ColorIndex プロパティを使用して、列 A 内のセルの色の値を取得し、その値を使用しています。

 //A列の色の 値(ColorIndex)をC列に表示
 var s = Excel.ActiveWorkbook.ActiveSheet;
 for(var i = 2; i < 11; i++)
 {
     s.Cells(i, 3).Value = s.Cells(i, 1).Interior.ColorIndex;
 }
s.Range("C1").Value = "Index"; //Phase1

//C列を基準にA~C列の範囲を並べ替え
s.Columns("A:C").Sort(Key1:s.Range("C2"), Order1:1, header:1); //Phase2

//C列を削除
s.Columns(3).ClearContents();

f:id:d_ymkw:20160804192515p:plain