【NetOffice】指定したセルの終端セルを探す。Range.Endメソッド
- 2012.11.29 Thursday
- 20:58
JUGEMテーマ:コンピュータ

Source and Project
------------------------------------------
Summary
Range.Endメソッドを利用すると、指定されたセル(Rangeオブジェクト)から上、下、右、左のいずれかの終端セルを見つける事ができます。
------------------------------------------
サンプルコード
using System;
using System.Linq;
using NetOffice.ExcelApi;
using NetOffice.ExcelApi.Enums;

Source and Project
------------------------------------------
Summary
Range.Endメソッドを利用すると、指定されたセル(Rangeオブジェクト)から上、下、右、左のいずれかの終端セルを見つける事ができます。
------------------------------------------
サンプルコード
using System;
using System.Linq;
using NetOffice.ExcelApi;
using NetOffice.ExcelApi.Enums;
namespace Art55.NetOfficeDemo20121129_001
{
class Program
{
static void Main()
{
var application = new Application { Visible = true };
Worksheet worksheet = application.Workbooks.Add().Worksheets.OfType<Worksheet>().First();
var values = new object[,]
{
{null, null, null, null, null, null},
{null, null, null, "○", null, null},
{"○", "○", "○", "○", "○", "○"},
{"○", "○", "○", "○", "○", "○"},
{"○", "○", "○", "●", "○", "○"},
{"○", "○", "○", "○", "○", "○"},
{"○", "○", "○", "○", "○", "○"},
{"○", "○", "○", null, "○", "○"},
{"○", "○", "○", "○", "○", "○"}
};
{
class Program
{
static void Main()
{
var application = new Application { Visible = true };
Worksheet worksheet = application.Workbooks.Add().Worksheets.OfType<Worksheet>().First();
var values = new object[,]
{
{null, null, null, null, null, null},
{null, null, null, "○", null, null},
{"○", "○", "○", "○", "○", "○"},
{"○", "○", "○", "○", "○", "○"},
{"○", "○", "○", "●", "○", "○"},
{"○", "○", "○", "○", "○", "○"},
{"○", "○", "○", "○", "○", "○"},
{"○", "○", "○", null, "○", "○"},
{"○", "○", "○", "○", "○", "○"}
};
Range range = worksheet.Range(worksheet.Cells.First(),
worksheet.Cells[values.GetLength(0), values.GetLength(1)]);
range.Value2 = values;
worksheet.Cells[values.GetLength(0), values.GetLength(1)]);
range.Value2 = values;
Console.ReadLine();
Range baseCell = range
.First(cell => (cell.Value2 == null ? string.Empty : cell.Value2.ToString()) == "●");
baseCell.End(XlDirection.xlDown).Value = "xlDown";
baseCell.End(XlDirection.xlToLeft).Value = "xlToLeft";
baseCell.End(XlDirection.xlToRight).Value = "xlToRight";
baseCell.End(XlDirection.xlUp).Value = "xlUp";
}
}
}
■下の終端
baseCell.End(XlDirection.xlDown).Value = "xlDown";
■左の終端
baseCell.End(XlDirection.xlToLeft).Value = "xlToLeft";
■右の終端
baseCell.End(XlDirection.xlToRight).Value = "xlToRight";
■上の終端
baseCell.End(XlDirection.xlUp).Value = "xlUp";
.First(cell => (cell.Value2 == null ? string.Empty : cell.Value2.ToString()) == "●");
baseCell.End(XlDirection.xlDown).Value = "xlDown";
baseCell.End(XlDirection.xlToLeft).Value = "xlToLeft";
baseCell.End(XlDirection.xlToRight).Value = "xlToRight";
baseCell.End(XlDirection.xlUp).Value = "xlUp";
}
}
}
■下の終端
baseCell.End(XlDirection.xlDown).Value = "xlDown";
■左の終端
baseCell.End(XlDirection.xlToLeft).Value = "xlToLeft";
■右の終端
baseCell.End(XlDirection.xlToRight).Value = "xlToRight";
■上の終端
baseCell.End(XlDirection.xlUp).Value = "xlUp";
実行すると


●から見て、上の終端がxlUp、左がxlToLeft、右がxlToRight、下がxlDownとなっています。
この動きはキーボードのEnd + [方向キー↑↓←→]のいずれかを押したときの動作と同じになるようです。
感想なのですが、このRange.Endメソッドの終端の判定がよくわからず、扱いに困りそうな気がします。NetOfficeを利用するなら.NET Frameworkを活用した方が良いような気がします。と、思ってLinqで書いてみたのですが、どうもぱっとしない(笑)
Range xlDownCell = baseCell.Offset(
Enumerable
.Range(0, worksheet.UsedRange.Rows.Count + worksheet.UsedRange.Cells.Row - baseCell.Row - 1)
.TakeWhile(rowIndex => baseCell.Offset(rowIndex, 0).Value2 != null)
.Last(), 0);
Linqでindexを扱うと、どうも読みくいと感じてしまいます。あとどこまで調べれば良いのか悩みます。
■自分自身が空だったら

自分自身が終端だったら、上記のように動くようです。
■自分自身とその周りの空だったら

むしろ何もないところから探すというのが本来の使用用途なのかもしれないくらい、良い感じで動いてくれます。このメソッドをフランクな感じでいうと「何もないところと何かあるところの、何かある方の境界を取得するメソッド」といえます。
■何もかもない場合



壁にぶち当たるようです。何もない場合は何もないところの限界までいくようです。なので解される値が、かならず何かの値を持っているとはかぎらないようです。この点は注意が必要そうです。
■Range.Valueはnullでも背景やフォントなどの書式が設定されている場合

既定の背景色やフォントカラーから外れているセルでも、何もないと判定され、その直前のセルが終端とみなされるようです。UsedRangeでは使われていると判定されていたような気もしますが・・・。
■コメントを入れてみた

コメントも、何もないと判定されるようです。
■式を入れてみた。

見た目は何も表示されていないように見える式をいれてみたところ、何かあると判定されました。よって終端が変わったことがわかります。
Source and Project
--------------------------------------
(追記)
キー操作でEnd + ↓ の動きを図にしました。

正直な話、この動きでロジックを組もうとした場合に、値があるセルの上部の終端なのか下部の終端なのかワークシート全体の上部の終端なのか全体の下部の終端なのか判定する必要があるので、扱いづらいと感じます。もちろんユーザが操作する場合は、シートに情報が見えているので察しのつくレベルなので問題なく、逆に「なぜここで止まる?」と思うような動きをした場合は、ユーザに「ここに何かあるよ」とExcel側が教えてくれる機能であるとも言えるので、End+矢印はユーザにとっては使える機能であることは間違いなのですが・・・・。
--------------------------------------
本投稿は、CodePlexで公開されているNetOfficeを利用していませんが、紹介します。
NetOffice - MS Office in .NET
http://netoffice.codeplex.com/
NetOffice関連の記事は下記にまとめています。
【NetOffice】【Excel】NetOfficeのまとめ
http://pro.art55.jp/?eid=1304102
--------------------------------------