■ 質問はここへ ■

222 にジャンプ
No. 214投稿者: kenmotu日付: 2001/09/14 22:25:24
題名 : 頻度カウントマクロ(?)のお願い

いつもお願いばかりで申し訳ありません。現在編集中のファイルで使われ
ている文字列が何回現れるかを調べるマクロを希望しています。操作とし
ては:

(1) カウントしたい文字列をハイライトする
(2) マクロを実行する
(3) 使用されている個数を表示する。

というものです。

現在、検索と置換のボックスに同じ文字列を入力して、[全置換] で置換
回数を確認しているのですが、これをもっと簡単にできたらと思った次第
です。

ご尽力いただければ幸いです。

p.s. qx@mxe.mesh.ne.jpにメールを送ってもどうしても受け付けられないので
こちらを見つけて質問させていただきました。
どうぞよろしくお願いいたします。

========
KENMOTU Kensaku
kecxo@muzika.forum.ne.jp

No. 215 (214へのコメント)投稿者: CINEPHILE日付: 2001/09/15 00:18:17
題名 : Re:頻度カウントマクロ(?)のお願い

>いつもお願いばかりで申し訳ありません。現在編集中のファイルで使われ
>ている文字列が何回現れるかを調べるマクロを希望しています。操作とし
>ては:
>
>(1) カウントしたい文字列をハイライトする
>(2) マクロを実行する
>(3) 使用されている個数を表示する。

 文字列の使用回数を調べるだけならば、次のマクロで実行できると思います。

proc main
dim srchstr$, c, n
srchstr$ = inputbox$("検索する文字列を入力してください。", " * 文字列の使用回数を調査 * ", "", "")
if srchstr$ = "" or srchstr$ = chr$(&H1B) then exit proc
@MoveFileTop
c = len(srchstr$)
if left$(@TextCr$(@Line), c) = srchstr$ then
n = 1
end if
do while 1
@FindStringBottom srchstr$
if @@SearchFound = 0 then exit do
n++
loop
call msgbox(srchstr$ + " は " + cformat$("%d", n) + " 個見つかりました。", 0, " * 文字列の使用回数を調査 * ")
end proc

 文字列の強調表示に関しては、よださんの公開なさっている「単語を強調表
示するマクロ」を使うことができます。次の場所からダウンロードできます。

http://www.valley.ne.jp/~yod/sippitu.html

 一つのマクロで実行することも可能でしょうが、よださんのマクロはすでに
公開されているものなので、とりあえずこのまま挙げておきます。

# マクロに何か問題がありそうでしたら、ご指摘をお願いいたします。>マク
# ロ作者の方々

>p.s. qx@mxe.mesh.ne.jpにメールを送ってもどうしても受け付けられないので
>こちらを見つけて質問させていただきました。
>どうぞよろしくお願いいたします。

 メーリングリストは現在調子が悪いようです。いずれ復旧してからご参加く
ださい。

No. 216 (215へのコメント)投稿者: CINEPHILE日付: 2001/09/15 00:29:00削除済 返信
題名 : Re^2:頻度カウントマクロ(?)のお願い
No. 217 (215へのコメント)投稿者: CINEPHILE日付: 2001/09/15 00:46:49
題名 : Re^2:頻度カウントマクロ(?)のお願い

 ちょっと訂正です。

 @Redraw を入れたのと、検索結果を表示するメッセージボックスで、検索文
字列をダブルクオートで囲むようにしました。

