【NetOffice】方法 : ワークシートを選択する
- 2012.11.09 Friday
- 00:09

Source and Project
Soruce and Project(追記分)
Microsoft.Office.Interop.Excelでできる事は、NetOfficeでも似たようなコードで実現できるのではないか!?という安易な発想でMSDNに書かれているコードを試してみることにします。
今回は
方法 : ワークシートを選択する
http://msdn.microsoft.com/ja-jp/library/x62t5306(v=vs.80).aspx
今回はワークシートを選択する方法です。とても簡単です。Worksheet.Selectメソッドを呼び出すか、Sheets.Selectメソッドを呼び出すだけで実現できます。ただし、ひとつ(?)落とし穴があるようです。それは、非表示になっているシートは選択できません。ってExcelアプリケーションから手動で操作すればわかり切ったことなのですが、プログラムで自動で行う場合、見えているのかどうかというチェックはセルフで行う必要があります。
ではサンプルコード
using System;
using System.Linq;
using NetOffice.ExcelApi;
using NetOffice.ExcelApi.Enums;
namespace Art55.NetOfficeDemo20121108_003
{
class Program
{
static void Main()
{
// 方法 : ワークシートを選択する
// http://msdn.microsoft.com/ja-jp/library/x62t5306(v=vs.80).aspx
var application = new Application {Visible = true};
Sheets worksheets = application.Workbooks.Add().Worksheets;
worksheets.Add(Type.Missing, worksheets.Last());
worksheets.Add(Type.Missing, worksheets.Last());
worksheets.Add(Type.Missing, worksheets.Last());
worksheets.Add(Type.Missing, worksheets.Last());
((Worksheet) worksheets[2]).Select();
Console.ReadLine();
// 3番目のシートを非表示にして選択してみる。
((Worksheet) worksheets[3]).Visible = XlSheetVisibility.xlSheetVeryHidden;
// ((Worksheet)worksheets[3]).Select(); // 例外
Console.ReadLine();
// 例外にはならないけど、違うものが選択される。
((Worksheet)worksheets[3]).Activate();
Console.ReadLine();
// 全選択
// worksheets.Select(); // 例外
Console.ReadLine();
// 見えているシートを全選択。
string[] visibleSheets = worksheets
.OfType<Worksheet>()
.Where(s => s.Visible == XlSheetVisibility.xlSheetVisible)
.Select(s => s.Name).ToArray();
((Sheets) worksheets[visibleSheets]).Select();
Console.ReadLine();
}
}
}
ひとつひとう解説していくと。
■ワークシートを末尾にいくつか追加します。
worksheets.Add(Type.Missing, worksheets.Last());
■2番目のシートを選択します。
((Worksheet) worksheets[2]).Select();
■3番目のシートを非表示にします。
((Worksheet) worksheets[3]).Visible = XlSheetVisibility.xlSheetVeryHidden;
■3番目のシートを選択します。
// ((Worksheet)worksheets[3]).Select(); // 例外
見えないシートは選択できず例外が発生します。
■3番目のシートをアクティブにしてみます。
((Worksheet)worksheets[3]).Activate();
例外は発生しませんが、3番目ではなく4番目のシートが選択されてしまいました。全く嬉しくありません。そもそも見えないシートを選択したかった理由を、問い詰めなければなりません。
■全選択したくて・・・
application.Workbooks.Add().Worksheets.Select()
とかすると、例外が飛んできます。
■見えてるシートを全選択するようにコードで実現してみました。
string[] visibleSheets = worksheets
.OfType<Worksheet>()
.Where(s => s.Visible == XlSheetVisibility.xlSheetVisible)
.Select(s => s.Name).ToArray();
((Sheets) worksheets[visibleSheets]).Select();
worksheets[string[] names]かworksheets[int[] indexs]でSheetsオブジェクトが取得できるようです。
worksheets[string names]かworksheets[int indexs]だと、Worksheet(他にもある?)ですね。
Sheets.Selectメソッドを呼び出すことで、コレクションされているシート全部が選択できます。
---------------------------------------------
(追記)
Worksheet.Select(false)/Sheets..Select(bool replace)の第一引数は、現状の選択シートと入れ替えるかどうかという設定で、trueにすると、現状の選択シートは考慮されず指定したシートのみが選択シートとなります。falseを指定した場合は、現状の選択シートにさらに指定したシートが選択シートとして追加されます。
using System;
using System.Linq;
using NetOffice.ExcelApi;
namespace Art55.NetOfficeDemo20121111_001
{
class Program
{
static void Main()
{
var application = new Application {Visible = true};
Workbook workbook = application.Workbooks.Add();
workbook.Sheets.Add(Type.Missing, workbook.Worksheets.Last(), 3);
((Worksheet)workbook.Sheets["Sheet1"]).Select();
Console.ReadLine();
((Worksheet)workbook.Sheets["Sheet3"]).Select(false);
Console.ReadLine();
((Sheets)workbook.Sheets[new[] {"Sheet5", "Sheet6"}]).Select(false);
Console.ReadLine();
}
}
}
■Sheet1を選択
((Worksheet)workbook.Sheets["Sheet1"]).Select();
■追加でSheet3を選択
((Worksheet)workbook.Sheets["Sheet3"]).Select(false);
■追加でSheet4とSheet5を選択
((Sheets)workbook.Sheets[new[] {"Sheet5", "Sheet6"}]).Select(false);
Source and Project
Soruce and Project(追記分)
--------------------------------------
本投稿は、CodePlexで公開されているNetOfficeを利用しています。
NetOffice - MS Office in .NET
http://netoffice.codeplex.com/
NetOffice関連の記事は下記にまとめています。
【NetOffice】【Excel】NetOfficeのまとめ
http://pro.art55.jp/?eid=1304102
--------------------------------------