エクセル実践塾 > エクセル実践塾2016

Shiftキー+クリックで、 セル範囲を帯状に塗りつぶしたい

 

GetKeyState 関数を使ったマクロで、実行可能です

GetKeyState 関数は、Windows API の一部で、指定したキーの現在の状態(押されているかどうか、およびトグル状態かどうか)を取得するための関数です。

このGetKeyState 関数を使って、Excel VBA の Worksheet_SelectionChange イベントで、ユーザーがセルを選択したときに発動するマクロを作ります。

このマクロを作成すると、Shiftキーが押されているときに、選択されたセル範囲を A列の対応する行の色で塗りつぶす 処理が行われるようになります。

はじめに、次のようなコードで、GetKeyState 関数を呼び出しておきます。


#If VBA7 Then

 Private Declare PtrSafe Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer

#Else

 Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer

#End If

続けて、Worksheet_SelectionChange イベントで、次のようなマクロを記述します。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

 Dim KeyState As Integer

 Dim FillColor As Long

 Dim rng As Range

 Dim RowNum As Long

 

 ' Shiftキーが押されているかを確認

 KeyState = GetKeyState(vbKeyShift) And &H8000

 If KeyState = 0 Then Exit Sub ' Shiftキーが押されていない場合、何もしない

 

 ' 選択されたセルの行番号を取得

 RowNum = Target.Row

 

 ' A列の同じ行のセルの塗りつぶし色を取得

 FillColor = Me.Cells(RowNum, 1).Interior.Color

 

 ' 塗りつぶし色が設定されている場合

 If FillColor <> RGB(255, 255, 255) Then ' 白色の場合は塗りつぶしをしない

  ' 選択範囲を取得

  Set rng = Selection

 

  ' 選択範囲をA列の色で塗りつぶす

  Application.EnableEvents = False ' 無限ループ防止

  rng.Interior.Color = FillColor

  Application.EnableEvents = True

 End If

End Sub

 

@Shiftキー+クリックで、帯状にセルを塗りつぶしたいシートをダブルクリックして、そのシートモジュールに左図のようなマクロを記述します

 

 

 

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Worksheet_SelectionChange は、シートでセルを選択したときに自動的に呼び出されるイベントです。

Target は、選択されたセル範囲を表す Range オブジェクトです。この Target を使って、選択されたセルや範囲に関連する処理を行います。

 Dim KeyState As Integer

 Dim FillColor As Long

 Dim rng As Range

 Dim RowNum As Long

 

KeyState は Shiftキー の状態を格納するための変数です。

FillColor で A列の同じ行のセルの塗りつぶし色 を格納します。

rng は 選択範囲(Selection)を格納するための変数です。

RowNum は選択されたセルの行番号を格納する変数です。

 ' Shiftキーが押されているかを確認

 KeyState = GetKeyState(vbKeyShift) And &H8000

 If KeyState = 0 Then Exit Sub ' Shiftキーが押されていない場合、何もしない

 

GetKeyState(vbKeyShift) で Shiftキーの状態を取得し、その 最上位ビット(ビット15) を調べて、Shiftキーが押されているかどうかを確認します。

&H8000 は、Shiftキーが押されている場合に最上位ビットが 1 であることを意味します。

KeyState = 0 の場合、Shiftキーが押されていないことを意味し、その場合はマクロを終了して何もしません。

 ' 選択されたセルの行番号を取得

 RowNum = Target.Row

 

Target.Row で、選択されたセル範囲の最初のセルの行番号を取得します。

これを RowNum に格納します。

 ' A列の同じ行のセルの塗りつぶし色を取得

 FillColor = Me.Cells(RowNum, 1).Interior.Color

 

Me.Cells(RowNum, 1) は、現在のシート(Me)の A列の RowNum 行目 のセルを指します。

ここでそのセルの塗りつぶし色(Interior.Color)を取得して FillColor に格納します。

 ' 塗りつぶし色が設定されている場合

 If FillColor <> RGB(255, 255, 255) Then ' 白色の場合は塗りつぶしをしない

RGB(255, 255, 255) は 白色 を表します。

この行では、A列のセルに塗りつぶし色が設定されているかを確認しています。

もし白色であれば塗りつぶしは行いません。

  ' 選択範囲を取得

  Set rng = Selection

 

Selection は現在選択されているセル範囲を指します。

これを rng にセットします。

  ' 選択範囲をA列の色で塗りつぶす

  Application.EnableEvents = False ' 無限ループ防止

  rng.Interior.Color = FillColor

  Application.EnableEvents = True

 End If

End Sub

Application.EnableEvents = False

イベント処理を無効にします。

これにより、セルが塗りつぶされたときに再度 SelectionChange イベントが発生することを防ぎます。

無限ループを避けるための措置です。

rng.Interior.Color = FillColor

選択された範囲(rng)のセルを A列の同じ行の色(FillColor)で塗りつぶします。

Application.EnableEvents = True

塗りつぶし処理が終わった後、再びイベント処理を有効にします。

Aマクロを定義したシートで、Shiftキー+クリックすると、A列の塗りつぶし色で、セルが塗りつぶされるようになります

   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 

 

●A列のセルと同じ色で塗りつぶされているセルの個数を表示する、 ユーザー定義関数を作る動画です

関連する他のページ

労働時間を計算するユーザー定義関数を使って、 残業時間を求めるユーザー定義関数を作りたい
既存のユーザー定義関数は、 別のユーザー定義関数内で実行して、 その結果を利用することができます

選択したセル範囲のデータから、一意のものを取り出したい
マクロなら可能です

選択したセル範囲のデータを、一列にまとめたい
10行程度のマクロでも行えます

組み合わせ一覧を表示するマクロを、 要素数と選び出す数を自由に指定できるものにしたい
入れ子構造のマクロでは汎用的にできないので、 再帰処理を使ったマクロにします

ABCの観点別評価の組み合わせパターンを知りたい
入れ子構造のマクロで求めることができます

ドロップダウンリストで選んだデータを、 選んだ直後に、 対応する別データに置換して入力したい
セル値の変化を監視するマクロで実行できます

置換リストを使って、 複数の置換をまとめて行いたい
10行程度のマクロで、 置換リストを使った一斉処理が可能です

セルに入力されている文字列を、そのシート名にしたい
簡単なマクロで実現できます

マクロ実行の対象範囲を固定したい
セルやセル範囲は、 Rangeで指定できます

選択中のセル範囲に含まれる空セルを、 マクロ処理の対象から除外したい
空セルでないことを条件に、 マクロを実行するよう、 If文を追加します

選択中のセル範囲に対してのマクロ実行結果を、 別のセルに表示したい
Offsetを使うと、 対象のセルの位置を行列単位でずらすことができます

選択中のセル範囲に対するマクロを作りたい
For Each〜Nextで、 選択中のセル範囲(Selection)に対する処理を記述します