'文字列の使用回数を調査
proc main
dim srchstr$, c, n
srchstr$ = inputbox$("検索する文字列を入力してください。", " * 文字列の使用回数を調査 * ", "", "")
if srchstr$ = "" or srchstr$ = chr$(&H1B) then exit proc
@Redraw = 0
@MoveFileTop
c = len(srchstr$)
if left$(@TextCr$(@Line), c) = srchstr$ then
n = 1
end if
do while 1
@FindStringBottom srchstr$
if @@SearchFound = 0 then exit do
n++
loop
@Redraw = 1
call msgbox("""" + srchstr$ + """" + " は " + cformat$("%d", n) + " 個見つかりました。", 0, " * 文字列の使用回数を調査 * ")
end proc

No. 218 (217へのコメント)投稿者: CINEPHILE日付: 2001/09/15 01:39:43
題名 : Re^3:頻度カウントマクロ(?)のお願い

>(1) カウントしたい文字列をハイライトする
>(2) マクロを実行する
>(3) 使用されている個数を表示する。

 ちょっと趣旨を誤解していました。

 @Redraw = 0 の前の行までを、次のように変更するとご希望通りではないか
と思います。

proc main
dim srchstr$, c, n
if @Select = 1 or @Select = 2 then
@BlockClipboardCopy
srchstr$ = clipboard$()
else
srchstr$ = inputbox$("検索する文字列を入力してください。", " * 文字列の使用回数を調査 * ", "", "")
if srchstr$ = "" or srchstr$ = chr$(&H1B) then exit proc
end if

 まだ慣れないもので、たびたび訂正してすみません。

No. 219 (214へのコメント)投稿者: かぶねこ HP日付: 2001/09/15 01:59:31
題名 : Re:頻度カウントマクロ(?)のお願い

そうなんです、メーリングリストの調子が悪いようで……。

すでに CINEPHILE さんがマクロをアップしてくださってますが、もっと原始的
に、全置換の個数確認を自動実行するだけだと、こんなのになります。ステータ
スバーに「n 個置換しました」と表示されるのを見落とさないで読む必要があり
ます。

proc main
dim n, s$
if @Select = 0 then exit proc '選択してないと実行しません
s$ = @TextSelect$
@Select = 0
n = @@FindFromTop
@@FindFromTop = 1
@UndoBlock = 1
@ReplaceString2 s$, s$, 1
@UndoBlock = 0
@@FindFromTop = n
end proc

そういえば、この置換個数をマクロで参照できたらいいのに、と以前から思って
たんですが、できないんですよね。なんか方法あるのかもしれませんが……。

No. 220 (219へのコメント)投稿者: kenmotu日付: 2001/09/15 03:06:17
題名 : Re^2:頻度カウントマクロ(?)のお願い

CINEPHILE さん、かぶねこさん。マクロを作ってくださり、ありがとうご
ざいました。おかげで目的を達成することができました。

ただ、わがままを言わせていただくと、マクロ実行後、カーソルが、マク
ロを実行した位置に戻ってくれるとさらにありがたいかなあ、と思った次
第で・・・

お手すきのときにでもご一考いただければ、とても幸せです。

No. 221 (220へのコメント)投稿者: CINEPHILE日付: 2001/09/15 03:54:51
題名 : Re^3:頻度カウントマクロ(?)のお願い

>ただ、わがままを言わせていただくと、マクロ実行後、カーソルが、マク
>ロを実行した位置に戻ってくれるとさらにありがたいかなあ、と思った次
>第で・・・

 これでどうでしょうか。

proc main
dim srchstr$, c, n, x, y
if @TextSelect$ = "" then
srchstr$ = inputbox$("検索する文字列を入力してください。", " * 文字列の使用回数を調査 * ", "", "")
if srchstr$ = "" or srchstr$ = chr$(&H1B) then exit proc
else
srchstr$ = @TextSelect$
end if
x = @BytePos
y = @Line
@Redraw = 0
@MoveFileTop
c = len(srchstr$)
if left$(@TextCr$(@Line), c) = srchstr$ then
n = 1
end if
do while 1
@FindStringBottom srchstr$
if @@SearchFound = 0 then exit do
n++
loop
@BytePos = x
@Line = y
@Redraw = 1
call msgbox("""" + srchstr$ + """" + " は " + cformat$("%d", n) + " 個見つかりました。", 0, " * 文字列の使用回数を調査 * ")
end proc

 @BlockClipboardCopy を使うとクリップボードに入るので、かぶねこさんの
投稿を参考にして、@TextSelect$ に変更しました。実は、このようなプロパ
ティがあることを知らなかったので、以前からちょっと悩んでいました。

# 途中からマクロの勉強のようになってしまいましたが、やはりそつのない仕
# 事をするのは容易ではありませんね。普段はすでに出来上がったマクロを使
# わせていただく側なので、なかなか気がつきませんが。

No. 222 (221へのコメント)投稿者: CINEPHILE日付: 2001/09/15 05:53:40
題名 : Re^4:頻度カウントマクロ(?)のお願い

 これで最後だといいのですが……。

 マクロの終了前にカーソル位置を復元するところで、先に行を指定しないと
位置がくるってしまうことがあるようです。

 したがって、

@Line = y
@BytePos = x

のように、順番を入れ替えてください。

No. 224 (221へのコメント)投稿者: かぶねこ HP日付: 2001/09/15 11:11:23
題名 : Re^4:頻度カウントマクロ(?)のお願い

CINEPHILE さん、@TextSelect$ が参考になってよかったです。もちろんわたし
もどなたかのマクロを読んで覚えました。マクロで使えるコマンドに何があるか
というのはなかなか全部把握しておけませんよね。ときどき増えますし。

kenmotsu さん、やっぱりカーソル位置復帰はあったほうがいいですよね。原始
的マクロで復帰関係が多くなると「本文」の割合が少なくなってしまって本末転
倒ですし、CINEPHILE さんのがありますが、ついでに。

proc main
dim pos, line, top
pos = @BytePosCr
line = @Line
top = @Line - @TopLine
dim n, s$
if @Select = 0 then exit proc
s$ = @TextSelect$
@Select = 0
n = @@FindFromTop
@@FindFromTop = 1
@UndoBlock = 1
@ReplaceString2 s$, s$, 1
@UndoBlock = 0
@@FindFromTop = n
@Line = line
@ByteposCr = pos
@TopLine = @Line - top
end proc

No. 228 (224へのコメント)投稿者: kenmotu日付: 2001/09/15 16:46:34
題名 : Re^5:頻度カウントマクロ(?)のお願い

CINEPHILE さん、かぶねこさん。希望どおりのマクロを作っていただき、
さらに作業効率が向上しました。本当にどうもありがとうございました。

CINEPHILE さんのマクロはファイルの先頭からのすべての出現回数。かぶ
ねこさんのマクロは、現在のカーソル位置からの出現回数を検出するよう
に使い分けられますね。

No. 231 (228へのコメント)投稿者: かぶねこ HP日付: 2001/09/15 18:52:58
題名 : Re^6:頻度カウントマクロ(?)のお願い

>CINEPHILE さんのマクロはファイルの先頭からのすべての出現回数。かぶ
>ねこさんのマクロは、現在のカーソル位置からの出現回数を検出するよう
>に使い分けられますね。

が〜ん。意図した動作ではありませんでした。@ReplaceString2 では
@@FindFromTop の指定が効かないことを忘れてました。そういうふうに使ってい
ただけるならけっこうです。

いちおう自分用に意図どおりに動くようにしました。@MoveFileTop を削除すれ
ばカーソル位置以降で検索します。

proc main
dim pos, line, top
pos = @BytePosCr
line = @Line
top = @Line - @TopLine
dim i, s$
if @Select = 0 then exit proc
s$ = @TextSelect$
@Select = 0
'同一文字列で置換すると UNDO がいらないらしい
@MoveFileTop
@ReplaceString2 s$, s$, 1
i = @@ReplaceCount
@Line = line
@ByteposCr = pos
@TopLine = @Line - top
print "Count: " + str$(i)
end proc

いやあ、今回はたいへん勉強になりました。CINEPHILE さん、kenmotu さん、あ
りがとうございました。

No. 229 (224へのコメント)投稿者: CINEPHILE日付: 2001/09/15 18:09:40
題名 : Re^5:頻度カウントマクロ(?)のお願い

>CINEPHILE さん、@TextSelect$ が参考になってよかったです。もちろんわたし
>もどなたかのマクロを読んで覚えました。マクロで使えるコマンドに何があるか
>というのはなかなか全部把握しておけませんよね。ときどき増えますし。

 おっしゃるとおりですね。マクロのヘルプを通読するのは――挑戦したこと
はありませんが――味気なくて記憶にも残りにくいですし、やはり他の方のマ
クロの中で使われている実例が一番参考になります。言語の習得と通じるとこ
ろがありそうです。

 ところで、別の投稿の件ですが、

>そういえば、この置換個数をマクロで参照できたらいいのに、と以前から
思って
>たんですが、できないんですよね。なんか方法あるのかもしれませんが…
…。

@@ReplaceCount では駄目なのでしょうか。あるいは、これが使えないような
場合のことでしょうか。

No. 230 (229へのコメント)投稿者: かぶねこ HP日付: 2001/09/15 18:36:20
題名 : Re^6:頻度カウントマクロ(?)のお願い

CINEPHILE さん、どうも。

>@@ReplaceCount では駄目なのでしょうか。

え、あったんですね。探せてませんでした。ヘルプに記述がないですが、
@ReplaceString2 でも数字がちゃんと返ってくるみたいですね。いやあ、ありが
とうございます。


ヘッダのみ表示
順番に表示(No. 222 から)


メールアドレスを表示するにはURLの後ろに &m=bb6a9a3f をつけてください。
ユーザー フォーラム一覧

http://www2k.biglobe.ne.jp/~araken/
http://0ban.com/araken/