【質問】メール文中の項目の整形No.39210
hum さん 10/09/19 06:18
 
 お世話になります。
いつも大変便利に使わせて頂いております。
今回は、受信メール文中の項目を再利用したいのですが、その為には、
直接【対象】を整形するのに何かいい方法はないかと考えております。
単純でうまい方法が思いつかず、質問しますがご容赦下さい。

例えば、メール文中に下記に示す【対象】が出現したら文字数を問わず
価格部分の半角空白【_】を増減させ表記は_______9円半角10文字相当
〜999999円半角8文字相当、項目名は元のままで、→hoge___999円のように
【対象】全体で半角12文字相当に整形したいのですが、秀丸メール上の
マクロだとどんな関数を使えばうまく置換完了するか?
ご教示頂けないでしょうか?

#_半角空白を【_】に置換えて表現しました。半角空白は半角2文字〜15文字相当
# 項目名は、料金関係の用語ですが実際の表記は半角2文字〜6文字相当です。
# やりたいことで、説明不足があれば、指摘下さい。

よろしくお願いします。

【対象】          →【置換完了】
価格_____690円    →価格___690円
消費税___690円    →消費税_690円
割引___690円      →割引___690円
消費税___690円    →消費税_690円
消費税_474円      →消費税_474円
消費税_49円       →消費税__49円
消費税__49円      →消費税__49円
価格___999円      →価格___999円
消費税__49円      →消費税__49円
送料___840円      →送料___840円
割引_-1572円      →割引_-1572円
合計___316円      →合計___316円
hoge____999円     →hoge___999円
huga_____99999円  →huga_99999円
foo_________9円   →foo______9円
bar_______99999円 →bar__99999円
ba__49円          →ba______49円

[ ]
RE:39210 【質問】メール文中の項目の整形No.39212
秀まるお2 さん 10/09/19 18:08
 
 メール本文の修正については、基本的なやり方としては、BeginEditMail関数
を呼んでから、あとは秀丸エディタ的に書き換えるような形になります。

 秀丸エディタ的に書き換えるというのは、つまり、カーソルを移動して文字入
力してとか、そういうのを秀丸マクロの命令で書いてって感じになります。

 一般には、今回のような処理は正規表現を使った置換でやるのが楽なんじゃな
いかと思います。

> 価格_____690円    →価格___690円

 「価格」で始まって空白が何文字かあって「数字+円」があるような物の空白
を3個固定にしたいということであれば、

 検索: (価格)( *)([0-9]+円)
 置換:  \1   \3

 みたいになります。

 マクロで書くと、

  replaceallfast "(価格)( *)([0-9]+円)", "\\1   \\3", regular;

 みたいな1文で置換出来ると思います。

[ ]
RE:39212 【質問】メール文中の項目の整形No.39213
hum さん 10/09/19 21:14
 
秀まるお様
大変有意義で貴重なアドバイス、ありがとうございました。
【対象】項目によっては一回の置換では不足なので、「数字+円」の桁数に応じて
半角空白を増減させようと思います。以下のマクロで何とか置換できそうです。

//0.mac
disabledraw;  //画面書き換え禁止
replaceallfast "(価格)( *)([0-9]+円)", "\\1   \\3", regular;
replaceallfast "^価格   ([0-9][0-9][0-9][0-9][0-9])円","価格 \\1円",regular;
replaceallfast "^価格   ([0-9][0-9][0-9][0-9])円","価格  \\1円",regular;
replaceallfast "^価格   ([0-9][0-9][0-9])円","価格   \\1円",regular;
replaceallfast "^価格   ([0-9][0-9])円","価格    \\1円",regular;
replaceallfast "^価格   ([0-9])円","価格     \\1円",regular;
enabledraw;  //解除
endmacro;    //マクロを終了


【対象】
価格                  91690円
価格              1690円
価格             690円
価格             99円
価格           9円

【置換完了】
価格 91690円
価格  1690円
価格   690円
価格    99円
価格     9円

今、解決できないところは、メール一覧上から整形したいのですが、
BeginEditMail関数を呼んでから、置換は完了するものの

TKINFO.DLL: エディタ上で実行できないTKInfo.dll呼び出しが行われました。
関数コード = 123

とエラー表示が出てしまいます。どこか凡ミスしているのか探せていません。
以下のマクロで直すとしたらどんな感じになりますか?

よろしくお願いいたします。
hum
Windows XP Pro SP3
秀丸メール   Ver.5.50β21
秀丸エディタ Ver.8.02β9


