Subject: tag付き置換についてNo.02853
haru さん 01/12/14 17:40
 
いつも、御世話様です。早速なんですが、

「数字の1と数字の2は隣り合っています。」

「数字の2と数字の1は隣り合っています。」

に変換することは、マクロでできるみたいなんですが、

「数字の1と数字の2は隣り合っています。」
を、
「数字の2と数字の3は隣り合っています。」

の様に、+1 した形で、置換することはできないでしょうか?

 \0とか\1に、+1できれば良いんですが。

 実際どういう場面で使おうとしているかというと、Excel で列を
挿入したときなど、セルの指定、具体的には cells(i,1) を
cells(i,2) という風に括弧の中の右の数字を全部 +1 したいのです。


よろしくお願いします。

[ ]
RE:02853 Subject: tag付き置換についてNo.02855
ひろ さん 01/12/14 18:18
 
 haru さん今日は、ひろです。
> 「数字の1と数字の2は隣り合っています。」
> を
> 「数字の2と数字の1は隣り合っています。」
>
> に変換することは、マクロでできるみたいなんですが、
 これはマクロでなくても、タグ付き正規表現による置換で出来ます。

> 「数字の1と数字の2は隣り合っています。」
> を、
> 「数字の2と数字の3は隣り合っています。」
 これは一般的な形の場合は無理だと思います。検索文字列が決まっていれ
ば、str, val 関数を使えばある程度は出来ると思います。

[ ]
RE:02853 Subject: tag付き置換についてNo.02857
山紫水明 さん 01/12/14 20:59
 
 haruさん,こんばんは。

》の様に、+1 した形で、置換することはできないでしょうか?

 次のようなのではだめですか? これは数字を全部変換してしまいます。
 なお,検索語の表示を範囲選択に設定しておく必要がありますが,多分,
マクロの書き方おわかりのことと思います。
//------------------------------------
gofiletop;
while( 1 ) {
    searchdown2 "[0-9]+", regular;
    if( !result ) break;
    cut;
    beginclipboardread;
    insert str(val(getclipboard) + 1);
}
endmacro;
//------------------------------------

     では, (^^)/~
                                        山紫水明

[ ]
RE:02855 Subject: tag付き置換についてNo.02858
haru さん 01/12/15 00:15
 
ひろさん、こんばんは。haruです。

> これは一般的な形の場合は無理だと思います。検索文字列が決まっていれ
>ば、str, val 関数を使えばある程度は出来ると思います。

わかりました。早速の作ってみたのですが、ひとつ教えて下さい。

実際は括弧の中は変数なんですが、例えば

#cy = val("3i0");
if (result) #cy = #cy + 1;

としたとき、#cyは4になるのですが、仕様でしょうか?

#cy = val("a");
if (result) #cy = #cy + 1;

ですと、同じく1になります。

ヘルプによると、
>数値に変換できない場合は0が返ります。
とありますが、例えばどういう時なんでしょうか?
上の例ですと、変換できない場合に当たると思うのですが。

よろしくお願いします。

[ ]
RE:02857 Subject: tag付き置換についてNo.02859
haru さん 01/12/15 00:48
 
山紫水明さん、こんばんは。haruです。

> 次のようなのではだめですか? これは数字を全部変換してしまいます。

早速の御返事、また、いつも貴重な御意見を頂き、感謝しております。

 実際どういう場面で使おうとしているかと申しますと、繰り返し
になるんですが、Excel で「列」を挿入したときなど、セルの指定、
具体的には cells(i,1) を cells(i,2) という風に括弧の中の「右」
の数字を全部 +1 したいのです。
 例えば、cells(3,1) → cells(3,2) です。

 Cells(x,y) として(x、yはともに、変数も可能ですが今回はと
りあえず数字として)、x かyのどちらかしか変換したくありませ
ん。
 先のマクロにちょっと手を加えれば、完成という様であれば御教
示下さい。
 私も作ってみましたが、うまくいかない点があります。それにつ
いては先程投稿致しました。

よろしくお願いします。

