【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;
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, "○", "○"},
                                       {"○", "○", "○", "○", "○", "○"}
                                   };
            Range range = worksheet.Range(worksheet.Cells.First(),
                                          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";

実行すると





●から見て、上の終端がxlUp、左がxlToLeft、右がxlToRight、下がxlDownとなっています。

この動きはキーボードのEnd + [方向キー↑↓←→]のいずれかを押したときの動作と同じになるようです。私の使用しているキーボードではEndキーを押したい場合、Fnキーを押さなけばならないのですが、同時に方向キーを押した場合、「Pg Up」など別の意味になってしまい、試せません(汗)(訂正:ExcelではEndキーを押すと、Endモードに切り替わり、その後、方向キーを押すという操作で終端を探す操作ができるようです。なので同時押しは必要でなく、実際に私のPCでも操作が可能でした)

感想なのですが、この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
--------------------------------------

コメント
コメントする








    
この記事のトラックバックURL
トラックバック

calendar

S M T W T F S
   1234
567891011
12131415161718
19202122232425
2627282930  
<< November 2017 >>

あわせて読みたい

あわせて読みたいブログパーツ

selected entries

categories

archives

recent comment

  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    art55 (05/22)
  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    分解大好き (05/18)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/04)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    Gen (02/04)
  • 【キーボード】RealForce が壊れて帰ってきた。
    art55 (04/29)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/23)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    かるあ (02/22)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    art55 (01/16)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    karuakun (01/16)
  • 【NetOffice】【Excel】死なないExcelプロセスをKillする。
    art55 (12/05)

recent trackback

recommend

recommend

recommend

C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION)
C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION) (JUGEMレビュー »)
Sasha Goldshtein,Dima Zurbalev,Ido Flatow,サシャ・ゴルドシュタイン,ディマ・ズルバレフ,イド・フラトー

recommend

ろんりと集合
ろんりと集合 (JUGEMレビュー »)
中内 伸光
とてもわかりやすいです。

recommend

recommend

シャノン・ノイマン・ディジタル世界
シャノン・ノイマン・ディジタル世界 (JUGEMレビュー »)
市川 忠男
4章がリレーショナルデータベースな内容になってます。ページ数があまりありませんが、ポイントがものすごく的確にまとまっていて、感動します。

recommend

recommend

東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS
東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS (JUGEMレビュー »)

テンキーレス、静音のRealForce91UBK-S。スコスコ感がたまらなく気持ちいいです。家と会社で2台持ってます。

recommend

recommend

プログラミング.NET Framework 第4版 (プログラミングシリーズ)
プログラミング.NET Framework 第4版 (プログラミングシリーズ) (JUGEMレビュー »)
Jeffrey Richter
発売予定美 2013年10月10日。.NET Frameworkとお付き合いする人のバイブルですね。

recommend

recommend

キャット・シッターの君に。
キャット・シッターの君に。 (JUGEMレビュー »)
喜多嶋 隆
私のイラストレータデビュー本です。

recommend

Essential .NET ― 共通言語ランタイムの本質
Essential .NET ― 共通言語ランタイムの本質 (JUGEMレビュー »)
ドン・ボックス,クリス・セルズ,Don Box,Chris Sells,吉松 史彰

links

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM