【C#】Excelで複数の選択範囲を取得/選択する。

こういうのに対する操作。

$B$2:$D$3,$B$6:$D$7みたいなデータが欲しい、あるいはこの範囲を選択させたい。

f:id:Hamukoro:20180927011219p:plain

 

using Microsoft.Office.Interop.Excel;

var xlapp=new Application();

 COM解放については省略。

Excelから選択範囲をList<Range>で取得

複数にまたがった選択範囲はxlapp.Selection.Areasで取得できる。

Selectionプロパティは現在選択されているオブジェクトを返す。選択されているのがセルならRangeで返ってくるのでいいのだが、オートシェイプなんかが選択されているとそっちが返ってくるので注意されたい。

 

Selection.Areasプロパティはforeachで回せる。varだと受けられないので、Rangeで受ける。

Areas areas = xlapp.Selection.Areas;

foreach (Range item in areas)

{

    Console.WriteLine(item.Address);

}

Range型でぎっしりつまっているのがわかる。

このままでは使いにくいのでリストにしまう。

Areas areas = xlapp.Selection.Areas;

var selectionList = new List<Range>();

foreach(Range item in areas)

{

    selectionList.Add(item);  

}

item.AddressをList<string>で持ってもいい。この辺は好み。

selectionList内の値をExcel上で選択する。

Unionメソッドを使う。UnionメソッドはRange型の引数が2つ以上必要で、その割に配列とかで渡すオーバーロードがないクソメソッド。なのでちょっと工夫が必要。

 

//先にひとつだけ選択しておく。

xlapp.ActiveSheet.Range(selectionList[0].Address).Select();

for (int i = 1; i < selectionList.Count; i++)

{

    //型が合わないので直接Unionの中には入れられないので一旦変数にとって渡す。

    Range selection = xlapp.Selection;

    xlapp.Union(selection,xlapp.ActiveSheet.Range(selectionList[i].Address)).Select();

}

ActiveSheet.selectionList[i]とすると何故か怒られるのでRangeに渡す。

 

SellectionもUnion()もApplication直下にしか使えないので、操作したいシートをアクティブにしておく必要がある。

xlapp.Worksheets[1].Selection;

みたいなことはできない。

 

参考

VBAで選択範囲を追加したい - VBAでA~Hの1行を選択して、違う行も同じ範囲... - Yahoo!知恵袋

Range.Areas Property (Microsoft.Office.Interop.Excel) | Microsoft Docs

_Global.Union(Range, Range, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object) Method (Microsoft.Office.Interop.Excel) | Microsoft Docs