黙々とC#

"In a mad world of VBA, only the mad are sane" 『VBAという名の狂った世界で狂っているというのなら私の気は確かだ』

ワークブックの保存

本記事は、Excel C# Script入門講座の1記事です。

ワークブックの保存

ワークブックの保存には、WorkbookオブジェクトのSaveAsメソッドもしくはSaveメソッドを使用します。

SaveAsメソッドは「名前をつけて保存」に、Saveメソッドは「上書き保存」に対応します。

SaveAsメソッドは複数の引数をとり、保存ファイル名や、ファイル形式、パスワードなどを指定することができます。

SaveAsメソッドの構文

SaveAsメソッドの引数はかなり数が多いため、詳しくはMSDNを参照してください。

(Workbookオブジェクト).SaveAs(各種引数)

以下では、主要な引数のみ解説します。

SaveAsメソッドの引数

引数名 必須 / オプション 内容
Filename 省略可能 保存するファイルの名前を表す文字列を指定します。
FileFormat 省略可能 ファイル形式を指定します。定数は、XlFileFormat 列挙体から選択します。
Password 省略可能 読み取り時のパスワードを指定します。
WriteResPassword 省略可能 書き込み時のパスワードを指定します。
Filename引数について

完全パスを含めることもできます。

完全パスを含めない場合は、ファイルは現在のフォルダーに保存されます。

FileFormat引数について

XlFileFormat列挙体の定数を指定します。ExcelCSXでは、通常、定数をそのまま記載できないため、列挙体(enum)の値を指定してください。

なお、この列挙体は値が多いため、下表には代表的な値のみ示しています。詳しくは、MSDNを参照してください。

引数に指定する定数 enum値 概要
xlWorkbookDefault 51 規定のブック形式
xlWorkbookNormal -4143 ブックの標準形式
xlCSV 6 CSV形式
xlExcel9795 43 Excel95, 97のブック形式
xlHtml 44 HTML形式

なお、既存のファイルでは、指定された最後のファイル形式が既定のファイル形式となります。

また、新しいファイルでは、現在使用されている Excel のバージョンでのファイル形式が既定のファイル形式となります。

Password引数について

ファイルを保護するためのパスワードを表す 15 文字以内の文字列を指定します。大文字と小文字が区別されます。

WriteResPassword引数について

パスワードを設定して保存されたファイルを、パスワードを指定しないで開くと、ファイルは読み取り専用で開かれます。

サンプルコード

//アクティブなワークブックをtest.csvの名前で、CSV形式で保存します。
Excel.ActiveWorkbook.SaveAs(Filename:"test.csv",FileFormat:6);

ワークブックを閉じる

本記事は、Excel C# Script入門講座の1記事です。

ワークブックを閉じる

ワークブックを閉じるには、WorkbookオブジェクトのCloseメソッドを使用します。このメソッドは引数で、閉じる際に、ブックを保存して閉じるか否かを設定できます。

Closeメソッドの構文

(Workbookオブジェクト).Close(SaveChanges, Filename, RouteWorkbook)

Closeメソッドの引数

引数名 必須 / オプション 内容
SaveChanges 省略可能 ブックに変更がある場合に、変更を保存するかどうかを指定します。
Filename 省略可能 変更後のブックのファイル名を指定します。
RouteWorkbook 省略可能 次の回覧対象のユーザに、ブックを送信するか否かを指定します。
SaveChanges引数について

ブックに変更があり、開いている他のどのウィンドウにも表示されていない場合、この引数で、変更を保存するかどうかを指定します。

(ブックに変更がない場合、この引数は無視されます。ブックに変更があり、開いている他のウィンドウに表示されている場合、この引数は無視されます。)

true を指定すると、変更がブックに保存されます。

ブックにファイル名が付けられていない場合は、FileName がファイル名として使用されます。Filename を省略すると、ファイル名を指定するダイアログ ボックスがユーザーに表示されます。

RouteWorkbook引数について

この引数は、ブックを次の受信者に回覧する必要がある場合(回覧用紙があり、未回覧の人がいる場合)にのみ有効となります。

