広告

$m0t0k1x2["code"].content

プログラミングっぽい話を中心にします。
そうでないほうはm0t0k1.tumblr.comのほうで。
Recent Tweets @m0t0k1m0t0k1

タイトルそのままなのですが、本当にその通りです。

発端

はてなブログにevernoteをコマンドラインから使ったりするエントリーを書いてたのですが、OneNoteでもvbaやvbs、或いはPowerShellを駆使して簡単に操作できるかな?と思って調べてたわけです。

そうしたところ、どうも自分のはてなブログに書くべき内容なのかな?という気がしてきまして、ここにエントリーすることにしました。

OneNote.Application

VBAからはツールの参照設定からライブラリを選択してやることで、何事もなかったように利用することができます。

しかし、もっとカジュアルにしようとスクリプト環境から同じことをしようとするとタイプライブラリが登録されていないというエラーになります

Dim x As String
Set one = CreateObject("OneNote.Application")
one.GetHierarchy "", 2, x

上記のコードは「GetHierarchy」メソッドを呼び出す時点で初めてエラーになります。

ここで私は過去の経験からくる思い込みで、てっきりレジストリの問題だと誤認識してしまい、レジストリを調べてしまいました。

しかし、レジストリに問題はありません。 というのも、ExcelなどのアプリとOneNoteは根本的に仕組みが異なるからです。

OneNote2013はAPIから操作すべき

OneNote2013はかなり最近に開発されていることもあってか、vbsやPowerShellなどからCOM経由での操作を行わないように設計されているのではないかと思われます。

だから、そのものではなくタイプライブラリが公開されているのだと思います。

VBEditorでOneNoteを見てみると、不思議なパスが表示されていることに気づきます。

そう、「ONENOTE.EXE¥3」です。 もちろん、そんなものエクスプローラーなどから見ても見つかりません。

オブジェクト

VBEditorのメニューにある「ツール」から参照設定すると、どういうわけかVBAからは操作をすることができます。

一方、vbsではwsfファイルを経由すればタイプライブラリへの参照を得ることができるようになりますが、利用できるのは定数のみです。そして定数は公開されていません。PowerShellでGet-Memberしてやるとメソッドしか表示されません。

よって、CreateObjectなどによってCOMのオブジェクトモデルを直接参照できるようにはならないようなのです。

対処方法

ノートを新規に登録したりする操作のみを行うのであれば、OneNoteをコマンドラインから使うことで操作することができます。

しかし面倒なのがコマンドプロンプトからはパスが通っておらず、唯一便利そうなスイッチの「/paste」というクリップボードからペーストしてノートに貼り付けできるものも、現在のノートに貼り付けられるので便利なのかどうなのか用途によるなぁと。

しかし… もうここまできたらVBAやコマンドラインではなく、普通にOneNoteをアプリから使った方が便利なのではないかと思いました。