課題チャレンジ共有会 第2回 「最も近い色を見つけよう!」 提出物解説 (Excel VBA)
- yuji fukami
- 1月15日
- 読了時間: 3分
<概要>
2025年1月11日に開催されたExcel VBA関連のイベントでの当方で提出した回答について簡単に解説いたします。

今回のようなイベント等は下記Discordコミュニティにて通知があったりしますので、ぜひご参加ください👍
過去の課題の内容や、集まった回答なども確認できます。
<課題の解説>
今回のイベントでの課題は次のようなものでした。
まず、次の表のようにVBA組み込みのXlRgbColor定数一覧がまとまっています。

次に、特定の色を指定(例:セルの塗潰し)された状態でそのセルの色に最も近い色を、上記の表の色の中から算定する。というのが課題となります。
<提出した回答>
提出した回答を解説します。
まず基本機能は次のようになっています。
①セルの塗潰色で色を指定
②「近い色取得」ボタンをクリック
③結果が表示される
の簡単な仕様となっています。

「近い色取得」ボタンに登録されているマクロのトッププロシージャを参考に載せておきます。コード全体は本記事の最後と、記事に添付してあるファイルのダウンロードで中身確認をよろしくお願いします。

コーディングのポイントだけ解説します。
・処理の流れは「入力」「処理」「出力」でまとめる。「入力」→「情報取得」、「処理」→「一番近い色をRGB値の二乗差で見つける」、「出力」→「決定した色の情報出力」。こうすることでコード全体の見通しを立てやすくする。
・「近い色の探索」にはRGB値の3つの値の二乗差(ユーグリット距離)が最も小さいものとする。ほかにHSL、Lab、CIEDE2000などのあるので興味のある方は調べてみてください。
・関数名、変数名は日本語を利用して可読性、保守性を担保する
・セルの参照は名前定義を利用することで、シートのフォーマット変更に強い仕様とする。
・色のRGB値はユーザー定義型(構造体)を利用してコーディングしやすく、可読性を担保。
・持ち前の汎用プロシージャを利用してコーディングを効率化する
<提出した回答(おまけ機能)>
上記の回答だけだと面白味にかけるので、おまけ機能をいくつか追加しました。
○カラーパレットからの入力
自作のカラーパレットを利用して、セルの塗潰色の変更を効率化しています。
Excel標準機能のセルの塗潰しだと、1つ色の変更に毎回ダイアログなどの表示が必要になってきますが、この機能を用いればユーザーフォームが起動中の間にいろいろな色に変更ができたりします。
○近い色で並び替え

「近い色で並び替え」ボタンでRGB値の二乗差が小さい順に並び替えた表を出力します。実際にどの色が近い順として計算されているかを可視化できます。
○アニメーション
入力する色を徐々に変化させて、同時に近い色が順次変化していきます。
「停止」ボタンで停止させることもできます。
参考にコードも載せておきます。

・「アニメーション」が実行中を「停止」ボタンで止めている処理の実現にはループ内をDoEventsを記述しておいて、Private変数のPri_JudgeStopの値を「停止」ボタンで「False→True」と変更することで停止させています。この処理は実際の現場での実装でも役に立つ処理で、例えば「複数アドレスへのメールの一括送信」を途中で止めたいなどで同様の処理を利用したりします。
・アニメーションでの色の変化はRGBの3つの値をそれぞれ三角関数で周期をずらして変化させています。
<コード>
「近い色取得」ボタンに登録してあるプロシージャの全体コードを記載しておきます。
より詳細は記事に添付してあるファイルを確認してみてください。
階層構造

Comments