trueを指定すると、次の受信者にブックが送信されます。

falseを指定すると、ブックは送信されません。

引数を省略するとブックを送信するかどうか確認するダイアログボックスがユーザーに表示されます。

注意

このメソッドでブックを閉じるとき、ブックの Auto_Close マクロは実行されません。Auto_Close マクロを実行するには、RunAutoMacros メソッドを使用します。

サンプルコード

//アクティブなワークブックを閉じます。変更は保存しません。
Excel.ActiveWorkbook.Close(SaveChanges:false);

ExcelCSXの決まりごと

本記事は、Excel C# Script入門講座の1記事です。

ExcelCSXの決まりごと

ExcelCSXでC# Scriptを書くにあたっての、ExcelCSX特有の決まりごとなどをまとめています。

C# Scriptの基本的な書き方・仕様に関しては、Roslyn for Scripting C# に準拠しています。

ExcelCSXにおいては、より手軽にExcelアプリケーションをC# Scriptで操作できるように、いくつかの拡張を施しています。以下ではこれらの拡張について説明を行っています。

スクリプトの実行

C#スクリプトの実行は、VSTOアドインとは別プロセス(非同期)で行われる。

ただし、操作によっては、Excel本体のプロセスを一時的にロックする場合がある(条件不明)。

デフォルトの参照・using

System.Dynamic

のみ参照・using済み。

これにより、dynamic型はなんの設定もなしにデフォルトで利用可能。

その他のライブラリについては、一切読み込まないため、適宜 #r で参照を追加するととともに、using で名前空間を指定する必要あり。

ExcelCSXを実行中のExcelアプリケーションへのアクセス

ExcelCSXで実行するC# Scriptファイルにおいては、変数名 Excelで、ExcelCSXを実行中のExcelアプリケーション(プロセス)にアクセスすることが可能です。

変数ExcelExcel.Applicationオブジェクトです。なお、Applicationオブジェクト以下の各型を指定する煩わしさを省略するため、ExcelCSX上では、便宜上、dynamic型に変えています。

#loadによる別スクリプトのロードについて

ExcelCSXで実行するC# Scriptファイルにおいては、#loadディレクティブで、実行中のスクリプトファイル(*.csx)のあるディレクトリ下を検索します。

a.csx, b.csxが同一フォルダに存在する場合、a.csxからは以下のように、ファイル名のみの記載でb.csxを読み込むことが可能です。

#load "b.csx"

var x = 20;

ワークブックを開く

本記事は、Excel C# Script入門講座の1記事です。

ワークブックを開く

既存のワークブックを開くには、WorkbooksオブジェクトのOpenメソッドを使用します。引数によって、新しいブックの作成方法を指定することが出来ます。

Openメソッドの構文

(Workbooksオブジェクト).Open(各種引数)

このメソッドに関しては、引数が15個ほどあるため、詳しくはMSDNを参照して欲しい。

Openメソッドの主な引数

引数名 必須 / オプション 内容
FileName 省略可能
ReadOnly 省略可能
Format 省略可能
Password 省略可能
WriteResPassword 省略可能

サンプルコード

//ワークブック"c:\test.xls"を開く
Excel.Workbooks.Open(Filename:"c:\\test.xls");

ワークブックの作成

本記事は、Excel C# Script入門講座の1記事です。

ワークブックの作成

ワークブックの作成には、WorkbooksオブジェクトのAddメソッドを使用します。引数によって、新しいブックの作成方法を指定することが出来ます。なお、ワークブックを作成すると、作成されたワークブックがアクティブになります。

Workbooksオブジェクトは、一のApplicationオブジェクトが開いているWorkbookオブジェクト全てを返すコレクションクラスです。Applicationオブジェクトが、オブジェクト名と同名のWorkbooksプロパティとして備えており、読み出しのみ可能なオブジェクトです。

通常、(Applicationオブジェクト).Workbooksの形式で利用することが可能です。

Addメソッドの構文

