「Excel」の背景色をVBAで簡単にコピーする方法

 

( ノ゚Д゚)こんばんは、こんにちは、おはようございます。おやすみなさい! とっちーです。

 

以前作成した56色の色パレットに表示されている色の情報を取得して、違うセルにその色の情報をコピーすることが出来ないかなって思いながら、お絵かきソフトを作ってみました。

ちなみに1セル対応のみです。

InputBoxを使っての背景色の取得とコピーをするには、どうしたらいいのか!そんな感じで見てもらえれば、うれしいです。

参考になるコードがあればどうぞお使いください。

以下は動作確認動画になります。

 

 

セルの背景色をコピーする方法

 

以前56色をセルに配色したときに使用したのは、ColorIndexプロパティを用いて行いました。

「Excel]VBAでセルの背景色(56色)をセルに表示させる方法

2018年10月12日

今回は、Colorプロパティを用いて色の選定をしてみます。

色は「Red」「Green」「Blue」のそれぞれの色の割合で作成されているのですが、その色の割合をRGB関数を用いて取得しようという試みです。

 

RGB関数の引数は、長整数型(Long)になります。

 

構文

RGB(Red,Green,Blue)

Red,Green,Blueのそれぞれの引数の値は0~255の整数で設定できます。

セルの色を取得したあとにRGBの引数へ変換するコードを作成してみます。

 

まず、Colorプロパティがセルから取得するときの値は、Long型の長整数です。

その値をRed,Green,Blueにそれぞれ配分する計算方法が次のようになります。

Red=「Colorプロパティがセルから取得するときの値」 MOD 256

Green=Int(「Colorプロパティがセルから取得するときの値」 / 256 ) MOD 256

Blue=Int(「Colorプロパティがセルから取得するときの値」 / 256 /  256)

例えばColorIndexでの2は赤色なのですが、RGBではRGB(255,0,0)になります。

 

セルの背景色に色を取得する

 

Range(“A1”).Interior.Color =RGB(255,0,0)でセルの背景色を設定できます。

ということは変数を宣言してその中にセルの色情報を代入すれば取得できることになります。

Dim CNB As Long ’セルから獲た色を代入する

Dim TNB  As RGB_S ’ユーザー定義型で宣言する

Dim RRR As Long ’取得した色データを振り分ける
Dim GGG As Long
Dim BBB As Long

 

Dim ERA As Range ’色を取得したセルの位置を取得するのと繰り返し処理の判断に
Dim ARA As Range ’活用するオブジェクトを宣言

Dim SRA As Range ’色を受け渡すセルの位置を取得するためのオブジェクト宣言
Dim SSS As String ’取得したセル位置の名前を変換するため

       CNB = Range(“A1”).Interior.Color 

 

そして、代入された値を一度RGB関数に変換します。(RGB関数の使い方をマスターするために!)

 

まずはじめにType~End Typeでユーザー定義型を作る。

コードになります。

 

こちらは標準モジュールへ記述してみましょう。

RGBのそれぞれR・G・Bの変数宣言のデータ型はByte型になります。0~255までの整数が代入できます。

また、真偽の判断も宣言しておきます。MATUKOの変数宣言は、データ型はBoolean型になります。TrueかFalseが代入できます。

次にRGBに変換するためのコードをFunctionプロシージャでC_RGBを作成します。

コードになります。

 

先ほどセルから色の値を代入したCNBをC_RGB(CNB)と記述して計算をします。導き出された値を変数TNB(ユーザー定義型RGB_S)に代入します。

With~End With文を用いてRed,Green,Blueに値を代入します。

With TNB

  RRR = CLng(.R)
  GGG = CLng(.G)
  BBB = CLng(.B)

End With

セルから取得した色情報を他のセルへ引き渡す

 

[引き渡したいシートの名前].Cells(行,列).Interior.Color = RGB(RRR, GGG, BBB)で引き渡すことが可能になります。

 

元の色を取得する!取得した色を引き渡す!

 

Application.InputBoxを使って、元のセルと引き渡し先のセルの位置を取得します。

今回のコードを記述する場所

 

ワークシート上の選択範囲が変更された場合に呼び出すことが出来るメソッド「Worksheet_SelectionChange」になります。

 

SelectionChange」は、選択範囲が変更されたときにイベント発生させるプロシージャになります。

今回の色の取得や再配置の行う場合、選択範囲の変更が有効活用できますので使用したいと思います。