//0.mac
    setcompatiblemode 0x0F;
    loaddll "TKInfo.dll";
    if( !result ) {
    message "このマクロは秀丸メールで実行してください。";
    endmacro;
    }
    disabledraw;  //画面書き換え禁止
    #n = dllfunc("BeginEditMail");
    replaceallfast "(価格)( *)([0-9]+円)", "\\1   \\3", regular;
    replaceallfast "^価格   ([0-9][0-9][0-9][0-9][0-9])円","価格 \\1円",regu
lar;
    replaceallfast "^価格   ([0-9][0-9][0-9][0-9])円","価格  \\1円",regular;
    replaceallfast "^価格   ([0-9][0-9][0-9])円","価格   \\1円",regular;
    replaceallfast "^価格   ([0-9][0-9])円","価格    \\1円",regular;
    replaceallfast "^価格   ([0-9])円","価格     \\1円",regular;
    #n = dllfunc("SaveEditMail", 0, 0 );
    enabledraw;  //解除
    #n = dllfunc("AlterSave");  //改変保存します
    #n = dllfunc("SetMailFlag", "altered", 0);  //改変マークはOFF
    endmacro;    //マクロを終了

> メール本文の修正については、基本的なやり方としては、BeginEditMail関数
>を呼んでから、あとは秀丸エディタ的に書き換えるような形になります。
>
> 秀丸エディタ的に書き換えるというのは、つまり、カーソルを移動して文字入
>力してとか、そういうのを秀丸マクロの命令で書いてって感じになります。
>
> 一般には、今回のような処理は正規表現を使った置換でやるのが楽なんじゃな
>いかと思います。
>
>> 価格_____690円    →価格___690円
>
> 「価格」で始まって空白が何文字かあって「数字+円」があるような物の空白
>を3個固定にしたいということであれば、
>
> 検索: (価格)( *)([0-9]+円)
> 置換:  \1   \3
>
> みたいになります。
>
> マクロで書くと、
>
>  replaceallfast "(価格)( *)([0-9]+円)", "\\1   \\3", regular;
>
> みたいな1文で置換出来ると思います。

[ ]
RE:39213 【質問】メール文中の項目の整形No.39214
Iranoan さん 10/09/19 21:26
 
 hum さん今日は、一ユーザの Iranoan です。
>     #n = dllfunc("BeginEditMail");
によって、本体上で編集しているので、
>     #n = dllfunc("AlterSave");  //改変保存します
は要らないはずです。

[ ]
RE:39214 【質問】メール文中の項目の整形No.39215
hum さん 10/09/20 00:17
 
Iranoan様
 お世話になります。

> hum さん今日は、一ユーザの Iranoan です。
>     #n = dllfunc("BeginEditMail");
>によって、本体上で編集しているので、
>     #n = dllfunc("AlterSave");  //改変保存します
>は要らないはずです。

一応、ご指摘部分をコメントアウトして変化を見ましたが解決とはいきませんでした。
現状あっても不都合は無いようです。それよりも、質問の意図としては
秀丸メールエディタウィンドウ本体上で編集したいのではなくて、メール一覧上から
整形したいのですが、エラー表示が出てしまい、どこがおかいいのか?ご指摘頂けると
うれしいのですが...【秀丸メールエディタウィンドウでは実行しない前提です。】
現在、秀丸メール マクロヘルプで例(本文を書き換える例)をそのまま流用したら
メール一覧上で、うまく置換完了したようです。
マクロで書くと、以下のようになります。

