概要
IronRubyを使い、起動中のExcelのプロセスにアタッチする方法の紹介です。
起動中のExcelのシートに乱数を書き込むサンプルコードを掲載します。
前提
RubyとExcelのマクロについてある程度知っている方向け。
本記事のテーマはRubyやExcelマクロの文法やコーディング作法ではなく、Ruby(IronRuby)とExcelを連携させるときのテクニックです。
環境
Windows 8.1(64ビット)
IronRuby 1.1
Excel 2010
コード
コードは次の通りです。
# coding: utf-8
# 起動中のExcelのプロセスにアタッチする
begin
excel = System::Runtime::InteropServices::Marshal::GetActiveObject("Excel.Application")
rescue
abort "No Excel process."
end
# カーソルが当たっているセルに1~100の乱数を書き込む
excel.ActiveCell.Value = rand(100) + 1
実行方法
[1] Excelを起動します
[2] DOS窓を開き、excel_set_random.rb
を実行します
> "C:\Program Files (x86)\IronRuby 1.1\bin\ir.exe" excel_set_random.rb
[3] 実行するとA1のセルに1~100の乱数が入力されます(カーソルがA1のセルにあるため)
[4] excel_set_random.rb
を何回も実行してみてください。A1のセルの値が次々と変化するはずです
解説
GetActiveObject
起動中のExcelのプロセスにアタッチするにはGetActiveObjectを使います。
excel = System::Runtime::InteropServices::Marshal::GetActiveObject("Excel.Application")
起動中のExcelのプロセスがないと例外が発生しますので、サンプルコードではrescueを併用しています。
また、このようにするとWordのプロセスにアタッチすることもできます。
word = System::Runtime::InteropServices::Marshal::GetActiveObject("Word.Application")
何が嬉しいの?
この記事の手法は手作業でファイルを編集中に、一部の作業だけをスクリプトにやらせることができます。
手作業と複数のスクリプトを組み合わせることができます。
ほかに、Excelのファイルを自動的に開いて作業を実行し、最後にファイルを保存してExcelを終了してしまう手法があります。
この場合は全自動で動いてくれる代わりに柔軟性がなく、小回りが利きません。