変更履歴付きのワードファイルを送信禁止No.44829
hidejii さん 13/08/21 16:59
 
変更履歴付きのワードファイルを送信禁止にしたいと思っています.

メール送信時に添付ファイルのチェックして,
添付ファイルがワードファイルだった場合,
ワードファイルに変更履歴が記録されているかをチェック
したいのですが,そのようなマクロはありますでしょうか.
自分で探してみたところ見つかりませんでした.

よろしくお願いします.

[ ]
RE:44829 変更履歴付きのワードファイルをNo.44830
秀まるお2 さん 13/08/21 17:37
 
 ワードファイルに変更履歴が付いてるかどうか、秀丸マクロで調べる手段があ
れば可能だと思います。

 今ちょっとgoogleで検索した限りでは、変更履歴が付いてるかどうかをワード
を使わずに調べる方法は見つからないようです。それが分からないとどうしよう
も無いです。

 例えばワードファイルのファイル形式に特別なルールがあって、ファイルの先
頭から何バイト目の情報を見ることで変更履歴の有無が分かるとか、そういう法
則みたいなのがあればなんとかなると思いますけども…。そういう情報はちょっ
と分かりません。(そもそもそんな単純な仕組みじゃないかもしれないし)

 もしかして誰か詳しい方がおられて教えてくれたりしたらいいのですが、今の
ところはちょっと無理そうな気がします。

[ ]
RE:44830 変更履歴付きのワードファイルをNo.44832
hidejii さん 13/08/22 09:50
 
ご回答ありがとうございました.

VBA(Outlook)では,メール送信時に添付ファイルのワードファイルを
開いてから .Revisions.Count 関数を使用すると,変更履歴の有無を
確認できました.秀丸メールのマクロでも同様なことができないかと
思い質問させていただきました.

[ ]
RE:44832 変更履歴付きのワードファイルをNo.44833
秀まるお2 さん 13/08/22 10:10
 
 WindowsのScript Host(wsh.exe)で出来るなら、秀丸マクロでも同様のこと
は出来ると思います。

 今ちょっと、の「Revisions.Count」で検索したら、Word上のマクロで処理さ
せる例は出てくるようです。

 それと、wsh上からWordファイルを扱う方法もあるようでした。

var word = WScript.CreateObject("Word.Application");
var doc = word.Documents.Open( doc_file_path );

 みたいにすれば扱えるような…。

 ちょっと僕の方でトライしてみます。

 (あるいは、誰かこの辺詳しい人いたら、wsh用のサンプルマクロだけでいい
ので教えて欲しいような…。wsh用のがあれば、それを秀丸マクロ用に書き換え
るのは僕の方で出来ると思うので)

[ ]
RE:44833 変更履歴付きのワードファイルをNo.44834
秀まるお2 さん 13/08/22 13:52
 
 Officeのインストールに手こずったのですが、一応マクロで出来たことは出来まし
た。

 マクロの内容は以下のようになります。それを「マクロ・マクロ登録...」の「自
動起動」ページの「あとで送信/今すぐ送信時」に登録しておくと、送信時に確認し
てくれます。

 ただし、このマクロを実行すると、実行する度にwinword.exeのゴミプロセスが1
つずつ増えていくような気がします。それは大丈夫なのかどうか、ちょっと分からな
いです。(Word2000でテストしたせいかもしれません)

 一回、マクロを何回も実行させてからタスクマネージャでwinword.exeがいっぱい
起動しないかどうかだけ確認してみて欲しいです。

