【質問】秀丸メールのマクロで題名にあるyNo.00476
hum2 さん 10/05/31 18:41
 
 お世話になります。
秀丸メールはいつも便利に使わせていただいています。
少し前に、題名のSubjectを分解して加工し、SetHeaderするでは、
お世話になりました。

$subj = dllfuncstr("CurrentHeader", "Subject:");
//返却期限 2009/10/26 【TSUTAYA DISCAS】DVD/CD発送のお知らせ
をなんとか、
#n = dllfunc("SetHeader", "Subject", $subj );
//【TSUTAYA DISCAS】 2009/10/26 返却
にできました。ありがとうございました。

今回も似ているのですが、やりたいことは多少違います。
本文内ににyyyy/mm/ddがある場合には
replaceallfast "([0-9]{4})\\/([ 0-9]{1,2})\\/([ 0-9]{1,2})" , "\\1-\\2-\\3" ,
 regular;
で一括置換できたのですが、題名部分のyyyy/mm/dd形式は置換できずにいます。
マクロを自分で組み合わせたり修正できれば良いのでしょうが...
マクロに詳しい方には簡単な事だと思いますが、自分には難しくて、
■やりたいこと
【TSUTAYA DISCAS】 2009-12-29 返却
【TSUTAYA DISCAS】 2010/01/04 返却 という様な題名が複数ある。
1. メール一覧で選択したメールの題名を変更する。
2. 題名にあるyyyy/mm/ddを、yyyy-mm-ddと置換する。

//------------省略------------
$subj = dllfuncstr("CurrentHeader", "Subject:");  //【TSUTAYA DISCAS】 2010/
01/04 返却
$subm = midstr( $subj, 18, 12 );                  // 2010/01/04
//  2010/01/04 → 2010-01-04 (yyyy/mm/dd部分だけ → yyyy-mm-dd に置換したい)
//------------なんらかの処理------------


//------------なんらかの処理------------
#n = dllfunc("SetHeader", "Subject", $subj );     //【TSUTAYA DISCAS】 2010-
01-04 返却
//------------省略------------

などと思ってトライしているのですが、うまくいきません。
なんらかの処理に当たる部分は、具体的にどうなるのか?
ぜひ教えていただけませんか。

やりたいことで、説明不足があれば、指摘下さい。
よろしくお願いします。


置換前の題名
【TSUTAYA DISCAS】 2009/12/29 返却
【TSUTAYA DISCAS】 2009-12-29 返却
【TSUTAYA DISCAS】 2009/12/31 返却
【TSUTAYA DISCAS】 2010/01/04 返却
【TSUTAYA DISCAS】 2010-02-11 返却
【TSUTAYA DISCAS】 2010/02/15 返却

期待する題名
【TSUTAYA DISCAS】 2009-12-29 返却
【TSUTAYA DISCAS】 2009-12-29 返却
【TSUTAYA DISCAS】 2009-12-31 返却
【TSUTAYA DISCAS】 2010-01-04 返却
【TSUTAYA DISCAS】 2010-02-11 返却
【TSUTAYA DISCAS】 2010-02-15 返却
Windows XP Pro SP3
秀丸メール   Ver.5.39β4
秀丸エディタ Ver.8.01β6
2010/05/31(月)18:40:20

[ ]
RE:00476 【質問】秀丸メールのマクロで題No.00477
Iranoan さん 10/05/31 21:20
 
 hum2 さん今日は、Iranoan です。
> replaceallfast "([0-9]{4})\\/([ 0-9]{1,2})\\/([ 0-9]{1,2})" , "\\1-\\2-\\3" ,
>  regular;
 ここまでできていれば、あと少しですね。

・replaceup
・HmJre.dll の ReplaceRegular()
のどちらかを使えばよいと思います。

[ ]
RE:00477 【質問】秀丸メールのマクロで題No.00478
hum2 さん 10/06/01 04:01
 
Iranoan様
 お世話になります。
> ここまでできていれば、あと少しですね。
>
>・replaceup
>・HmJre.dll の ReplaceRegular()
>のどちらかを使えばよいと思います。

//------------なんらかの処理------------
  loaddll "hmjre.dll";
  $s = dllfuncstr( "ReplaceRegular", $s, $subm, 0, $s2 );  // 20yy-mm-ddを期待
//message "20yy-mm-ddを期待" +"\n"+ $s;
  freedll;
//------------なんらかの処理------------

大変有意義で貴重なアドバイス、ありがとうございました。
お陰さまで、現在
【TSUTAYA DISCAS】 2009/10/22 返却 の題名のメールに対して
【TSUTAYA DISCAS】 2009-10-22 返却 のように置換できました。

