みなさんいかがお過ごしでしょうか、MSPマーケティング職のがりっち( @garicchi )です。 皆さんはExcelを触っているとき、こんなことを思ったことはありませんか?

 

  Excelの関数調べるのめんどくさい… C#が使えたらいいのに…  

 

Excelの関数(SUM(B3,BC5)とか)に詳しい人なら思わないかもしれませんが、プログラマーがExcelを触るとこのように思ったことがある人はいると思います。

実際にExcel内の関数でif分岐はできますが、1行で書かなければいけなかったり、いろんな条件式が積み重なるとカオスな状態になってしまいます。

1

カオスな条件式の例  

 

プログラムを経験されている方ならば、「C#っぽい構文で書ければ条件式も見やすくなるのに…」と一度は思ったことがあるはずです。

 

2

C#ならば複雑な条件式も(比較的)見やすい  

 

ああ…Excel内にC#のコードを埋め込めればいいのに…

私はそう思ったのでC#のスクリプトを組み込めるようにExcelを拡張してみました。

Roslynとは

さて、今回作成したいのはExcelのセル内にC#のコードを書くことによってセルを操作することができるというものです。

3

なのでExcelにC#のコンパイル機能(コードを解釈して実行可能にすること)を持たせなければいけません。

1からC#のコンパイラを自作するのは非常に手間がかかりますが、MicrosoftはC#のコンパイラーをRoslynという名前でオープンソースで提供しています。

 

Roslynについての解説はMSPの五十嵐君( @bonprosoft )が執筆した以下の記事を参考にしてください。

Visual Studio 2015の新機能“Roslyn”とは – Build Insider

 

Roslynの中には、すでにコンパイルされたアプリケーションの中に、C#のコードをスクリプトとして組み込むような機能を提供するRoslyn for Scripting というものがあります。

今回はそれを利用してExcelにC#のスクリプト機能をつけましょう。

Excel アドイン

さて、ExcelにRoslynの機能を組み込むためには、Excelを機能拡張できるようにしなければいけません。

Microsoft OfficeではVSTOというアドイン(拡張機能)を作る機能が備わっています。

今回はVSTOというアドインの中でRoslyn for Scriptingを実行することによってExcelをC#のコードから操作できるようにすることとしました。

実際に作ってみた

実際に作成したものがこちらになります。

standard


B3セルに書いてある「Hello」という文字を読み取り、World!という文字列を付け加え、C3セルに書き込むというスクリプトをExcelに組み込み、「Run」ボタンを押すことによってスクリプトを実行しています。  

C#のコード内に

と書くことによってB2セルの値を取得し、

と書くことによってC2セルに値を書き込んでいます。

 

Excelのセル内にプログラムを書きこむのがめんどくさい?安心してください。

今回Excelの各セルに1行ずつC#のプログラムを書いても実行できるようにしました。

1行ずつプログラムを書いていけるのでAlt+Enterする必要もないですし、セル単位でプログラムを管理できるので(もしかしたら)便利かもしれません。

また、セルの指定はC#のstringでの指定となるので”B”+indexのように複数セルを一気に書き換えるなんてこともできます。

実際に1行ずつプログラムを書いて、一気にセルを編集するとこんなこともできます。

scripting

配布

アドインはExcelアドインとして配布しています。(Excel2016で動作確認)

ほしい方は下記リンクからダウンロードして、zipを解凍、中にあるCSharpForExcel.vstoをダブルクリックで実行してください。

Download

 

ちなみにC#のスクリプトはコメント機能も一応つけれますが一行コメント「//」はバグにより(直す予定は未定)動作しませんので複数行コメント「/**/」でコメントしてください。

また、ソースコードもMITライセンスで公開しているのでプルリクをお待ちしています。

https://github.com/mspjp/CSharpForExcel

最後に

もうお気づきかとは思いますがこのアドインはネタなので活用用途が全く思いつきません。

面白い活用方法を思いついた方はぜひ@_mspjpまで教えていただけると助かります。

 

Roslyn for Scriptingの登場によって自分のアプリケーションにC#スクリプトを簡単に組み込めるようになりました。

今回の例のようにExcelにすらC#のスクリプトを組み込んで、よりユーザーが拡張しやすいアプリを作れるようになったのでぜひVisualStudio Communityをインストールして、Roslyn for Scriptingを体験してみてください。(ソースコードは上記GitHub URLを参考にしてください)

vs

 

 

 

ちょっとだけ技術解説

以降はプログラマで興味のある方だけ見ていただければと思います。

どうやってExcelのセルをC#のスクリプトで操作しているのかですが、ExcelのVSTOという拡張機能はExcelに.Netプラットフォームのプログラムを組み込むことができるというものです。

Roslynは.Netプラットフォームの上で動作するのでExcelの拡張としてRoslynを動かせるというわけです。

Roslyn for ScriptingはNugetから「Microsoft.CodeAnalysis.Scripting」というパッケージをインストールすることで導入できます。(.Net4.6以上必須)

4

Excelアドインの開発の仕方としては、Office Developer ToolsをインストールしてVisual Studioからアドイン開発ができます。

Excelアドインでは、以下のようなコードで選択されているセルの内容を取得できます。

ただ、単一選択の時と複数選択の時では取得できる値の型が変わるので注意が必要です(dynamic型)

セルに書かれているスクリプトを取得できたら、Roslynを使用してスクリプトを実行します。

ポイントとしては、Parameterクラスを実行時に渡しているところですが、このParameterクラスはExcel内に書かれるC#のスクリプトとExcelアドインとの通信を行うためのクラスとなります。

実行時にクラスを渡すことによって、スクリプトからそのクラス内のメソッドを呼び出すことができるようになります。

通信用Parameterクラスの中身はこのようになっていますが、先ほどC#のスクリプトから呼び出していたReadCellメソッドとWriteCellメソッドが定義されています。

これでC#のスクリプトから関数を呼び出し、Excelのセルを参照したり書き込んだりができるわけですね。

Officeのアドイン開発も面白いのでぜひ挑戦してみてください!

 


筆者: garicchi | 2016年10月1日

follow us in feedly