複数のExcelのバージョンに対応する ~遅延バインディング②~

書き込み

ファイルを指定して読み込み、ワークブックの選択とシートの選択までは読み込みのと同じですが、セルを指定して書き込む部分が少し異なります。

ソースコード(書き込み)

次のような環境で実行しています。
・Visual Studio 2019
・Excel 2019

使用しているファイルは読み込みと同じファイルに、値の追記とシートを追加して値を書き込む動作をしています。

ヘッダへの追加は読み込みと同じなので省略します。

メインソースコード
※① 1シート目に値を2カ所書き込み
 ② 1シート目の後に”新しく追加したシート”という名称のシートを追加して、値を1カ所書き込み
 ③保存して終了

Type typProgID;
object oExcel;
object oWBooks;
object oWBook;
object oWSheets;
object oSheet;
object oRange;

string FilePath = @"C:\tmp\Excel遅延バインド.xlsx";  //読み込みたいファイルのパス

object[] Params;    //いろいろな場所で使うが、一時的なのでパラメータとして宣言しておく

//Excelを利用する
typProgID = Type.GetTypeFromProgID("Excel.Application");
oExcel = Activator.CreateInstance(typProgID);

oWBooks = oExcel.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, null, oExcel, null);

//ファイルパスを配列の頭に指定する。何故これだけの配列にするかは調べて下さい。
Params = new object[15] {FilePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                     Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                     Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing };

//ファイルを開いて、シートを開く準備
oWBook = oWBooks.GetType().InvokeMember("Open", BindingFlags.GetProperty, null, oWBooks, Params);
oWSheets = oWBook.GetType().InvokeMember("Worksheets", BindingFlags.GetProperty, null, oWBook, null);

//シートの番号を指定してシートを開いて、セルを読み込む準備 ※シート番号は0からではなく、1から
Params = new object[1] { 1 };   //1シート目を指定
oSheet = oWSheets.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, oWSheets, Params);

//
//ここまでは読み込みとほとんど同じです。
//

//セルを指定して、値を設定する ※セルの指定は読み取りの時とは異なり"R1C1"形式ではなく、"A1"といった形式で指定する
Params = new object[2];
Params[0] = "A4";
Params[1] = Missing.Value;

oRange = oSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, oSheet, Params);

Params = new object[1];
Params[0] = "1シート目のA4へ書き込み";
oRange.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, oRange, Params);

Marshal.ReleaseComObject(oRange);
oRange = null;


//R1C1形式でセルを指定して書き込む
//5列目、5行目を指定
int col = 5;
Params = new object[2];
Params[0] = Convert.ToChar(col + 64).ToString() + "5";  //ASIIコードから5列目の文字を算出する
Params[1] = Missing.Value;

oRange = oSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, oSheet, Params);

Params = new object[1];
Params[0] = "5列目、5行目への書き込み";
oRange.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, oRange, Params);

Marshal.ReleaseComObject(oRange);
oRange = null;


//現在操作しているシートの後に新たなシートを追加する
Params = new object[4];
Params[0] = Type.Missing;
Params[1] = oSheet;
Params[2] = 1;
Params[3] = Type.Missing;
oSheet = oWSheets.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, oWSheets, Params);

//追加した後でシート名を変更する
string SheetName = "新しく追加したシート";
Params = new object[1];
Params[0] = SheetName;
oSheet.GetType().InvokeMember("Name", BindingFlags.SetProperty, null, oSheet, Params);

//シートを変更
object Name;
int SheetNo = 0;
//各シートのシート名を比較して対象を探す
foreach (object sheet in (IEnumerable)oWSheets)
{
    SheetNo++;
    Name = sheet.GetType().InvokeMember("Name", BindingFlags.GetProperty, null, sheet, null);
    if (SheetName == Name.ToString())
    {
        break;
    }
}

Params = new object[1] { SheetNo };   //新しく追加したシートを選択する
oSheet = oWSheets.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, oWSheets, Params);


Params = new object[2];
Params[0] = "A2";
Params[1] = Missing.Value;

oRange = oSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, oSheet, Params);

Params = new object[1];
Params[0] = "新しく追加したシートのA2への書き込み";
oRange.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, oRange, Params);

Marshal.ReleaseComObject(oRange);
oRange = null;



//最終処理
Params = new object[1];
Params[0] = false;  //保存時に確認メッセージを出さない
oExcel.GetType().InvokeMember("Visible", BindingFlags.SetProperty, null, oExcel, Params);
oExcel.GetType().InvokeMember("DisplayAlerts", BindingFlags.SetProperty, null, oExcel, Params);
oExcel.GetType().InvokeMember("UserControl", BindingFlags.SetProperty, null, oExcel, Params);

//これを忘れると、プロセス上にいつまでもExcelのプロセスが残ります
Params = new object[2];
Params[0] = true;      //保存するかどうかを設定します。 true:保存、false:保存しない
Params[1] = FilePath;
oWBook.GetType().InvokeMember("Close", BindingFlags.InvokeMethod, null, oWBook, Params);      //WorkBookのClose
oWBooks.GetType().InvokeMember("Close", BindingFlags.InvokeMethod, null, oWBooks, null);    //WorkBooksのClose
oExcel.GetType().InvokeMember("Quit", BindingFlags.InvokeMethod, null, oExcel, null);       //Excel.ApplicationのClose

//使ったものを解放
Marshal.ReleaseComObject(oSheet);
oSheet = null;
Marshal.ReleaseComObject(oWSheets);
oWSheets = null;
Marshal.ReleaseComObject(oWBook);
oWBook = null;
Marshal.ReleaseComObject(oWBooks);
oWBooks = null;
Marshal.ReleaseComObject(oExcel);
oExcel = null;

GC.Collect();

※このソースコードはご自由にご利用していただいて問題ありませんが、各自の責任でお願いします。問題や不利益等が発生したとしても当サイトは関知しません。

結果

基本的な書き込みだけでしたら、これくらいで大体は事足りるかと思います。
その他、罫線や最大行、最大列については次に書きたいと思います。

< 読み込み編

その他の機能 >

 複数のExcelのバージョンに対応する ~遅延バインディング①~
 複数のExcelのバージョンに対応する ~遅延バインディング②~ このページ
 複数のExcelのバージョンに対応する ~遅延バインディング③~
 複数のExcelのバージョンに対応する ~遅延バインディングまとめ~

投稿日:2020年1月21日 更新日:

執筆者:

このサイトの管理者について

1980年代生まれ
石川県在住

メーカー2社経験後に退社

1年程度自由に在職中はできなかったことにチャレンジ

その後コロナの影響でなかなか仕事が見つかりませんでしたが、無事就職

現在はシステム会社に勤務中

PAGE TOP