(Workbooksオブジェクト).Add(Template)

Addメソッドの引数

引数名 必須 / オプション 内容
Template 省略可能 既存の Excel ファイルの名前を表す文字列、もしくは定数を指定します。
ファイル名を指定した場合

既存の Excel ファイルの名前を表す文字列を指定すると、そのファイルをテンプレートとして新しいブックが作成されます。

指定可能な定数

XlWBATemplate クラスの定数 xlWBATChart、xlWBATExcel4IntlMacroSheet、xlWBATExcel4MacroSheet、xlWBATWorksheet のいずれかです。各定数の意味は以下のとおり。ExcelCSXにおいては、定数はそのままの記載では呼び出せないため、かわりに対応する数値(各列挙体に割り当てられた数値)を指定して下さい。

名前 説明
xlWBATChart -4109 グラフ
xlWBATExcel4IntlMacroSheet 4 Excel バージョン 4 のマクロ
xlWBATExcel4MacroSheet 3 Excel バージョン 4 のインターナショナル マクロ
xlWBATWorksheet -4167 ワークシート
引数を省略した場合

引数を省略すると、いくつかの空白シートから構成される新しいブックが作成されます。作成される空白シートの数は、ApplicationオブジェクトのSheetsInNewWorkbook プロパティで設定されます。

サンプルコード

//ワークブックを新規に作成する。
Excel.Workbooks.Add();

ダイアログ

本記事は、Excel C# Script入門講座の1記事です。

ダイアログ

ユーザーになんらかの情報を提示したい場合や、ユーザーからのフィードバックを得たい場合には、ダイアログを表示するという選択肢があります。

MessageBox

WPFのMessageBoxを呼び出す場合、コードの実行にあたっては #rで PresentationFrameworkアセンブリ(PresentationFramework.dll)を読み込む必要があります。

#r "PresentationFramework"
using System;
using System.Windows;
 
var result = MessageBox.Show(
    "Do you like C#?", 
    "test dialog", 
    MessageBoxButton.YesNo, 
    MessageBoxImage.Question
    );
 
if (result == MessageBoxResult.Yes)
{
    //case YES
}
else
{
    //case NO
}

InputBoxダイアログ

Microsoft.VisualBasicのInputBoxを使えば、ユーザーからの文字入力を受け取ることも可能です。

#r "Microsoft.VisualBasic"
using System;
using Microsoft.VisualBasic;
 
var input = Interaction.InputBox("What's your name?");

ワークシートの削除

本記事は、Excel C# Script入門講座の1記事です。

ワークシートの削除

ワークシートの削除には、WorksheetオブジェクトのDeleteメソッドを使用します。

Deleteメソッドの戻り値

このメソッドは、bool値が返されます。

Deleteメソッドを実行した際に表示される確認用ダイアログ ボックスで、

  • ユーザーが [削除] をクリックした場合は true が返され、
  • ユーザーが [キャンセル] をクリックした場合は false が返されます。
注意

このメソッドは、デフォルトでは、即座にワークシートを削除するのではなく、削除の確認を求めるダイアログ ボックスを表示します。 ユーザーが[削除]を選択した場合にのみ、実際にワークシートが削除されます。

Deleteメソッドで即座にワークシートを削除したい場合には、下記サンプルコードに示すように、ApplicationオブジェクトのDisplayAlerts プロパティをfalseにすることで、ダイアログボックスの表示を回避することができます。

サンプルコード

//現在アクティブなシートを削除する
Excel.DisplayAlerts = false;
Excel.ActiveWorkbook.ActiveSheet.Delete();
Excel.DisplayAlerts = true;
//※ DisplayAlertsの設定は、スクリプト実行後のユーザー操作時にまで
//   影響が及ぶので必要なときだけfalseに設定し、デフォルト動作に戻している
//Sheet1を削除する。ユーザの選択に応じて処理を分ける場合
var sheet1 = Excel.Worksheets("Sheet1");
if(sheet1.Delete())
{
    //削除した場合の処理
}
else
{
    //削除しなかった場合の処理
}