割と残念な人が行く

人生もはやどうしようもなし、というほどダメではないが、間違いなく駄目である。

Windowsで既存EXCEL資源を操作するならVBAが安牌

 この間、既存のExcel資源を操作するツールを作ってほしいと急遽頼まれた。自社内ではなく、お客さんが使用するもので、注文書まで貰っているとのこと・・・。納期まで営業日は数日。正直、うっ・・・と思ったのは言うまでもない。経験のある人はご理解いただけるかもしれないが、作成済みのExcelを操作するのは非常に骨が折れるのである。色々調査・試行した結果。結局は古き良きVBAが最適であると判断した。今回はそこに至った知見を簡単にまとめておきたいと思う。

OSSによる作成済Excel操作はやめておけ

 Excelを新規で作成して書き込むのはあまり難しくないオープンソースを用いれば、世の中に出回る様々な言語で簡単に実装できてしまう。しかし、面倒なのは既存Excel資源に対しての操作である。単に書類のフォーマットに利用しているとか、簡単な計算式が入っているとかであれば、そんなに問題はない。しかし複雑なグラフを描いていたり、各種Excelの機能をふんだんに駆使していたりすると、途端に問題が発生する。

そもそもExcelが開けないとか、プログラムで弄ったExcelが壊れたりだとか・・・さらにはファイルの種類(xls, xlsx, xlsm)によって出来たり出来なかったり・・・あらゆる問題のオンパレードである。しかも大抵は原因が突き止められない。そういう問題が起きるものだから、仮にテストで上手く動いたとしても、お客さんに納品できる勇気はない。作成済みExcel操作は精神的にもリソースを食うのである。

VBAは書きたくない

 それなら仕方がない。MS標準でモジュールの出回っているものを使って作成しよう、と考えが改まるわけである。真っ先に思いつくのはVBAだろう。なんせExcelに付随している開発環境であり、最も安心感がある。しかし、あなたが腐っても(おっと失礼)ITエンジニアであるならば、おそらくVBAなんて死んでも書きたくないと思うに違いない。古臭い文法に固定された開発環境、そもそもVB系なんて触りたくもない等々、あらゆる罵詈雑言を発したくなる気持ちは分かる。

無論、僕だってそうである。じゃあ他の方法でやろう。そうだ、せめて.NETで!そう思って着手し始めるわけであるが・・・。

.NETでのExcel操作はNPOIが最適らしい

 .NETで書こうと決意して色々調べてみると、Excelを弄る方法としては大きく分けて2つの方法があることが分かった。1つはMicrosoft.Office.Interop.Excelという公式COMを利用するという手、もう1つはNPOIというオープンソースを用いるという手だ。今回はまずは後者を使う方法を考えた。

え?オープンソース使わないんじゃなかったの?と言われそうであるが、NPOIはJavaExcel操作をするためのPOIというライブラリを.NET用に移植したものであり、このPOIはJavaの世界で15年の実績があるシロモノだということで、「イケるっしょ!!!!」と思ったわけだ。

しかし案の定その道は一瞬で閉ざされることになる。お客さんから事前に貰っておいたテスト用ファイルで試してみると・・・あれ?開けない。どうやら貰った3種類のファイルの内、1枚だけが開けない。無論、この3種類以外のファイルもあるわけで・・・。もしかすると抜け道があるのかもしれないが、急遽頼まれて納期が数日後に迫った案件であったため、試行錯誤している時間は無く、敢え無く断念

残るはMicrosoft.Office.Interop.Excelを使うという道のみ。何故コイツを最初に使わなかったかというと、「悪名高かった」からだ。詳しくは以下の記事を参考にしていただきたい。 qiita.com

記事で語られているように、Comオブジェクトの解放漏れが起こる可能性、一々裏でExcel.exeを起動する必要がある故に動作が遅い・・・等々、出来れば使いたくなかったわけである。しかし背に腹は代えられぬ。これで行こうと思ったわけであるが・・・。

Excelバージョン毎にCOMのバージョンが異なる罠

 Microsoft.Office.Interop.Excelは、なんとExcelのバージョン毎にCOMのバージョンが異なるのである。詳しくは、公式の情報(リンク)を参考にしてほしい。ひとまずお客さんの環境について確認してみると、どうやらExcel2010. 2013, 2016が混在している環境とのこと。途端に雲行きが怪しくなってきた。

じゃあ互換性はどうなんだろうと調べてみると、公式の情報(リンク)が出てきた。これによると、概ね上位互換性があるということ。だがしかし、僕のPCのExcelバージョンは2013である。COMは基本的に開発環境に入っているExcelのバージョンに対応したものしか利用できない。僕が作れるのはExcel2013に対応したプログラムだけであるということだ。2016は動く可能性が高いが、2010についてはあまり保証できないということである。

厳密にいえば対策は取れるかもしれないが・・・時間がない。VBAで書くこう。結局そこに落ち着いたわけである。

安定のVBAさん

 結果から言うと、これで無事に解決した。Excelのバージョン毎にVBAにも違いがあるようだが、基本的な機能であればほぼ互換性があるという見方をして良さそうだ。しかしやはり不具合が出ることもあるようなので、以下のような記事を参考にするなどして、リスクを減らした方がよいだろう。

www.stdio.jp

VBAで事なきを得た後も、少々調べていた。やはり皆さん色々苦労されているようで、以下のような記事も見つかった。

qiita.com

この方はJscriptが最適解と踏んだようだ。JscriptによるExcel操作は調べると結構情報が出てくるので、これもアリかもしれない。ActiveXObjectというものに理解がないので詳しい所は分らないが、恐らくスクリプトが起動した時点で使用されるアセンブリが決定されるのだろうし、互換性なども気にする必要が無いだろう。

というわけで、既存Excel操作は非常に疲れるのである。できればこんな仕事請け負わない方がいいんじゃないかと思っている。もしどうしても作る必要に迫られたのなら、さっさとVBAで作成するのが安牌だろう。