kei0425tan’s blog

技術的なことを主に

Excel VSTO アドインでイベントが発生しなくなる件

ExcelVSTO アドインを作成中に、イベント(セルチェンジなど)が発生しなくなる現象が発生したため、その原因と対処について

VSTOとは?

Visual Studio Tools for Officeの略。Excelのアドインを作成することができる。

大きな違いは以下。

  • 従来のCOM参照で作成する場合、Excelのオブジェクトを作成すると、すべてReleaseComObjectを呼び出して解放しなければならない。(変数に代入しなくても.で参照したオブジェクトすべて)
  • VSTOを利用した場合、と内部で参照数を管理してくれるため、ReleaseComObjectは不要で.netのガベージコレクションに任せることができる。
現象

Worksheet.SelectionChangeイベントなど設定したものが不定期なタイミングで効かなくなる。



gistbd378ccd842de5e2cad9a6dbdaedc529

最初に、Sheet2のセルを選択するとA1セルに、選択したセルのアドレスが表示される。
その後、Sheet3のセルを選択しても、動作しない。

Sheet3のセルを先に選択するとSheet3では動作するが、Sheet2では動作しなくなる。

原因

イベントを登録した、worksheetオブジェクトが変数にバインドされていないため
21行目のGCを行うとイベントごと解放されてしまう。
そのため、イベントが発生しなくなる。

※サンプルは21行目に明示的にGCを行っているので不定にはならないが、一般的にGCはいつ発生するかわからないため、発生したりしなかったりするため、追跡が非常に困難。

.Netなどでは、一般的に動作が不定になる場合にはGCが原因の可能性が高いため、GC.Collectの強制実行を行うとよい。

対応

イベントを設定したインスタンスはクラス変数などに保存すること。


gistf345aca2065d68b9f6ceccfb6de4e1fd