COMマクロのオブジェクト引数の取り扱いにNo.07010
おすぎ さん 12/06/08 15:51
 
いつも大変お世話になっております。

WORD VBA 絡みで、またまた教えて下さい。

COMマクロを使って、WORD文書中にコメントを挿入しようと試みています。
VBAではこんな感じ。

Selection.Comments.Add Range:=Selection.Range, Text:=MyText

ここで Range は、挿入位置を表すRange オブジェクトです。

このように 引数がオブジェクトの場合、
COM マクロでは、どのように対応したら良いのでしょうか?


場違いな質問だったらスミマセン。
よろしくお願いします。

[ ]
RE:07010 COMマクロのオブジェクト引数のNo.07011
秀丸担当 さん 12/06/08 16:18
 

>このように 引数がオブジェクトの場合、
>COM マクロでは、どのように対応したら良いのでしょうか?

プロパティの場合はsetpropobjがありますが、メソッドの場合は無いです。
これはvbs/jsではできるけど秀丸マクロではできない、秀丸マクロの欠点になっ
てしまっています。すみません。

文法上、メソッドに渡すパラメータが数値がオブジェクトなのか数値なのかを判
別する方法が無く、現状の文のままだとできないです。
今後の課題として何らからの方法が必要だと思います。

[ ]
RE:07010 COMマクロのオブジェクト引数のNo.07012
h-tom さん 12/06/08 16:30
 

h-tom です。

>このように 引数がオブジェクトの場合、
>COM マクロでは、どのように対応したら良いのでしょうか?
最近のバージョンでは確認していませんが、プロパティ以外では、引数にオブジェクト
を指定できませんよ。
要望は出しましたが、対応はまだだったようなきがします。
http://hidemaruo.dip.jp:81/turukame/turukame_3/x1005517.html

[ ]
RE:07012 COMマクロのオブジェクト引数のNo.07015
おすぎ さん 12/06/08 17:21
 
秀丸担当さま
h-tom さま

ご回答ありがとうございます。

基本的に無理ですか。

秀丸からワードを好きに操作できると思っていましたが、
そう簡単ではないようで残念です。

いつの日か対応していただける日を心待ちにしています。

[ ]
RE:07015 COMマクロのオブジェクト引数のNo.07017
おすぎ さん 12/06/08 22:50
 
秀丸担当さま

ド素人な質問をさせて下さい。

秀丸マクロからWSHを起動してVBAを呼出し、
下のようなコードを実行させるっていうのは、変でしょうか?

Selection.Comments.Add Range:=Selection.Range, Text:=MyTex

[ ]
RE:07017 COMマクロのオブジェクト引数のNo.07030
秀丸担当 さん 12/06/11 09:27
 

>秀丸マクロからWSHを起動してVBAを呼出し、
>下のようなコードを実行させるっていうのは、変でしょうか?
>
>Selection.Comments.Add Range:=Selection.Range, Text:=MyTex

多くの場合はできないケースのほうが多いと思いますが、ワードの場合は
GetObjectで対象docファイルのオブジェクトを取得して秀丸マクロと同時に操作
できるようです。
これを利用するとできるようです。
VBAではなく、WSHを介して外部のJSを実行する形ですが、以下のようにしてでき
ました。

●秀丸マクロ

  #objWordApp=createobject("Word.Application");
  setpropnum #objWordApp,"Visible",-1;
  #objDocuments = member(#objWordApp, "Documents" );
  callmethod #objDocuments, "Open", "c:\\folder\\test.doc";
  #objSelection = member(#objWordApp, "Selection" );
  callmethod #objSelection, "WholeStory"; //全選択
  //★js経由で実行
  //objSelection.Comments.Add( objSelection.Range, 文字列 );
  $file = "c:\\folder\\test.docx";
  $text = "コメント";
  runsync2 "wscript.exe test.js "
       + "\"" + $file + "\" "
       + "\"" + $text + "\"";
  //★js経由で実行 ここまで

●test.js の内容
  objWord = GetObject( WScript.arguments(0) ); //$file相当
  objWordApp = objWord.Application;
  objSelection = objWordApp.Selection;
  objSelection.Comments.Add( objSelection.Range,
                       WScript.arguments(1) ); //$text相当


