ココナラで依頼のあったお客様
「背景色がついているセルの数をカウントするコードを書いたけど動きません。解決方法を教えてください」
というご依頼でした。
早速作成済みのコードを送っていただいたところ、どうやらサイトからコピペしただけで中身をわかっていらっしゃらないようでした。あらら。。。
こちらのサイトを参照したよう。
こうやってコードをアップしてくれてる先人達に感謝しつつ、コピペしたコードを動かしながら理解する努力も必要だなと思った1日でした。
サンプルコード
で、お客様が送ってきたコードを元に最終的に作ったのがこちらになります。
// 指定範囲のセル背景色に合致するセルの合計数を返します
// color: 背景色 rangeSpecification: 範囲指定文字列
function countCellsWithBackgroundColor(color, rangeSpecification) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("シート1");
var range = sheet.getRange(rangeSpecification);
var x = 0; //セルのカウント用
var i = 0;
var j = 0;
var cell;
for (i = 1; i <= range.getNumRows(); i++) { //getNumRows():Rangeの行数を取得
for (j = 1; j <= range.getNumColumns(); j++) {
cell = range.getCell(i, j);
if(cell.getBackgroundColor() == color)
x++;
}
}
return x;
}
// 指定セルの背景色を取得します
function getColor(rangeSpecification) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("シート1");
return sheet.getRange(rangeSpecification).getBackgroundColor();
}
function setCell(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("シート1");
//3行目から13行目までループ
for (k = 3; k <= 13; k++){
//"H3:N3"のような範囲を作成
var range = sheet.getRange(k,2,1,10)
//関数を作成
var tmp = '=countCellsWithBackgroundColor(getColor("A1"),"'+ range.getA1Notation() + '")'
//関数をセルにセット
sheet.getRange(k,12).setFormula(tmp);
}
}
function deleteCell(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("シート1");
//3行目から13行目までループ
for (k = 3; k <= 13; k++){
sheet.getRange(k,12).setValue('');
}
}
今回実現したいこと
・色付きのセルの数を数える
・どこかのセルを編集したら、自動で数え直しが実行される
の2点を叶えるものを作ってほしいとのご依頼でございました。
初期設定
サンプルコードをコピペして実行をする前に、初期設定として
・function setCell()
・function deleteCell()
の2つをトリガーにセットして、編集時にこの2つが動くようにしておいてください(詳細を知りたい方は動画の解説を見ていただくとわかりやすいと思います)
解説
ざっくりとした流れを説明すると、
どこかのセルを変更する→setCellが実行される→L列に関数が入力される→入力された関数(countCellsWithBackgroundColor)が実行される
という感じです。
文字では解説しづらいので、今回は全部動画で解説します。
コードの中身の解説はこちらの動画をご参照ください。
トリガーの設定の仕方については下記の動画で解説しています。
この記事がどなたかのお役に立てれば嬉しいです!
※トリガーの設定の仕方の動画が見れないです、とご連絡くださった方、どうもありがとうございました!
メールでお返事したのですが届かなかったようなのでこの場を借りてお礼申し上げます。
コメント
はじめまして。自分はVBAの入門書を読む程度の初心者です。
サンプルコードに加えてYoutubeでの解説動画まで、とても参考になりました。動画では仕組みを解説していただき、自分の作りたいシートに編集することもできました。ありがとうございました!
今回は趣味の管理シート用にこちらの記事を読ませていただいたのですが、他のVBAのページは職場での作業でも参考になるような記事ばかりでした。また伺わせていただきたいと思います。
コメントどうもありがとうございます!お役に立てたようでとても嬉しいです。
ブログを書く励みになります。本当にコメントありがとうございました!