【NetOffice】Rangeメソッドでセルを指定する(単一・範囲・複数)

  • 2012.11.01 Thursday
  • 23:05
JUGEMテーマ:コンピュータ


おそらくVBAをご存じな方は常識の範囲の話だと思うのですが、私はVBAに対して無知なので、基本的なメソッドの挙動をひとつひとつ確かめる必要があります。ということで、今回は、Rangeメソッドを利用したいと思います。NetOffice.ExcelApi.Rangeクラスというのも存在しますが、それとは別物で今回は、NetOffice.ExcelApi.Rangeを返すWorksheet.Rangeメソッドが相手です。(Rangeオブジェクトを返すRangeプロパティや添え字演算子をもつものなど名前がかぶっているものが多く、C#では構文的にそれが何かわかるものの、それが型なのかメソッドなのかプロパティなのか判断がつきにくいという難点があります。)

Worksheet.Rangeメソッドは以下の二つを覚えておけば良いようです。

Worksheet.Range(object cell1, object cell2)
Worksheet.Range(object cell1)

使ってみないと内容がよくわからないので使ってみました。


// 単一のセルを指定
worksheet.Range("B2").Interior.Color = XlRgbColor.rgbCrimson;



// 範囲を指定
worksheet.Range("B2:D3").Interior.Color = XlRgbColor.rgbCrimson;
int count = 0;
worksheet.Range("B2:D3").ToList().ForEach(r => r.Value = count++);



// 複数のセルを指定
worksheet.Range("B2,D3").Interior.Color = XlRgbColor.rgbCrimson;
int count = 0;
worksheet.Range("B2,D3").ToList().ForEach(r => r.Value = count++);



// 範囲を指定
worksheet.Range("B2", "D3").Interior.Color = XlRgbColor.rgbCrimson;
int count = 0;
worksheet.Range("B2", "D3").ToList().ForEach(r => r.Value = count++);



// 範囲を指定
var cell1 = worksheet.Cells[2, 2];
var cell2 = worksheet.Cells[4, 3];
worksheet.Range(cell1, cell2).Interior.Color = XlRgbColor.rgbCrimson;
int count = 0;
worksheet.Range(cell1, cell2).ToList().ForEach(r => r.Value = count++);



// 範囲を指定
var range1 = worksheet.Range("B2:C5");
var range2 = worksheet.Range("F3:E4");
worksheet.Range(range1, range2).Interior.Color = XlRgbColor.rgbCrimson;
int count = 0;
worksheet.Range(range1, range2).ToList().ForEach(r => r.Value = count++);



// 範囲を指定
worksheet.Range("B2:B3", "C4:D5").Interior.Color = XlRgbColor.rgbCrimson;
int count = 0;
worksheet.Range("B2:B3", "C4:D5").ToList().ForEach(r => r.Value = count++);



// 複数の範囲の指定
worksheet.Range("C1,D3:F4,F1,G3:G5").Interior.Color = XlRgbColor.rgbCrimson;
int count = 0;
worksheet.Range("C1,D3:F4,F1,G3:G5").ToList().ForEach(r => r.Value = count++);


// 相対的指定
worksheet.Range("C1:D2").Range("B2").Interior.Color = XlRgbColor.rgbCrimson;
int count = 0;
worksheet.Range("C1:D2").Range("B2").ToList().ForEach(r => r.Value = count++);



// 列全体
worksheet.Range("B:C").Interior.Color = XlRgbColor.rgbCrimson;
int count = 0;
worksheet.Range("B:C")
    .TakeWhile((r, i) => i < 50)
    .ToList()
    .ForEach(r => r.Value = count++);



// 行全体
worksheet.Range("2:3").Interior.Color = XlRgbColor.rgbCrimson;
int count = 0;
worksheet.Range("2:3")
    .TakeWhile((r, i) => i < 10000)
    .ToList()
    .ForEach(r => r.Value = count++);

Rangeを列挙されて2行目に到達できるのかどうか気になりますが・・・調べてません。

// 名前から範囲を指定
worksheet.Range("B2:E3").Name = "LABEL1";
worksheet.Range("LABEL1").Interior.Color = XlRgbColor.rgbCrimson;
int count = 0;
worksheet.Range("LABEL1").ToList().ForEach(c => c.Value = count++);


// Nameオブジェクトから範囲を指定
Rangeメソッドの引数にNameオブジェクトを指定することでも、範囲を指定することができます。
Name name = application.Names.Add("NamedRange1", sheet.Range("A2:B3"));
((Worksheet)GlobalModule.Worksheets[2]).Activate();
Range range = application.Range(name);

// NG
// worksheet.Range("Sheet2!C12").Value = "Sheet2!C12";
// worksheet.Range(worksheet.Cells[1, 2]).Value = "worksheet.Cells[1, 2]";
// worksheet.Range("A1,B1", "C4,D5").Value = "¥"A1,B1¥", ¥"C4,D5¥"";
// worksheet.Range(1, 2).Value = "1, 2";


と、まあ意外にいっぱい指定方法があるようです。色々あるもののスタンダード出ないような指定方法はバグの元なので調子にのって書かないようにしなければなりません。するわけないけどね!
--------------------------------------
本投稿は、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
    123
45678910
11121314151617
18192021222324
252627282930 
<< June 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