エラーを解決してやった!(プログラミング)

今日は本業のプログラマらしいことを書いてみようと思います。
あるお客さんに頼まれたソフトでEXCELシートを開いて文字を書き込む機能の部分が、自分のPCでは問題なく動くのだが、お客さんに収めるPCでは動かない。こんなエラーが出て落ちてしまいます。

型Microsoft.Office.Interop.Excel.ApplicationClassのCOMオブジェクトをインターフェース型Microsoft.Office.Interop.Excel._Applicationにキャストできません。IID'{00020813-0000-0000-C000-000000000046}'が指定されたインターフェースのト上での
ライブラリは登録されていません。…

と長いメッセージ。早速Google検索してみると、「EXCELの複数のバージョンをインストールしたことがあり残骸が残っている。レジストリを削除すると直る」といった回答ばかり。そんなはずはない。買ったばかりのPCでプレインストールのEXCEL2016があるだけ。2時間かけても解決せず。

見方を変えてC#からEXCELを使う方法をいろいろ検索してみると、皆さんもEXCELのバージョン違いで悩んでいることがわかった。どうやらこの問題は、自分のEXCELとお客さんのEXCELバージョンの違いによるものだと、技術者の勘がピーンときました。そこで、目に留まったのがこちらの天才プログラマさんのサイトです。
dynamicというキーワード初めて知りました。これは実行時バインディングという方法です。
これで解決かと思いきやどうしてもここでエラーとなってしまいます。

Type t = Type.GetTypeFromProgID("Excel.Application");

これの解決策は自分で見つけました。

Type t = Type.GetTypeFromProgID("Excel.Application.16");

と書いて、あとはdynamicを使った方法で、すべてうまく動きました。

ちなみにこちらのサイトも参考になりますが、上と同じところでエラーとなります。

結局EXCELのバージョンに依存してしまいます。最終的にはこの文字Excel.Application.16を設定ファイルに書いておき、そこから読み込む方法を使いました。

バージョンに依存しない方法としては、Excel.Applicationでエラーが出たら、Excel.Application.10,11,12,13,14,16と1ずつ増やしていってエラーが出なかったオブジェクトを採用するようにしたらうまく行くかもれませが、そこまではやりません。

自営業たるもの、コストの点からも考えないといけません。

Excel.Applicationの後の数字の見つけ方は、レジストリエディタで00020813を検索して赤丸の所を見てください。

ExcelVersion.JPG


世の中には、数十万円にも値する素晴らしい情報を無償で教えてくださる方がたくさんおられます。私も何度か助けられました。その恩返しに私も時々書いていきたいと思います。