//0.mac
    setcompatiblemode 0x0F;
    loaddll "TKInfo.dll";
    if( !result ) {
    message "このマクロは秀丸メールで実行してください。";
    endmacro;
    }
    disabledraw;  //画面書き換え禁止
    #n = dllfunc("BeginEditMail");
    #r = readonly;
    #b = browsemode;
    if( #r ) readonlyswitch;
    if( #b ) browsemodeswitch;
replaceallfast "(価格)( *)([0-9]+円)", "\\1   \\3", regular;
replaceallfast "^価格   ([0-9][0-9][0-9][0-9][0-9])円","価格 \\1円",regular;
replaceallfast "^価格   ([0-9][0-9][0-9][0-9])円","価格  \\1円",regular;
replaceallfast "^価格   ([0-9][0-9][0-9])円","価格   \\1円",regular;
replaceallfast "^価格   ([0-9][0-9])円","価格    \\1円",regular;
replaceallfast "^価格   ([0-9])円","価格     \\1円",regular;
    #n = dllfunc("SaveEditMail", 0, 1 );
    if( #r ) readonlyswitch;
    if( #b ) browsemodeswitch;
    enabledraw;  //解除
    #n = dllfunc("AlterSave");  //改変保存します
    #n = dllfunc("SetMailFlag", "altered", 0);  //改変マークはOFF
endmacro;    //マクロを終了


[ ]
RE:39213 【質問】メール文中の項目の整形No.39216
hum さん 10/09/20 10:38
 
今、解決できないところは、メール一覧上から整形したいのですが、
BeginEditMail関数を呼んでから、置換は完了するもののエディタ上で
マクロを実行するとエラー表示が出てしまいます。

TKINFO.DLL: エディタ上で実行できないTKInfo.dll呼び出しが行われました。
関数コード = 123

とどこか凡ミスしているのか探せていません。
以下のマクロで直すとしたらどんな感じになりますか?
よろしくお願いいたします。

  loaddll "TKInfo.dll";
  if( !result ) {
  message "このマクロは秀丸メール一覧上で実行してください。";
  endmacro;
  }

または、以下の記述だと秀丸メール上のエディタでは期待どおりのメッセージ表示
をしますが、秀丸エディタ上では、マクロを実行するとエラー表示が出てしまいます。

DLLがロードされてないのにdllfunc関数が使われました


秀丸メール上のエディタと秀丸エディタ上でマクロを実行すると期待どおりのメッ
セージ表示
をさせるには、何を付け足せばよいのでしょうか?

    loaddll "TKInfo.dll";
    #n = dllfunc( "IsHidemaruMailMain");
    if( #n == 0 ) {
    message "このマクロは秀丸メール一覧上で実行してください。";
    endmacro;
    }

[ ]
RE:39216 【質問】メール文中の項目の整形No.39217
K'zawa さん 10/09/20 11:34
 
humさん、こんにちは。
K'zawaです。

>以下のマクロで直すとしたらどんな感じになりますか?

単純に足せばよいのでは?

  loaddll "TKInfo.dll";
  if( !result ) {
    message "このマクロは秀丸メール一覧上で実行してください。";
    endmacro;
  }
  #n = dllfunc( "IsHidemaruMailMain");
  if( #n == 0 ) {
  message "このマクロは秀丸メール一覧上で実行してください。";
  endmacro;
  }

[ ]
RE:39216 【質問】メール文中の項目の整形No.39218
秀まるお2 さん 10/09/20 11:35
 
> TKINFO.DLL: エディタ上で実行できないTKInfo.dll呼び出しが行われました。
> 関数コード = 123

 これはBeginEditMail関数をエディタ・ウィンドウ上で呼び出すと出るエラー
のようです。

 とりあえずこちらで簡単にテストで作ったマクロは以下のようになりました。

    loaddll "tkinfo.dll";
    if( !result ) {
        message "tkinfo.dllがロード出来ませんでした。";
        endmacro;
    }
    if( dllfunc("IsHidemaruMailMain") ) {
        #count = dllfunc("SelectedMailCount");
        if( #count != 0 ) {
            #n = dllfunc("LockSelection");
            while(1) {
                #n = dllfunc("EnumSelection", 1);
                if( #n == 0 ) {
                    break;
                }
                #n = dllfunc("BeginEditMail");
                call ReplaceSub;
                #n = dllfunc("SaveEditMail", 0, 1);
                #n = dllfunc("SetMailFlag", "altered", 0);
            }
            #n = dllfunc("UnlockSelection", 1);
        }
    } else {
  #n = dllfunc("EnableEdit");
        call ReplaceSub;
        #n = dllfunc("AlterSave");
        #n = dllfunc("SetMailFlag", "altered", 0);
    }
    endmacro;

ReplaceSub:
    #browse = browsemode;
    if( #browse ) {
        browsemodeswitch;
    }
    #readonly = readonly;
    if( #readonly ) {
        readonlyswitch;
    }
    replaceallfast "(価格)( *)([0-9]+円)", "\\1   \\3", regular;
    if( #browse ) {
        browsemodeswitch;
    }
    if( #readonly ) {
        readonlyswitch;
    }
    return;

[ ]
RE:39217 【質問】メール文中の項目の整形No.39219
hum さん 10/09/20 13:01
 
K'zawa様
 お世話になります。
こんにちは。humです。

>以下のマクロで直すとしたらどんな感じになりますか?

>単純に足せばよいのでは?

ご指摘ありがとうございました。その通りでした。
お陰さまで秀丸メール上でだけ使うつもりのマクロの区別が
容易になりました。

//-------------------------------------
  loaddll "TKInfo.dll";
  if( !result ) {
    message "このマクロは秀丸メール一覧上で実行してください。";
    endmacro;
  }
  #n = dllfunc( "IsHidemaruMailMain");
  if( #n == 0 ) {
  message "このマクロは秀丸メール一覧上で実行してください。";
  endmacro;
  }
//-------------------------------------
  loaddll "TKInfo.dll";
  if( !result ) {
    message "このマクロは秀丸メールエディタ上で実行してください。";
    endmacro;
  }
  #n = dllfunc( "IsHidemaruMailMain");
  if( #n == 1 ) {
  message "このマクロは秀丸メールエディタ上で実行してください。";
  endmacro;
  }

[ ]
RE:39218 【質問】メール文中の項目の整形No.39220
hum さん 10/09/20 14:24
 
 秀まるお様
大変有意義で貴重なアドバイス、ありがとうございました。
 いつも、マクロ作成までして頂きありがとうございます。
ご呈示頂いたマクロなら、秀丸メールの一覧上とエディタ上、
どちらでも動作可能なのですね。大変参考になりました。

> とりあえずこちらで簡単にテストで作ったマクロは以下のようになりました。

[ ]
RE:39220 【質問】メール文中の項目の整形No.39242
hum さん 10/09/26 19:12
 
秀まるお様 Iranoan様 K'zawa様
 いつも、アドバイスやマクロ作成までして頂きありがとうございます。
今回も受信メール文中の項目を再利用するのに大変参考になりました。

 さて、メール一覧上で置換完了できるといろいろ欲が出てしまいました。
エディタでの編集を省きたいので、マクロを試して見ると案外複雑になって
しまいました。
C) の単純な条件分岐も含む際には、『if』文よりも簡単な書き方が無いか?
どうすればよいかが探せていません。
少しマクロをシンプルな方法に直したいのですがよろしくお願いいたします。
A) B) C) の条件を満たしたい場合、マクロでは、どんな感じになりますか?