コマンドラインに対象ファイルと文字列を渡して、JS側でも同時にオブジェクト
を取得して操作してみたらできました。
ワードはうまくできていて可能でしたが、奇抜な方法で普通では無理があると思
います。


前にh-tomさんの話があったとき、メソッドのパラメータをオブジェクトで試行
してやる方法も1つ検討していて、手元のバージョンでは可能でした。
ただ仕様が固まらず保留にしていました。
従来の文法になるべく影響を与えない方法を思いついきましたが、新しい文(例
えば allowobjparam; といった感じ)を事前に実行しておくとオブジェクトのパ
ラメータも試行するといった方式にすると、簡単に可能ではあります。
そういう方向で検討してみます。

[ ]
RE:07030 COMマクロのオブジェクト引数のNo.07032
秀丸担当 さん 12/06/11 10:22
 

>  $file = "c:\\folder\\test.docx";

すみません。また拡張子を間違えてしまいました。
前からサンプルとして取り上げているファイルの場合は、
ここは.docxではなく.docでした。

[ ]
RE:07032 COMマクロのオブジェクト引数のNo.07035
おすぎ さん 12/06/11 14:29
 
秀丸担当さま

ご回答していただいただけでなく、
秀丸マクロ、スクリプトのコードまで作っていただきました。
本当にありがとうございました。

御礼の言いようもありません。

でも、1つだけ教えて下さい。
スクリプト「test.js」は、
Selection オブジェクトの代わりに、
Range オブジェクトを使っても可能なのでしょうか?

[ ]
RE:07035 COMマクロのオブジェクト引数のNo.07036
秀丸担当 さん 12/06/11 16:24
 

>スクリプト「test.js」は、
>Selection オブジェクトの代わりに、
>Range オブジェクトを使っても可能なのでしょうか?

秀丸マクロ上で取得したオブジェクトをそのままそっくり test.js に受け渡し
たいということだとしたら、オブジェクトの受け渡しは不可能です。

今回たまたまワードのオブジェクトをファイル名を通じてGetObjectで受け渡し
できて、コメントは文字列で受け渡しできました。

Rangeオブジェクトも文字列化して受け渡しできれば、一応可能だと思います。
ワードのオブジェクトについて詳しくないのでRangeオブジェクトの扱いがどう
いうものか、すみませんがわからないです。
開始点と終了点さえ文字列で受け渡しできればいいということであれば以下のよ
うな感じでもできそうです。

マクロ側
  runsync2 "wscript.exe test.js"
       + " \"" + $file + "\""
       + " \"" + $text + "\""
       + " \"" + getpropnum(#objmyRange,"Start") + "\""
       + " \"" + getpropnum(#objmyRange,"End") + "\""
       ;

js側
  objMyRange = objWordApp.Selection.Range;
  objMyRange.Start = WScript.arguments(2);
  objMyRange.End = WScript.arguments(3);


jsを経由させるのは奇抜な方法なので、本来であれば秀丸マクロでオブジェクト
呼び出しできるようになるべきだと思います。

[ ]
RE:07036 COMマクロのオブジェクト引数のNo.07037
おすぎ さん 12/06/11 18:35
 
秀丸担当さま

お忙しい中、ご回答いただきまして、ありがとうございました。
今度試してみようと思います。

今回も大変助かりました。

重ねて、ありがとうございました。

[ ]
RE:07037 COMマクロのオブジェクト引数のNo.07043
秀丸担当 さん 12/06/13 12:15
 

V8.20β23で、allowobjparamという文を追加して、オブジェクトのパラメータも
指定(というか試行を許可)できるようにしました。
以下のページの「次のバージョンのβ版はこちら」からダウンロードできます。
http://hide.maruo.co.jp/software/hidemaru.html

jsでいうところの、

  objSelection.Comments.Add( objSelection.Range, MyText );

という操作を以下のような感じで書けます。

  #objRange = getpropobj( #objSelection, "Range" );
  #comments = getpropobj( #objSelection, "Comments" );
  allowobjparam 1;
  allmethod #comments, "Add", #objRange, $MyText;
  allowobjparam 0;

[ ]
RE:07043 COMマクロのオブジェクト引数のNo.07044
おすぎ さん 12/06/13 13:26
 
秀丸担当さま

お忙しい中、すばやい対応をありがとうございます。
試してみます。

[ ]