プロシージャーの作成方法は、VBA「(Alt)キーと(F11)キーを押して起動させるアプリケーション」のプロジェクトウインドウ内のシートのいづれか(Sheet1など)をダブルクリックしてください。

 

 

次にオブジェクト欄で「Worksheet」を選択します。

 

 

すると、自動的にPrivate Sub Worksheet_SelectionChange(ByVal Target As Range)が作成されます。

 

 

このPrivate Sub Worksheet_SelectionChange(ByVal Target As Range)~End Sub内に書いたコードはシートオブジェクトが選択されるたびに反応しますので、記述の際はどこかの空きセルに判断キーを設置し、さらにコードで判断するようにすると反応しなくなる方法がございます。

 

 

今回は、Functionプロシージャも同様のシートオブジェクトにコードを書いてみましょう。

 

なお、Type~End Typeでユーザー定義型は標準モジュールを作成し、その中に記述しmしょう。

 

 

 

プロシージャをボタンで動かしたい!

 

Excelシート上にボタンを設置して押してみませんか?ポチって!その方法になります。

Excelシートのリボン内の開発タブにあるデザインモードを左クリックしてみましょう。

 

 

次に、その左側にある挿入を左クリックするとフォームコントロールとActiveXコントロールの選択メニューがあらわれます。

ActiveXコントロールのコマンドボタンを選択しましょう。

 

 

マウス+ポインタをExcelシート上の任意の場所に移動させて、左ボタンを押しながらドラッグ(例えばマウスを右下へ動かしてみる)してみましょう。

CommandButton1と書かれたものが出現したと思います。今回は、これがシート上でプロシージャをポチって動かすことが出来るボタンになります。

 

 

実行したいコードは、SubとEnd Subの間に記述しましょう。

 

 

コマンドボタンに表示されている”CommandButton1”は変更可能です。プロパティのCaptionの部分を変更してみましょう。

また、オブジェクト名を変更するとコードを記述する時に判断しやすくなります。

 

 

 

ExcelのVBAでセルの背景色をコピーしてみることにした。

 

以下、作成したコードすべてになります。なお、わざわざ変換してしなくてもいいコードもありますが、初心者向けの新しい発見をしていただくためのコードです。

コマンドボタンのオブジェクト名やCaptionも変更しております。なにか役立てるものがあるといいな!

 

修正済み2018/10/16

 

コードを何かに使ってみようかなって思っていただけた方へ、Type~End Typeでユーザー定義型も必要なので忘れないでください。

 

説明書

 

簡単な説明書になります。

 

 

コマンドボタンなどシートに対し同様に設置した場合の使用法になります。

 

①ファイルを開いた時は、お絵かきをするもしくは色を選択しない限り動かないコード(セルA1に”END”が表示されていると停止状態にしている)になっています。

 

②どちらかを押すと”END”が消えます。色の選択が出来て、違うセルに色のコピーが出来るようになります。

 

 

③色ボタンやお絵かきをするボタンを押した場合④お絵かき範囲の左上のセルを選択するようにしています。

 

⑤お好きな色を56色の色の部分から選択して左クリックしていただくと、InputBoxが表示され色の選択のYorNを聞いてきますので、「OK」か「キャンセル」で答えてください。

 

もしOKなら⑥のように「OK」ボタンを左クリックしてください。

 

 

すると⑦のようにA1セルが初期値の状態でダイアログが表示されます。

 

⑧選択した色を使いたいセルを選択して「OK」ボタンをクリックしてみてください。⑨のように最初にパレットで選択した色が、コピーされましたね。

 

⑩は作業を終了したいときに、⑪は最初から書き直したいとき用に作ってみました。⑪は押してもYorNで聞いてくるようにしています。

 

Nの場合は、作成した画像は消えませんがYは消えてしまいます。そして戻らないです。そんなコードになりますが、何かのヒントになればいいかな!

 

長い文章になりました。長々と目を通していただきまして誠にありがとうございます。

 

 

まとめ

 

今日は、Typeステートメントとファンクションプロシージャとコマンドボタンをを作成してお絵かきソフトもどきを作ってみました。

 

コードの組み合わせ次第で何でも出来るんだなって思っていただければうれしいです。

 

型枠が決まっていると、後は中身を変更するだけなので便利です。

 

VBAは難しく考えず、短く綺麗に、コードウインドウにありがとうねって声をかけながら作ってみると、案外うまく出来るかも。