---------マクロ内容---------------------------
    loaddll "tkinfo.dll";
    #attachcount = dllfunc("CountCurrentHeader", "X-Attach");
    if( #attachcount == 0 ) {
        endmacro;
    }
    #i = 0;
    #okdoc = 0;
    $message = "";
    while( #i < #attachcount ) {
        $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i );
        if( rightstr( $attach, 4 ) == ".doc"
         || rightstr( $attach, 5 ) == ".docx" ) {
            $path = dllfuncstr("HomeDir") + dllfuncstr("CurrentAccount") + "
\\" + $attach;
            #docobj = getobject($path);
            if( #docobj == 0 ) {
                message "Wordドキュメントのgetobjectに失敗しました。";
                endmacro;
            }
            #revobj = getpropobj(#docobj,"Revisions");
            if( #revobj == 0 ) {
                message "WordドキュメントからRevisionオブジェクトを取得する
のに失敗しました。";
                endmacro;
            }
            #count = getpropnum( #revobj, "Count");
            #appobj = getpropobj(#docobj,"Application");
            if( #appobj == 0 ) {
                message "WordドキュメントからApplicationオブジェクトを取得す
るのに失敗しました。";
                endmacro;
            }
            callmethod #docobj, "Close";
            callmethod #appobj, "Quit";
            releaseobject #revobj;
            releaseobject #appobj;
            releaseobject #docobj;
            if( #count != 0 ) {
                $message = $message + "\nファイル名 = " + midstr( $attach, s
trrstr( $attach, "\\" ) + 1 );
                $message = $message + "\n更新回数 = " + str(#count);
            } else {
                #okdoc = #okdoc + 1;
            }
        }
        #i = #i + 1;
    }
    if( $message != "" ) {
        $message = "更新履歴付きのWordドキュメントを送信しようとしています。
かまわずに続行しますか?"
                + "\n更新履歴付きファイル一覧:\n"
                + $message;
        #n = dllfunc("Bypass_MessageBox"
                , hidemaruhandle(0)
                , $message
                , "更新履歴の確認"
                , 0x30 + 3 + 0x100 );       //はい/いいえ/キャンセル, デフォ
