Feed on
Posts
Comments

MVP for VSTOになりたいとか思うこのごろ(ならもっとちゃんとやれ

VSTO(Visual Studio Tools for Office)ではCOMアドインやVSTOアドインを用いた特殊なファイルを作ることができます。ですが実際はVSTOはVBAほど万能ではありません。それをいかに克服するか ということについてちょっと考えてみます

・VSTOとVBAの比較
そもそもVBAの上位互換がVSTOじゃないのとかそう思う方もいるかもしれないですけど(私が思ってただけかもですが)VSTOとVBAは正確にはターゲットが違います
形もリファレンスアセンブリも同じなのに何が違うんだって話ですけどVBAはアドインが作れなくてVSTOはファイルにアクセスがかなり困難です
(推測かなり含んでるのでここ違うとかありましたらぜひ)
VBAはどちらかというとファイルのための拡張という部分があると思います。VBAのコードは基本的に外部から参照ということでは使わず内部でのみ使用されます。簡単に言えば使い捨てという面があるわけです
VSTOはまったく逆でアプリケーションのための拡張という面があります。実際アドインしか作れません(拡張ファイルもファイルロード時にvstoアドインをロードします)
つまりxlsx系のプロパティのGetを行ったりしてファイルを操作するのがVBAでExcelなどのアプリケーション系の拡張を作成してメソッドの実行やプロパティのSetを行えるのがVSTOといえます

・VSTOとVBAの長所短所
もうちょっと深く考えてみます
VSTOがVBAと比較して優れている点としては
・.NETのアセンブリを利用してアプリケーションを作成できる(LINQ,Rx,etc…)
・言語としてVB.NET/C#を利用できる
・Visual Studioの環境を用いて作成することができる
逆に劣ってる点としては
・ファイルからデータを取得しづらい(COMオブジェクトとして扱われます)
・利用する環境に複数のアセンブリを必要とする(最低でも.NET Frameworkが必須)

ではVBAがVSTOより優れている点としては
・現在のExcelファイル内のデータにアクセスできる
・Excelさえ入っていれば実行可能である(セキュリティ面がうんぬんですが)
・Excelのバージョンはほとんど問わない上拡張子、フォーマットもほぼ問わない
逆としては
・言語にVisual Basicしか利用できない
・アドインを作成して全てのファイルに機能を提供するのが難しい?

などなどがあるわけです(主観)
VBAより新しいからなんとかってわけではないということですね

・VSTOからxlsxファイルへのアクセス手段
そろそろ本題
上記の通りVSTOはGetプロパティがほぼ使えない状態です。じゃあどうしたらいいかという話ですがVSTOのメリットに.NETアセンブリの利用可能があるはずです。これを使わない理由がありませんね

ではいくつか手段を考えてみましょう

・OLE DBによる接続
割とオッフィースらしい接続方法かもしれません。OLE DB(Object Linking and Embedding DataBase)によるxlsxファイルへの接続を行いファイルの情報をDataTableとして扱う手段です。OleDbAdapterを用いて接続するのですがこの時Accessのアセンブリが必要になってくるので注意
まともなクエリ構文が書けないとファイルサイズが大きくなったときにまったく使えなくなるので小さいファイルを扱うだけなら有効かもしれません。なんともいえないですけど

・LINQ to XMLを用いて直接読み込む
何かで見た気がする…? Office2007以降のファイル(~~~x,~~~m)はXMLファイルの集合体をZipファイルにして拡張子を変更しているため(xapと同じ)これを一度解凍してXElementなどを使って読み込む手段もあります
ただしこれをやるにはなぜか分かれているファイル構成に対応できなくてはいけません

・OOXMLを用いて読み込む
私的にはこれがよさげ。OOXML(Office Open XML) SDKを用いて読み込む手段です
先ほど書いた通りファイルはxmlで構成されています。このフォーマットはOpenXMLformatsを使用しているためこれにそった形で読み込めるのがこのOOXML SDKです。もともとはOfficeクライアントを作成するためのものですがファイルサイズが大きくてもちゃんと読み込めるためこれでよいんじゃないかと思います

まあそんなこんなでとりあえずOOXMLについて少しずつ調べて行こうかななどなどと

とりあえずこの辺で

Comments are closed.