先日、やっとこさ newQX のマクロが起動しました…と、言いますか、なんか拡張子を vbs にしてもマクロが起動しなかったんですよね。
な感じで「マクロファイルを編集していないため実行できません」ってエラーがでるのです。サンプルマクロを動かしても駄目という現象。
で、結果的には「その他」→「書式設定」の「テキスト/キーワード」のところで、テキスト種別が「マクロ」になっていないと、マクロが動かないという…別の書式設定をコピーしたものだから、ここが上書きになってしまっていたのですね。
そんな訳で、めでたくマクロが動きました。
な、だけでは詰まらないので、早速 QX32 に似た環境を作ろうと画策しております。
まずは、編集中のフルパスをクリップボードにコピーしたい、からスタート、ってことなんですが、いきなり躓いてしまいました。QX32 のマクロでは clipboard$ という関数(プロパティ?)があったのですが、newQX だと vbscript ベースになっているので、このあたりの実装がないッ!!! 困った。
wscript/WSH で使う場合にもクリップボードは難問がありまして、IE を使ったり Excel を使ったりするのですが、一番手っ取り早いのがクリップボード用の COM を作ってしまうことです。
レジストリへの登録は必要なのですが、一度、登録してしまえば他にも再利用できるし、というわけで C# で作りました。
C# で COM コンポーネントを公開する – てっく煮ブログ
http://d.hatena.ne.jp/nitoyon/20080731/c_sharp_com
上記を参照しながら C# でクラスを作る、そして登録。登録する場合は regasm なんですね。このあたりは、人に渡す時にちょっと問題があります(管理者権限で動かさないといけないという)。
ひとまず、C# のコードはこんな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | namespace QxNet { public class Clipboard { /// <summary> /// クリップボードをテキスト形式で取得/保存 /// </summary> public string Text { get { return System.Windows.Forms.Clipboard.GetText(); } set { System.Windows.Forms.Clipboard.SetText( value ); } } public void SetText( string text) { this .Text = text; } public string GetText() { return this .Text; } } } |
ProgId などの属性を付けていませんが、まあ、これでも大丈夫。
登録する場合は、管理モードでコマンドプロンプトを起動して
1 | regasm QxNet.dll |
のように登録します。
そして newQX のマクロは以下な感じで。
1 2 3 4 5 | '現在のフルパスをクリップボードへ保存 sub FilenameToClip set clip = createobject( "QxNet.Clipboard" ) clip.setText(ActiveDocument.fullname) end sub |
CliateObject してからクリップボードにフルパスをコピーします。
こうすると先のコマンドラインへのファイル名渡しが楽なんですよね。
名前は「QxNet」にしてあるので、他にも QX を拡張するような .NET ライブラリを作っていこうかなと。
実行ファイルなんかは、後日公開します。