[ ]
RE:02859 Subject: tag付き置換についてNo.02860
山紫水明 さん 01/12/15 08:13
 
 haruさん,こんにちは。

》具体的には cells(i,1) を cells(i,2) という風に括弧の中の「右」
》の数字を全部 +1 したいのです。

 数字をどう定義するかによりますが,ここでは "," と ")" に挟まれた数字の
みを対象にするとします。

//------------------------------------
gofiletop;
while( 1 ) {
    searchdown2 ",[0-9]+\\)", regular;
    if( !result ) break;
    cut;
    beginclipboardread;
    $a = getclipboard;
    $a = midstr( $a, 1, strlen( $a )- 1 );
    insert "," + str( val( $a ) + 1 ) + ")";
}
endmacro;
//------------------------------------

     では, (^^)/~
                                        山紫水明

[ ]
RE:02858 Subject: tag付き置換についてNo.02861
tomoyo さん 01/12/15 09:45
 
valは多分C言語のatoiで処理されているとおもわれるので
「文字列のはじめの部分を int 型整数に変換する。」
のでは?

>#cy = val("3i0");
文字列を評価した場合に、iが出るまでは数値なので
変換されて、3になる。

>#cy = val("a");
最初から数字じゃないので
>ヘルプによると、
>>数値に変換できない場合は0が返ります。
で、0になっている。

と、いう仕様だとおもわれます。

[ ]
RE:02853 Subject: tag付き置換についてNo.02863
きいろいまふらあ さん 01/12/15 14:47
 
> 実際どういう場面で使おうとしているかというと、Excel で列を
>挿入したときなど、セルの指定、具体的には cells(i,1) を
>cells(i,2) という風に括弧の中の右の数字を全部 +1 したいのです。