項目------
お届け予定日 2010-XX-XX  →イ)
返却日 2010-XX-XX        →ロ)
条件------
A) 受信したメール文中に項目イ)およびロ)があれば、何もしない。

お届け予定日 2010-XX-XX  →何もしない。
返却日 2010-XX-XX        →何もしない。

B) 受信したメール文中に項目イ)およびロ)がなければ、イ)およびロ)を
行頭に、挿入する。

              →お届け予定日 2010-XX-XX
              →返却日 2010-XX-XX

C) 受信したメール文中に項目イ)があれば、何もしない。

お届け予定日 2010-XX-XX  →何もしない。

----------


// if_else.mac
replaceallfast "^返却日 ([1-2][90][0-9][0-9])[\\-]{1,2}([  0-90-9]{1,2})
[\\-]{1,2}([  0-90-9]{1,2})","返却日 \\1-\\2-\\3",regular;
if( result ) {  // 当てはまらなければ何もせず
}else {
searchdown2 "^返却日";
if( result ) {  // 当てはまらなければ何もせず
}else {
gofiletop;
golinetop2;
insert "返却日 " + year + "-" + month + "-" + day + "\n";
}
}
replaceallfast "^お届け予定日: ([1-2][90][0-9][0-9])[\\-]{1,2}([  0-90-
9]{1,2})[\\-]{1,2}([  0-90-9]{1,2})","お届け予定日 \\1-\\2-\\3",regular;
replaceallfast "^お届け予定日 ([1-2][90][0-9][0-9])[\\-]{1,2}([  0-90-9]
{1,2})[\\-]{1,2}([  0-90-9]{1,2})","お届け予定日 \\1-\\2-\\3",regular;
if( result ) {  // 当てはまらなければ何もせず
}else {
searchdown2 "^お届け予定日";
if( result ) {  // 当てはまらなければ何もせず
}else {
gofiletop;
golinetop2;
insert "お届け予定日 " + year + "-" + month + "-" + day + "\n";
}
}

[ ]
RE:39242 【質問】メール文中の項目の整形No.39246
秀まるお2 さん 10/09/26 21:49
 
 そのマクロでいいというか、それでも十分シンプルだと思います。

 searchdown2で検索する前にはgofiletop;を入れた方がいいかなぁとは思いま
した。

[ ]
RE:39246 【質問】メール文中の項目の整形No.39261
hum さん 10/09/28 15:16
 
> そのマクロでいいというか、それでも十分シンプルだと思います。
>
> searchdown2で検索する前にはgofiletop;を入れた方がいいかなぁとは
>思いました。

いつもお世話になります。
大変有意義で貴重なアドバイス、ありがとうございました。

[ ]