[321] 特定のセル内での連番置換処理
せんと [2015/06/22 13:39:01]
初めて質問させていただきます。
1セル内に以下のようなhtmlを記述している状態において、
<body>
<p>テキストテキストテキスト</p>
・・・(略)
<p>テキストテキストテキスト</p>
・・・(略)
<p>テキストテキストテキスト</p>
・・・(略)
</body>
[<p>テキストテキストテキスト1</p>]の部分に連番を振り、
<body>
<p>テキストテキストテキスト1</p>
・・・(略)
<p>テキストテキストテキスト2</p>
・・・(略)
<p>テキストテキストテキスト3</p>
・・・(略)
</body>
としたい場合、どのようなマクロを組めばよいでしょうか?
最終的に実装したい機能は、「行はじめ~テキスト1」、「テキスト2~テキスト3」の間にある要素のみを削除するというものです。(必要なのは「テキスト1~テキスト2」の間です。)
そのためにテキストに番号を振り区別する必要があると思ったのですが、
もし他に方法があるのであれば、教えていただきたいです。
よろしくお願いいたします。
Re: [321] 特定のセル内での連番置換処理
あすかぜ [2015/06/24 15:23:27]
返信が遅くなってしまいすみません。
いただいた形の HTML に連番をふるには、</p> というタグを探してデータを置き換えていけばよさそうですね。
次のようなマクロで実現できそうです。
この例では、pos() で文字列の中から </p> の位置を取得し、left() と mid() で文字列を分割して繰り返し処理をしています。
count = 0;
in = [x,y];
out = "";
while (pos(in, "</p>") > 0) {
p = pos(in, "</p>");
count++;
// left(in, p - 1) で </p> の直前までの文字列を取得。
// out に連番と </p> を加える。
out = out + left(in, p - 1) + count + "</p>";
// mid(in, p + 4) で </p> 以降の文字列を取得。
// in を未処理のデータで置き換える。
in = mid(in, p + 4);
}
[x,y] = out + in;
また、<p> タグの数が 3 個とわかっているのであれば、次のように 1 個目、2 個目、3 個目の位置を取得して処理することもできます。
この例では、mid() で文字列の後半部分のみを取り出して <p> や </p> の位置を取得し、得られた位置に削除した前半部分の長さをたすことで元の文字列中での位置を計算しています。
(Cassava では文字列中の位置が 0 ではなく 1 から始まるため、mid() の中と外とで数字が 1 ずれています)
in = [x,y];
// n 番目 の <p> の始まる位置
p1 = pos(in, "<p>");
p2 = pos(mid(in, p1 + 3), "<p>") + p1 + 2;
p3 = pos(mid(in, p2 + 3), "<p>") + p2 + 2;
// n 番目の </p> の終わる位置
q1 = pos(in, "</p>") + 4;
q2 = pos(mid(in, q1), "</p>") + q1 + 3;
q3 = pos(mid(in, q2), "</p>") + q2 + 3;
// 1 番目の <p> から 2 番目の </p> までと、3 番目の <p> 以降のみを抽出
[x,y] = mid(in, p1, q2 - p1) + mid(in, p3);
これで回答になっているでしょうか?
よろしくお願いします。
Re: [321] 特定のセル内での連番置換処理
せんと [2015/06/24 17:31:21]
ありがとうございます!
思った通りの動きができています。
本当にありがとうございました。