昔、数字を検索してその値を増減するマクロを作った記憶がありますが、まだ使
えるのかどうかよくわからないです。(^^;
http://www.pluto.dti.ne.jp/~gogh/ を探すとあるはずです。
リナンバリングとかって名前だったと思います。

(以下、会議室の主旨に反しますが)

もっとも、今回の話は、VBAのコーディングの仕方で解決するのが本質的な対策
と感じます。

例えば、列に名前をつけるとか、どの列が何列目かを(Constで)定数として定
義しておくとか、その上でその名前ないしは定数を使って処理対象を記述すると
かすれば、メンテナンス性は格段に向上すると思いますよ。

Excel-VBAはちょっとかじっただけです。えらそうにすみません。(_o_)

[ ]
RE:02860 Subject: tag付き置換についてNo.02864
haru さん 01/12/15 17:35
 
山紫水明さん、こんにちは。haruです。

>》具体的には cells(i,1) を cells(i,2) という風に括弧の中の「右」
>》の数字を全部 +1 したいのです。
>
> 数字をどう定義するかによりますが,ここでは "," と ")" に挟まれた数字の
>みを対象にするとします。

 具体的には、Cells(x,y) です。配列とすれば、Cells というも
のだけです。x、yは任意の数字です。yの先頭にスペースが入る
ときもあります。
 実際どういうものを置換するかと申しますと、

Cells(i, 32) = Cells(i,13) + Cells(i,14) + Cells(i,15).Text

です。

教えていただいた、
>    searchdown2 ",[0-9]+\\)", regular;

searchdown2 "Cells\\(.+,[0-9 ]+\\)", regular;
searchdown2 "Cells\\(.+,[0-9 ][^)]+\\)", regular;

等々色々試してみましたが、最長一致でうまくいきません。

よろしくお願いします。

[ ]
RE:02861 Subject: tag付き置換についてNo.02865
haru さん 01/12/15 17:35
 
tomoyoさん、こんにちは。haruです。

>>#cy = val("3i0");
>文字列を評価した場合に、iが出るまでは数値なので
>変換されて、3になる。
>
>>#cy = val("a");
>最初から数字じゃないので
>>ヘルプによると、
>>>数値に変換できない場合は0が返ります。
>で、0になっている。

result はいつも同じで、aでも数字でも
>resultの値は成功の場合が1
なんですね。

#cy = val("0");//ゼロ
これは、もちろん0で、せめて 数字以外の時は、result は失敗に
していただきたいのですが。>秀丸担当の方

よろしくお願いします。

[ ]
RE:02864 Subject: tag付き置換についてNo.02866
きいろいまふらあ さん 01/12/15 19:43
 
ほんとの気持ちは別発言のとおりですが、

>searchdown2 "Cells\\(.+,[0-9 ]+\\)", regular;
                      ^^
                      [^,]+
としたらよいかと。

[ ]
RE:02864 Subject: tag付き置換についてNo.02867
山紫水明 さん 01/12/15 21:14
 
 haruさん,こんばんは。

》 具体的には、Cells(x,y) です。配列とすれば、Cells というも
》のだけです。x、yは任意の数字です。yの先頭にスペースが入る
》ときもあります。

 ここでは配列か否かということは関係なくて,対象となる数字をテキスト上で
どう定義するかが問題です。
 数字を加える必要があるので,タグ付き置換ではうまくいかないと思います。

》Cells(i, 32) = Cells(i,13) + Cells(i,14) + Cells(i,15).Text

定義1.右側に ")" が来る数字だけをを対象とする。
 この場合は,
//------------------------------------
gofiletop;
disabledraw;
while( 1 ) {
    searchdown2 "[0-9]+\\)", regular;
    if( !result ) break;
    cut;
    beginclipboardread;
    $a = getclipboard;
    $a = leftstr( $a, strlen( $a )- 1 );
    insert str( val( $a ) + 1 ) + ")";
}
endmacro;
//------------------------------------
この場合は,()で囲まれた数字も変換されます。それで具合悪ければ,

定義2.左側に "," か半角スペース,かつ右側に ")" が来る数字
 この場合は,多分2段階の操作が必要でしょう。
//------------------------------------
disabledraw;
$s = ",";
call Plus;
$s = " ";
call Plus;
endmacro;

Plus:
  gofiletop;
  while( 1 ) {
    searchdown2 $s + "[0-9]+\\)", regular;
    if( !result ) break;
    cut;
    beginclipboardread;
    $a = getclipboard;
    $a = midstr( $a, 1, strlen( $a )- 2 );
    insert $s + str( val( $a ) + 1 ) + ")";
  }
  return;
//------------------------------------

なお,汎用として次のようなマクロを2回実行する方法もあります。
1回目  前文字 "," 後文字 ")" 増分 1
2回目 前文字 " " 後文字 ")" 増分 1

//-----------------------------------------------------//
//特定文字に挟まれた数字の増減をする

$left = input( "前文字", "(" );
$right = input( "後文字", ")" );
#plus = val( input( "増分(負数も可)", "1" ) );
if( !#plus ) endmacro;
disabledraw;
if(strstr(".()[]|", $left) > -1 ) $left2 = "\\" + $left;
else $left2 = $left;
if(strstr(".()[]|", $right) > -1 ) $right2 = "\\" + $right;
else $right2 = $right;
#left = strlen($left);
#right = strlen($right);
gofiletop;
while( 1 ) {
    searchdown2 $left2 + "[-0-9]+" + $right2, regular;
    if( !result ) break;
    cut;
    beginclipboardread;
    $a = getclipboard;
    $a = midstr( $a, #left, strlen( $a ) - #left - #right );
    insert $left + str( val( $a ) + #plus ) + $right;
}
endmacro;
//-----------------------------------------------------//

     では, (^^)/~
                                        山紫水明

[ ]
RE:02863 Subject: tag付き置換についてNo.02868
haru さん 01/12/15 21:51
 
きいろいまふらあさん、こんばんは。haruです。

>昔、数字を検索してその値を増減するマクロを作った記憶がありますが、まだ使
>えるのかどうかよくわからないです。(^^;
>http://www.pluto.dti.ne.jp/~gogh/ を探すとあるはずです。
>リナンバリングとかって名前だったと思います。
是非参考にさせていただきます。


>(以下、会議室の主旨に反しますが)
>
>もっとも、今回の話は、VBAのコーディングの仕方で解決するのが本質的な対策
>と感じます。
>例えば、列に名前をつけるとか、どの列が何列目かを(Constで)定数として定
>義しておくとか、その上でその名前ないしは定数を使って処理対象を記述すると
>かすれば、メンテナンス性は格段に向上すると思いますよ。

 実は現在はこのような不都合を感じ、そうしているのですが、以
前作ったものとか、別の人が作ったものとかのメンテをするときと
か、面倒に感じておりました。
 そこで、今回秀丸エディタで解決できないかと思い、投稿した次
第です。

>Excel-VBAはちょっとかじっただけです。えらそうにすみません。(_o_)
 とんでもありません。貴重な御意見ありがとうございます。
(私もそうなのです。)

(以上、会議室の主旨に反して、すみません)

[ ]
RE:02866 Subject: tag付き置換についてNo.02869
haru さん 01/12/15 21:51
 
きいろいまふらあさん、こんばんは。haruです。

>>searchdown2 "Cells\\(.+,[0-9 ]+\\)", regular;
>                      ^^
>                      [^,]+
>としたらよいかと。

うまく行きました。早速の御返事、ありがとうございます。

[ ]
RE:02867 Subject: tag付き置換についてNo.02871
haru さん 01/12/16 10:48
 
山紫水明さん、こんばんは。haruです。

> ここでは配列か否かということは関係なくて,対象となる数字をテキスト上で
>どう定義するかが問題です。
 説明不足で、すみません。エクセルのマクロは、秀丸と違って、
配列は a(i,j) という形です。このうち置換対象は Cells(i,j) だ
けです。

> 数字を加える必要があるので,タグ付き置換ではうまくいかないと思います。
 この件に関しましては、\\0 とか \\1 で実際、値が参照できるので、
これをマクロで使う普通の変数 $a とか $b に代入できるように検
討していただけると、幸いです。>秀丸担当様


 いずれにしましても、山紫水明さんの前掲のマクロ、きいろいま
ふらあさんの RENUM.MAC 非常に参考になりました。お陰を持ちまし
てうまくいきました。ありがとうございます。この場をお借りして、
感謝の意を申し上げます。

[ ]
RE:02871 Subject: tag付き置換についてNo.02872
TAKA さん 01/12/16 13:35
 
TAKA です。

>> 数字を加える必要があるので,タグ付き置換ではうまくいかないと思います。
> この件に関しましては、\\0 とか \\1 で実際、値が参照できるので、
>これをマクロで使う普通の変数 $a とか $b に代入できるように検
>討していただけると、幸いです。>秀丸担当様

どのような、方法でしょうか?

[ ]
RE:02872 Subject: tag付き置換についてNo.02873
haru さん 01/12/17 10:02
 
TAKA さん、こんにちは。

>>> 数字を加える必要があるので,タグ付き置換ではうまくいかないと思います。
>> この件に関しましては、\\0 とか \\1 で実際、値が参照できるので、
>>これをマクロで使う普通の変数 $a とか $b に代入できるように検
>>討していただけると、幸いです。>秀丸担当様
>
>どのような、方法でしょうか?

 簡単に言うと、例えば、$a = \\0; なんですが、こんなことが果た
してできるのかは私には未知です。

[ ]
RE:02868 Subject: tag付き置換についてNo.02874
ENCODINGSHIFTJIS さん 01/12/17 10:27
 
>>もっとも、今回の話は、VBAのコーディングの仕方で解決するのが本質的な対策
>>と感じます。
>>例えば、列に名前をつけるとか、どの列が何列目かを(Constで)定数として定
>>義しておくとか、その上でその名前ないしは定数を使って処理対象を記述すると
>>かすれば、メンテナンス性は格段に向上すると思いますよ。

作業量的に難しい点もあるが、正しい解決法ですね
-----------------------------------
' Cells は ActiveSheet だけじゃない、のサンプル
Sub offsetRNG()
Cells(1, 1).Value = 11
Cells(4, 4).Value = 44

Set offsetrange = Range(Cells(2, 2), Cells(5, 5))
offsetrange.Cells(1, 1).Value = 22
offsetrange.Cells(4, 4).Value = 55

Set offsetrange = Columns("B:AA")
offsetrange.Cells(1, 1).Value = 12
offsetrange.Cells(4, 4).Value = 45

End Sub
-----------------------------------
上を白紙のシートで実行するとわかります
普通はデフォルトのActiveSheetを対象にするが、範囲を対象にすると
範囲内の相対座標でアクセスするようになる。
秀丸の置換は  Cells(   -->  R.Cells(   で済む、
あるいは、 With  文も使える、 その時は  Cells(  -->  .Cells(
可変度を低くして安定化。



[ ]
RE:02873 Subject: tag付き置換についてNo.02875
TAKA さん 01/12/17 12:15
 
TAKA です。

> 簡単に言うと、例えば、$a = \\0; なんですが、こんなことが果た
>してできるのかは私には未知です。

おそらく、「searchdown」等の検索で正規表現をした直後
(例えば、「searchdown2 "Cells\\(.+,[0-9 ]+\\)", regular;」等
の直後)に「$a = \\0;」としたいと思いますが、
それによって、特定の文字の取り出しは可能になると思いますが、
変数の値を変更しながら(今回の場合は+1)、置換は出来ないの
ではないでしょうか?
なぜなら、「replaceallfast」などでは、置換後の文字列に特定の
文字を指定するからです。

「$a = \\0;」が出来たとして、その後の置換(+1)はどうやって
実現しようと思っていますか?

結局は、「02857」で紹介されているように1つ検索しては+1し
て置換というようになってしまうのではないでしょうか?

少なくとも、「$a = \\0;」が出来ても、タグ付置換によって1発
では出来ないと思います。
毎回のことですが、具体的にどのようにしたいのでしょうか?
haruさんのやりたいマクロを書いてみてもらえますか?
(「$a = \\0;」が出来たとして)

haruさん自身は分かっているのかもしれませんが、他の人は分から
ないと思います。

ですから、毎回スレッドが爆発傾向にあります。(何度も、やり取
りが必要なので)


置換とは関係なく、検索したものの一部を取り出すのが目的である
なら、「$a = \\0;」のような取出しが出来ると便利だと思います。

[ ]
RE:02875 Subject: tag付き置換についてNo.02876
haru さん 01/12/17 13:27
 
TAKA さん、こんにちは。

>「$a = \\0;」が出来たとして、その後の置換(+1)はどうやって
>実現しようと思っていますか?
確かにできませんでした。

>結局は、「02857」で紹介されているように1つ検索しては+1し
>て置換というようになってしまうのではないでしょうか?
下の例でもそうなてっしまいました。

>少なくとも、「$a = \\0;」が出来ても、タグ付置換によって1発
>では出来ないと思います。
そうですね。

>haruさんのやりたいマクロを書いてみてもらえますか?
>(「$a = \\0;」が出来たとして)

文法的な誤りは勘弁いただくとして

gofiletop;
while( 1 ) {
    searchdown2 "Cells\\(.+,\\f[0-9 ]\\f+\\)", regular;
    if( !result ) break;
    cut;
    $a = str(val(\\1) + 1);
    insert \\0$a\\2;
}

という感じです。結局省けたのは、文字列操作だけなのですが、秀
丸は文字列の先頭を0番目とするし、別のソフトは1から数えると
いうように違う場合があるのでそういう間違いはなくせそうです。
(私はこういう間違いが多いので)

>ですから、毎回スレッドが爆発傾向にあります。(何度も、やり取
>りが必要なので)
すみません。

>置換とは関係なく、検索したものの一部を取り出すのが目的である
>なら、「$a = \\0;」のような取出しが出来ると便利だと思います。

 私もそう思いますので、是非、御検討頂きたく存じます。

[ ]