後学のためにお聞きしたいのですが、2009/と2010/の
ような時の指定は一度にはできないのでしょうか?
何か良い方法をご存じでしたらご教示願えますか?
  if( leftstr( $subj, 18 ) == "【TSUTAYA DISCAS】"
  && midstr( $subj, 18, 6) == " 2009/" ) {
//&& midstr( $subj, 18, 6) == " 2010/" ) {


//------------試行錯誤中マクロここから------------
//_1.mac
// 題名の日時形式を置換
// yyyy/mm/dd部分だけ → yyyy-mm-dd に置換したい
// yyyy/mm/dd以外は置換後に戻す
//------------------------------------------------------------------
    setcompatiblemode 0x0F;
    loaddll "TKInfo.dll";
    if( !result ) {
    message "このマクロは秀丸メールで実行してください。";
    endmacro;
    }
    if( !dllfunc( "IsTuruKameMain" ) ) {
    message "このマクロは秀丸メール本体側で実行してください。";
    endmacro;
    }
    disabledraw;  //画面書き換え禁止
    #count = dllfunc("SelectedMailCount");
    if( #count == 0 ) {endmacro;}
    #n = dllfunc("LockSelection");
    while(1) {
    #n = dllfunc("EnumSelection", 1);
    if( #n == 0 ){break;}
        $subj = dllfuncstr("CurrentHeader", "Subject:");    //【TSUTAYA DISC
AS】 20yy/mm/dd 返却
//message "CurrentHeaderです" +"\n"+ $subj;
        if( leftstr( $subj, 18 ) == "【TSUTAYA DISCAS】"
         && midstr( $subj, 18, 6) == " 2009/" ) {
//         && midstr( $subj, 18, 6) == " 2010/" ) {
//message "leftstr( $subj, 18 )です" +"\n"+ leftstr( $subj, 18 );
//message "midstr( $subj, 18, 6 )です" +"\n"+ midstr( $subj, 18, 6);
            #n = dllfunc("BeginEditMail");
            $subj = dllfuncstr("CurrentHeader", "Subject:");   //【TSUTAYA D
ISCAS】 20yy/mm/dd 返却
//message "CurrentHeaderです" +"\n"+ $subj;
            $subr = leftstr( $subj, 18 );                     //【TSUTAYA DI
SCAS】
//message "$subrです" +"\n"+ leftstr( $subj, 18 );
            $subm = midstr( $subj, 18, 12 );                  // 20yy/mm/dd
//message "$submです" +"\n"+ midstr( $subj, 18, 12 );
            $subl = rightstr( $subj, 4 );                     // 返却
//message "$sublです" +"\n"+ rightstr( $subj, 4 );
            $s = "([0-9]{4})\\/([ 0-9]{1,2})\\/([ 0-9]{1,2})";  // 20yy/mm/d
dを期待
//message "$sです" +"\n"+ $s;
            $s2 = "\\1-\\2-\\3";                                // 20yy-mm-d
dを期待
//message "$s2です" +"\n"+ $s2;
//------------なんらかの処理------------
    loaddll "hmjre.dll";
    if( !result ) message "loaddllに失敗しました。";
          $s = dllfuncstr( "ReplaceRegular", $s, $subm, 0, $s2 );  // 20yy-m
m-ddを期待
//message "20yy-mm-ddを期待" +"\n"+ $s;
    freedll;
//------------なんらかの処理------------
    loaddll "TKInfo.dll";
    if( !result ) message "loaddllに失敗しました。";
            $subj = $subr + $s + $subl;                    //【TSUTAYA DISCA
S】 20yy-mm-dd 返却を期待
//message "【TSUTAYA DISCAS】 20yy-mm-dd 返却を期待" +"\n"+ $subj;
            #n = dllfunc("SetHeader", "Subject", $subj );  //【TSUTAYA DISCA
S】 20yy-mm-dd 返却を期待
//message "SetHeader" +"\n"+"【TSUTAYA DISCAS】 20yy-mm-dd 返却を期待" +"\n"
+ $subj;
            #n = dllfunc("SaveEditMail", 0, 0 );
         }
    }
    #n = dllfunc("UnlockSelection", 1);
    enabledraw;   //解除
    #n = dllfunc("AlterSave");                     // 編集中のメールを改変保存
    #n = dllfunc("SetMailFlag", "altered", 0);     // 改変されたかどうか改変
マークOFF
    closereg;
    freedll;
    endmacro;
//------------試行錯誤中マクロここまで------------

[ ]
RE:00478 【質問】秀丸メールのマクロで題No.00479
hum2 さん 10/06/01 12:38
 
 お世話になります。

>後学のためにお聞きしたいのですが、2009/と2010/の
>ような時の指定は一度にはできないのでしょうか?
>何か良い方法をご存じでしたらご教示願えますか?
>  if( leftstr( $subj, 18 ) == "【TSUTAYA DISCAS】"
>  && midstr( $subj, 18, 6) == " 2009/" ) {
>//&& midstr( $subj, 18, 6) == " 2010/" ) {

自己解決の報告です。なにげなく、秀丸メールマクロでググったら

if( leftstr( $subj, 18 ) == "【TSUTAYA DISCAS】"
&& ( midstr( $subj, 18, 6) == " 2009/" || midstr( $subj, 18, 6) == " 2010/"
 )) {

と、することが可能なようでした。


[ ]