ルトボタン=いいえ
        if( #n != 6 ) {
            #n = dllfunc("SetCancel", 1);
            endmacro;
        }
    } else {
        if( #okdoc != 0 ) {
            message str(#okdoc) + "個のWordファイルには更新履歴は付いてませ
んでした。";
        }
    }


[ ]
RE:44834 変更履歴付きのワードファイルをNo.44835
h-tom さん 13/08/22 23:38
 

h-tom です。

> ただし、このマクロを実行すると、実行する度にwinword.exeのゴミプロセスが1
>つずつ増えていくような気がします。それは大丈夫なのかどうか、ちょっと分からな
>いです。(Word2000でテストしたせいかもしれません)
Wordを起動するところだけ切り出して、動かしてみましたが、Word2007では、
プロセスが残ることはなかったです。

Virtual PC 上の、Windows2000 / Word2000だと、やはりプロセスが残ります。
Word2000の問題かな?

Wordオブジェクトをあらかじめ作成し、Openメソッドでファイルを開いて処理
すれば、Word2000でも、プロセスが残りませんでした。

//マクロの例 ここから
$file1 = "C:\\TEMP\\履歴あり.doc";
$file2 = "C:\\TEMP\\履歴なし.doc";

#objWord     = createobject("Word.Application");
#objDocments = getpropobj(#objWord, "Documents");

call GetRevisionCount $file1;
#cnt1 = ##return;
call GetRevisionCount $file2;
#cnt2 = ##return;

callmethod #objWord, "Quit";
releaseobject #objDocments;
releaseobject #objWord;

message "履歴あり:" + str(#cnt1) + "\n" +
        "履歴なし:" + str(#cnt2);

endmacro;

//指定されたWordファイルから、履歴の数を取得する
GetRevisionCount:
        ##objDoc       = callmethod_returnobj(#objDocments, "Open",$$1);
        ##objRevisions = getpropobj(##objDoc, "Revisions");
        ##cnt          = getpropnum(##objRevisions, "Count");
        callmethod ##objDoc, "Close";
        releaseobject ##objDoc;
return ##cnt;

//マクロの例 ここまで

[ ]
RE:44835 変更履歴付きのワードファイルをNo.44836
秀まるお2 さん 13/08/23 14:02
 
 h-tomさんマクロどうもです。

 プロセスを残さないように出来るということで…。

 hidejiiさんからご要望があれば、Word2000でもプロセスが残らないように僕
のマクロを直してもいいです。とりあえず要望が無さそう(Word2007以上をご利
用)でしたらこの前のマクロのままでもOKのはずなので、それで試してみて欲
しいです。

[ ]
RE:44836 変更履歴付きのワードファイルをNo.44838
hidejii さん 13/08/23 18:14
 
秀まるお2さん,h-tomさん
ご回答有難うございます.

私の要望に100%答えて頂きありがとうございます.
Word2000は,実はまだ一部使用していまして,
マクロを直していただけると本当に助かります.

お手数ですが,よろしくお願いいたします.

[ ]
RE:44838 変更履歴付きのワードファイルをNo.44843
秀まるお2 さん 13/08/24 20:38
 
 h-tomさん方式にマクロを直してみました。一応これでWord2000でwinword.exeのプ
ロセスが残らないことだけ確認しました。

---------------------------------------------------------
 loaddll "tkinfo.dll";
 #attachcount = dllfunc("CountCurrentHeader", "X-Attach");
 if( #attachcount == 0 ) {
  endmacro;
 }
 #i = 0;
 #okdoc = 0;
 $message = "";
 #objWord     = createobject("Word.Application");
 #objDocments = getpropobj(#objWord, "Documents");
 while( #i < #attachcount ) {
  $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i );
  if( rightstr( $attach, 4 ) == ".doc"
   || rightstr( $attach, 5 ) == ".docx" ) {
   $path = dllfuncstr("HomeDir") + dllfuncstr("CurrentAccount") + "\\" + $at
tach;

   #docobj = callmethod_returnobj(#objDocments, "Open",$path);
   if( #docobj == 0 ) {
    message "Wordドキュメントのgetobjectに失敗しました。";
    goto Exit;
   }
   #revobj = getpropobj(#docobj,"Revisions");
   if( #revobj == 0 ) {
    message "WordドキュメントからRevisionオブジェクトを取得するのに失敗しま
した。";
    goto Exit;
   }
   #count = getpropnum( #revobj, "Count");
   callmethod ##docobj, "Close";
   releaseobject #revobj;
   releaseobject #docobj;
   if( #count != 0 ) {
    $message = $message + "\nファイル名 = " + midstr( $attach, strrstr( $att
ach, "\\" ) + 1 );
    $message = $message + "\n更新回数 = " + str(#count);
   } else {
    #okdoc = #okdoc + 1;
   }
  }
  #i = #i + 1;
 }
 if( $message != "" ) {
  $message = "更新履歴付きのWordドキュメントを送信しようとしています。かまわ
ずに続行しますか?"
    + "\n更新履歴付きファイル一覧:\n"
    + $message;
  #n = dllfunc("Bypass_MessageBox"
    , hidemaruhandle(0)
    , $message
    , "更新履歴の確認"
    , 0x30 + 3 + 0x100 );  //はい/いいえ/キャンセル, デフォルトボタン=いいえ
  if( #n != 6 ) {
   #n = dllfunc("SetCancel", 1);
   goto Exit;
  }
 } else {
  if( #okdoc != 0 ) {
   message str(#okdoc) + "個のWordファイルには更新履歴は付いてませんでした。";
  }
 }

Exit:
 callmethod #objWord, "Quit";
 releaseobject #objDocments;
 releaseobject #objWord;

[ ]
RE:44843 変更履歴付きのワードファイルをNo.44848
hidejii さん 13/08/26 08:53
 
> h-tomさん方式にマクロを直してみました。一応これでWord2000でwinword.exeの
>プロセスが残らないことだけ確認しました。

秀まるお2さま
こちらでも確認させていただきました.
追加の対応までしていただきましてありがとうございました.
早速使わせていただいております.

[ ]