2011年9月9日金曜日

Excel アドイン作成のための備忘2 - データはどこに保存する?

Excel アドインで、アドインの処理に関連したデータをどこに保存したら良いか、ちょっと悩んでしまった。
Access だとアドイン自体もデータベースなので、ふつうにアドイン自体に保存できる。じゃあ Excel はワークシートに保存すれば良いのか、と思ったのだけれど、いろいろな意味でちょっとハマった。
まず実装面で、こんな風に書いてテストしてみた。
Private Sub CustomCommand_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
MsgBox ThisWorkbook.Worksheets("Sheet1").[A1]
ThisWorkbook.Worksheets("Sheet1").[A1] = Now()
End Sub
ところが、これでは Excel を再起動しても値が残っていない。
Private Sub CustomCommand_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
MsgBox ThisWorkbook.Worksheets("Sheet1").[A1]
ThisWorkbook.Worksheets("Sheet1").[A1] = Now()
ThisWorkbook.Save  '<- 保存を忘れずに!
End Sub
これで値が残るようになった。
Access は特に何もしなくても、閉じる時にデータが自動保存されていたので、何となく同じ感覚でいたら大違いでした。

実装面はこれで良しとするとして。
設計面の問題。
Windows 7 では、アドインは以下に保存される (変更もできるけれど、混乱の元なので変更しないという前提)。
C:\Users\UserName\AppData\Roaming\Microsoft\AddIns
データをアドイン自体に持たせると、当然 Roaming 扱いになる。でも、そうすると端末依存のデータを保存しにくい。設計思想的には、端末依存のデータは Local ディレクトリの方に持たせるのが自然な気がする。
不幸なことに (?)、いま作成しているアドインは開いているブックのパスを保存する必要がありそうな感じがしている(例によって仕様がコロコロ変わるので、最終的にどうなるか不明なのだけれど)。そんなパス情報は、Roaming に保存しても、端末が変わったら、おそらく意味が無い。
じゃあデータだけ Local ディレクトリに保存すればよいのか。
でもアドインとデータを別管理するのは、単純に面倒くさい。アンインストール時にデータ ファイルも削除するかどうかユーザーに確認するような処理入れなきゃいけないし。
レジストリは、もちろん光速で却下。

こういうときはこうするといいよ、みたいな指標って、Excel パワーユーザーさん界隈で合意がされてるんだろうか。
自分はとりあえず、愚痴をたれながら Local ディレクトリに MDB 置こうかと思っているけれど。

1 件のコメント:

  1. 実体験がない者のコメントで申し訳ないのですけど、

    > Local ディレクトリに MDB 置こうかと思っている

    賛成(・∀・)

    返信削除