適材適所

システム屋のくらげが気ままに書いているブログです。PowerShellやVBAなどプログラミング系の話をメインに書いています。

MENU

【Excel VBA】色が付いているセル・色が付いていないセルを選択する

セルの色を変えたいのだけれども、既にセルに色が付いているところはそのままにしておきたい!!

セルの色が付いていないセルだけ、選択してセルの色を変えたい!!

よし、まずはセルの選択だ!!

な、ない!?

f:id:shinmai_papa:20211014100015p:plain

そんなぁ・・・地道に選択していくしかないんかぁ・・・

いえいえ、そんなことはありません。

そんなときに役立つVBAのコードをご紹介いたします。

検証した環境

Windows10
Excel2019

色の付いたセルを判別するVBAコード

まずは、色の付いたセルと色の付いていないセルを判別できなければ始まりません。

下記のコードは、使われているセル範囲の中で色の付いていないセルを判別してイミディエイトウィンドウにアドレスを表示するコードです。

 
Sub WriteColorLessAddress()
   Dim rng As Range
   '色の付いていないセルだけを判別してアドレスを表示する
   For Each rng In WorkSheets(1).UsedRange
      If rng.Interior.ColorIndex = XlColorIndex.xlColorIndexNone Then
         Debug.Print rng.Address
      End If
   Next rng
End Sub

ポイントは、XlColorIndex.xlColorIndexNone定数です。

これは、ColorIndexプロパティで、色が付いていないよーという状態を表す定数です。

ちなみにその定数の中身は10進数で言うところの-4142という数字です。

イミディエイトウィンドウで下記のように書いてエンターを押すと中身が-4142であることを確認することができます。

 
?XlColorIndex.xlColorIndexNone

この定数とColorIndexプロパティを比較しています。色の付いていないセルなのでイコールのときですね。ここを不等号(<>)にすれば色の付いているセルだけを判別することができます。

下記のWorkSheets(1)の部分はご自身の環境に合わせて適宜変更してください。

 
For Each rng In WorkSheets(1).UsedRange

色の付いたセルだけを選択するVBAのコード

色の付いたセルを判別するコードを応用して、色の付いたセルだけを選択するコードに書き換えます。

 
Sub SelectColorLessCells()
   Dim colorlessRange As Range
   Dim rng As Range
   '色の付いていないセルだけを判別する
   For Each rng In Worksheets(1).UsedRange
      If rng.Interior.ColorIndex = XlColorIndex.xlColorIndexNone Then
         If colorlessRange Is Nothing Then
            Set colorlessRange = rng
         Else
            Set colorlessRange = Union(colorlessRange, rng)
         End If
   End If
   Next rng
   colorlessRange.Select
End Sub

書き換えたところは次のところ。

 
If colorlessRange Is Nothing Then
   Set colorlessRange = rng
Else
   Set colorlessRange = Union(colorlessRange, rng)
End If

Unionはセル範囲を結合してくれる便利なメソッドです。

ただし。UnionにNothingなセル範囲を指定してしまうとエラーになってしまいます。

colorlessRange変数は最初はNothingなので、Nothingを判定して、Nothingの場合はrngをセットしてあげています。

要するに最初のときだけUnionせずにrngをセットしてますよということです。最初からそう書けよって感じですね。

ここまでできればあとは最後にSelectしてあげるだけです。

これを実行すれば、色が付いていないセル範囲だけを選択することができます!!

先ほども書いた通り、

 
rng.Interior.ColorIndex = XlColorIndex.xlColorIndexNone

ここが=なら色が付いていないセル、<>なら色が付いているセルが選択できるようになります。

終わりに

色の付いていないセルだけを選択するVBAのコードについて解説しました。

多分、将来Excelがバージョンアップすることでセルの選択機能がパワーアップしてこのコードも不要になる日が来るでしょう。

それまで、がんばれ、このコード!!

というわけで、ここまでお読みいただきありがとうございました。