[あすかぜ・ねっと]あすかぜ・ねっと自作ソフトCassava > サポート掲示板

Cassava Editor サポート掲示板

スレッド一覧に戻る
題名:
名前:
この名前を次回も使用する


スレッド一覧に戻る返信

[719] 【マクロ】セルとセルの結合、特定の文字があった列を削除

米津綾乃 [2022/11/17 13:40:22]

はじめまして。この度、CSVデータ取り扱いにおいて
こちらを使わせていただくことになりました。
しかし、取込前に作業をしないといけなくなり1つ1つ作業をすると時間がかかりすぎるためマクロを組めないかご相談です。

①特定のセルの内容を&でつなぐ
 54列目セル:テスト
 68列目セル:通販

 と記載されている場合、54列目セルに「テスト通販」となるようにしたいです。
 ※理想は「【通信欄】テスト【定期通信欄】通販」としたいです。
  この場合は【通信欄】と【定期通信欄】は固定文字

  普通にエクセルで関数表示するときは
  「="【通信欄】"&54列目セル&"【定期通信欄】"&68列目セル」
  とすればよいのですがどうすればよいでしょうか

②4列目に「キャンセル済み」と入っていたらその行ごと削除し、上に詰めるということをしたいです。
 Excelマクロの場合は、ループさせてif 「キャンセル済み」 だったら~
 とすればよいのですがこちらのCSVエディタは特殊?なようでわかりませんでした。
 解決方法など分かれば教えていただけますでしょうか。
 よろしくお願いいたします。

Re: [719] 【マクロ】セルとセルの結合、特定の文字があった列を削除

あすかぜ [2022/11/17 19:18:37]

次のようなマクロで、
・54 列目を「"【通信欄】"&54列目セル&"【定期通信欄】"&68列目セル」にする
・4 列目が "キャンセル済み" の場合その行を削除する
ことができると思います。

for (y = Bottom; y >= 1; y--) {
  [54,y] = "【通信欄】" + [54,y] + "【定期通信欄】" + [68,y];

  if ([4,y] == "キャンセル済み") {
    DeleteRow(y);
  }
}

試してみてください。

Re: [719] 【マクロ】セルとセルの結合、特定の文字があった列を削除

米津綾乃 [2022/11/18 17:48:53]

あすかぜ様

早速のご連絡ありがとうございます。
バタバタしていてまだ試せていないのですが、後日確認してみます。

取り急ぎお礼のご連絡をさせて頂きました。

Re: [719] 【マクロ】セルとセルの結合、特定の文字があった列を削除

いっち [2022/12/10 07:56:44]

あすかぜさんが書かれたコードを参考にして、自分用のマクロを書いてみる人は(私も含めて)多いと思うので、行番号で for 文をまわして直接テーブルを読み書きするコードがわかりやすくて良いと思っています。(DeleteRow() の高速化も 2.4 α1 の時に行われていますし)

それでも、「他のマクロから利用可能なライブラリ」に登録されている、Google Apps Script と似た API でデータを更新するためのライブラリ(SpreadsheetApp.zip)を利用させて頂く方法も、(今回は)選択肢のひとつとしてあるかなと思って(私も)マクロを書いてみました。

「標準ライブラリ」ではないし、あすかぜさんがサンプルコードを書いてくれたのも、[626] の記事一度きりのような気がしていますが、実際に書いてみると「利用しやすいライブラリ」みたいです。

下記のようなマクロを書いてみました。
もう3週間も前のスレなので、「ライブラリ使ってみました。」というご報告です。

// Cassavaオプションにある「指定回数のループでマクロを終了する」の回数が少ない場合、増やす必要があるかも知れません。
import { Array } from "lib/Array.cms";
import { getActiveSheet } from "lib/SpreadsheetApp.cms";
change_col  = 54-1;   // 54列目
posting_col = 68-1;   // 68列目
check_col   = 4-1;    // 4列目
template1 = "【通信欄】";
template2 = "【定期通信欄】";
template3 = "キャンセル済み";
// 実際の見出し行数に合わせて、変更してください。
// 見出しが無ければ、0と入力、見出しが1行なら、1と入力、見出しが2行なら、2と入力
heading_count = 1;

if (Bottom<=heading_count) {
  MessageBox("見出し以外の行が、ありません。");
  return;
}
range = getActiveSheet().getRange(heading_count+1, 1, Bottom-heading_count, Right);
b_values = range.getValues();
a_values = new Array();
del_count = 0;
for (b_value of b_values) {
  if (b_value[check_col].search(template3)>=0) {
    del_count++;
    continue;
  }
  b_value[change_col] = template1 + b_value[change_col] + template2 + b_value[posting_col];
  a_values.push(b_value);
}
if (b_values.length==del_count) {
  MessageBox("全ての行が、キャンセル済みでした。\n行の削除は、行っていません。");
  return;
}
range.setValues(a_values);
if (b_values.length==a_values.length) {
  MessageBox("削除する行は、ありません。\n"+(change_col+1)+"列目の内容を、変更しています。");
} else {
  DeleteRow(heading_count + a_values.length + 1, Bottom);
  MessageBox(del_count + " 行を、削除しました。\n"+(change_col+1)+"列目の内容を、変更しています。");
}
// 列幅を調整して再描画
// Refresh();

Re: [719] 【マクロ】セルとセルの結合、特定の文字があった列を削除

あすかぜ [2022/12/11 22:12:03]

そうですね。

DeleteRow() を実行するとそれ以降のすべてのデータの行番号が変わってしまうので、11/17 の私の返信では
「下から上に向かって逆順にループをまわす」
「DeleteRow() は for ループ内の最後に実行して、それ以降ではセルの更新はしない」
という制約をつけて、きちんと各行が 1 回ずつ処理されるように気をつけています。

SpreadsheetApp.zip を使う書き方であれば、意図しない行を更新してしまったり処理すべき行を飛ばしてしまったりするバグは起きにくくなりそうです。
Google Apps Script の経験がある方などは、このライブラリを活用していただくとよいかもしれません。
情報ありがとうございます。

スレッド一覧に戻る返信