[Excel VBA] セルの文字色・背景色だけをコピーして貼り付けるマクロを作成しました
概要
この記事について
かんたんな概要と結論
文字色・背景色だけをコピペするマクロは作成できます。
こんにちは、dedeです。
この記事では、
セルや図形の持っている書式に関する各設定のうち、
色(背景色・文字色)だけを他のセル・図形にペーストするマクロについてご説明します。
作成環境
- Microsoft Office Excel 2016
やりたいこと
Excelで事務作業等をしているときに、
セルの色だけを他のセルにコピーペーストさせたい時があるかと思います。
普通に「書式の貼り付け」を行うと、
色以外の情報(文字サイズ、罫線など)も反映させてしまうため、それが不都合な場合もあります。
また、結合セルから他の結合セルにコピペする場合を考えると、
そもそも書式貼り付けをすると結合が崩れてしまうため、
使えません。
そこで、VBAの出番です。
※なお、上記ではセルについて説明しましたが、
これから説明するマクロは、
セルだけではなく図形についても同様に色のコピペが可能です。
コード
ABOUT
全体のコードは役割ごとに次のように分割されます。
- モジュール変数
- 色をコピーする関数
- 他のセル・図形に貼り付けする関数
モジュール変数
作成したモジュールの先頭で、
文字色格納用変数fontColor
と背景色格納用変数backgroundColor
を宣言します。
VBAでは色を16進数カラーコードとして取り扱うので、
変数の型はLONG型
です。
1Option Explicit
2
3Private fontColor As Long
4Private backgroundColor As Long
5
6Sub コピーする関数()
7'do something...
8End Sub
9
10Sub 貼り付けする関数()
11'do something...
12End Sub
13
コピーする関数
1Sub コピーする関数()
2 fontColor = Selection.Font.Color
3 backgroundColor = Selection.Interior.Color
4End Sub
5
貼り付けする関数
1Sub 貼り付けする関数()
2 Selection.Font.Color = fontColor
3 Selection.Interior.Color = backgroundColor
4End Sub
5
6
使用方法
まずセルを選択し、
コピー関数を実行します。
次に色をペーストしたいセル(一つのセルでもセル範囲でも)を選択し、
貼り付け関数を実行します。
実行の様子は「デモ」セクションでご説明します。
なぜこれでうまくいくのか?
上記で見る通り、
いたってシンプルな関数の組み合わせです。
コツは、
「モジュール変数に色のコードを格納すること」です。
VBAの変数にはライフサイクル(使用できる期限)が存在し、
関数の中で宣言した変数は関数が終了すると使えなくなりますが、
モジュール変数は関数終了後もメモリに格納され続けるため、
マクロが入ったExcelブックを終了するまでは使い続けることができます。
よって、コピー関数を実行した後に入れられた色のコードを使い回すことができるのです。
デモ
セルからセルにコピー
下記の図表②において、
図表①のように、3000円以上の行を黄色く塗りたいということを想定します。
①まず、コピーしたい色の情報を持ったセルを選択後、
「コピーする関数」を実行します。
②その後、
ペーストしたいセル範囲を選択し、
「貼り付けする関数」を実行します。
色の情報が正しくペーストできました。
図形から図形にコピー
図形の間の色のやり取りも可能です。
まず、下の図の「あいうえお」の図形を選択し、
コピー関数実行します。
次に、色を反映させたい「かきくけこ」「さしすせそ」の図形を選択し、
貼り付け関数を実行します。
図形においても色のコピペをすることができました。
図形からセルにコピー
最後に、図形からセルに色を反映させることもできることをデモします。
(割愛しましたが、反対に、セルから図形に色を反映させることもできます。)
反映前:
反映後:
終わりに
色だけを色々操作したいケースは、
特に結合セルが多用された図表で色を統一させたい場合に
よくあるかと思います。
ただ、よく言われていることですが、
結合セルの多用自体がアンチパターン(あまり好ましくない処理)であることも考慮するべきではあるでしょう。
本当にこのセルの構造が最適か、ということを考慮した上で使用すると、
より効果的かとおもわれます。
関連記事
- [教えて!VBA] 第2回 一つのセルの値が「東京都」であることを条件として別のアクションを行うにはどうすればいいの??
- [Excel VBA] 年度に関わらず営業日数を算出する方法について紹介
- [Excel VBA] 結合セルにコピーペーストするマクロ
- [Excel VBA] PageSetup.PrintAreaによるシートの印刷範囲の変更を行うときにエラーになる場合&その回避方法
- [VBA] Excelの複数シートをループを使わず一行の処理で非表示・再表示にすることはできる??