はもちくわ

コードについて自分なりの解釈を書いてます。

【ExcelVBA】小技5 選択された行の色を表の中だけ変える

f:id:hamochikuwa440:20220204153515p:plain


Excelでシステムっぽく見せるテクニックとして、選択した行だけ色を変えてみたいと思うことは無いでしょうか?

見やすさの向上のために・・・と言いたいところですが、こんな余分なことをするとExcelはすぐに重くなります(笑)Excel使える人同士の業務なら欄外の行番号を選択したほうが早い話です。なので、あくまで「なんとなくすごい」「システムみたいだ」と思ってもらえる目的だと思ってお使いください(笑)

 

VBAの使い方、コードの配置場所などはここでは省きますが、以前の記事で詳しく書いてますので、知りたい方はそちらを先にご覧ください。

hamo440.hatenablog.com

コードはworksheetに配置します。コード実行のキッカケは、以前の記事で使ったBeforeDoubleClickではなく、SelectionChangeを使います。VBAのプロジェクトエクスプローラーで仕組みを入れたいシートを選んでSelectionChangeを選択してください。コードを書くエリアが勝手に出てくると思います。

このSelectionChangeにコードを書くと、シート上でセルの選択が変わるたびにコードが実行されます。それはコードで選択を変更しても適用され、実際に選択を変更したときと同様にコードが実行されます。そのため、使い方を謝ると永久ループに陥ることがあるのでOffset(移動行,移動列)などを使って.Selectで選択を変えたときは気をつけましょう。

別件ですが...
この永久ループを回避するにはApplication.EnableEvents のFalseとTrueでコード内のセル選択部分を挟んでやれば回避できます。

 

それでは実際に例をあげて書いてみます。まず、表は次のような表にします。

f:id:hamochikuwa440:20220204155749p:plain

このA4〜D13範囲の表の中だけで選択した行の色を変えます。

コードはこちらです。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Application.ScreenUpdating = False

Dim r As Integer as c As Integer

With Target

	r = .Row
	c = .Column
	
	Range(“A4:D13”).Interior.ColorIndex = 36
	Application.ScreenUpdating = True
	Application.ScreenUpdating = False
	
	If r >= 4 And c >= 1 And r <= 13 And c <=4 Then
		Range(“A” & r & “:D” & r ).Interior.ColorIndex = 37
		Application.ScreenUpdating = True
		Application.ScreenUpdating = False
	End If

End With

Application.ScreenUpdating = True

End Sub

コードに合わせて解説しますと、

f:id:hamochikuwa440:20220204165422p:plain

 

となります。
これで、表の中だけ限定で選択した行の色が青色に変わり、選択が変わると色も選択についていきます。選択セルが表から外れると、色ももとに戻ります。
色の細かな設定はインデックス番号を変えてください。PCによって少し色がずれるかもしれません。またこれは表エリアで設定していますが、行や列すべてを設定する場合ですと、もう少し簡単なコードになります。(簡単に下で補足します)

また、今回のサンプルはRangeの中で文字列を作って指定していますが、Rangeは割と優秀で、Range(Cells(r,1),Cells(r,4))という感じにセルで指定もできます。(こっちのほうが正式な使い方なので処理(動き)が早いと思います。)

シートの行、列すべてを選択する場合
上のコードのこの箇所を
Range(“A” & r & “:D” & r ).Interior.ColorIndex = 37
・行なら
Rows(r).Interior.ColorIndex = 37
・列なら
Columns(c).Interior.ColorIndex = 37
となります。
ただ、このサンプル内では、表の中の色を戻すポイント
Range(“A4:D13”).Interior.ColorIndex = 36
で工夫が必要です。同じように表の中の色を変えてあるなら、このコートの前にシート全体色を塗りつぶしなしに変えて、表の色を改めて指定するか、他の色を塗りつぶしなしにするなどの処理が必要です。もしシート全体を指定するならRange(“A4:D13”)Cellsにすればよいです。

 

これができると、データが見やすくなって便利そうなのですが、少し動きがカクカクします。

Application.ScreenUpdatingは無くても動きますが、無いと画面がチカチカするかもしれません。

こうしたことから、表へたくさんのレコードデータを入力するには向いていません。結果、動きがトロすぎてストレスしか与えません(笑)
なので、使うとしたら、たくさんのデータの中からの照合確認作業ぐらいではないでしょうか?

なので、、、機能追加、実装はそういったことを加味して判断してください!