条件に一致したセルを繰り返し探してVBAで文字色を変える方法

excel-vba Excel-VBA
スポンサーリンク

こんにちは、とりっぷぼうるです。

元々エクセルとは全く縁のない生活をしていましたが、人員不足などで少しでもデータ入力作業や集計作業を効率化するしか方法が無く、仕方がなくエクセルに取り組み始まました。

なぜならば、大きな会社ならば専用ソフトやクラウド上でデータ集計や管理を行うのでしょうけど、小さなところではそのようなお金もないのでエクセルで解決するしか方法が無いのですよね。

このような理由からエクセルに取り組み始めましたので、当然ながらエクセルの専門知識もなく、学校に通うこともできずにただ単にエクセルの書籍とにらめっこしながら取り組んでいます。

波乗りアヒル
波乗りアヒル

でも書籍のままだと実用的でないことが多く、VBAコードを組み合わせてみたら動いた!という実用例・体験談を書いています。

Excel-VBAの専門学校通学や・資格があるわけではありませんので、あくまでエラーにならずに動いてくれているVBAコードになりますので、掲載のVBAコードが同じように動く保証はできません。
実際に動いているエクセルは2009と2016です。

条件によりVBAで文字色を変更

表の中で条件に合ったセルの値の文字だけ色を変えて目立たせたいことありませんか?

もちろんワークシート上で【ホーム】➡【条件付き書式】➡【新しいルール】で条件設定したい全てのセルに設定できますが、複数となるとめんどくさいし大変ですよね。

そこでVBAを使って、ユーザーフォームに配置したコマンドボタンにVBAコードを書きこんでおけば、ボタン1回押すだけでできるので効率的ですし簡単です。

ただ単に文字色を指定するならばColorIndexでしたいセル番号を書けばいいのですが、それだけならば、下記ページに詳細を書いてあるので、ここでは省略します。

ここでやりたいことは、条件に一致したセルを繰り返し探してVBAで文字色を変える事です。

複数のセルをそれぞれ条件に合っていれば、赤色文字に変更、そうでない場合は黒色文字に変更するって感じです。

IF~ThenとFor~Nextを組み合わせる

ここでやりたいことは、表の中の特定の列(ここでは20列目)の3行目~34行目の値が「3」の時には、目立つように赤色文字に、そうでない時は黒色文字にします。

なぜ条件を付けるかというと、成績表などではデータ入力される度に点数が変わるので、常に条件に一致するとは限ら無い為です。

前回条件に合った為に赤色文字になったとしても、今回は条件に合わず黒色文字に戻したいからです。

では、実際にはこのようなVBAコード書いています。

Private Sub CommandButton1_Click()
For i = 3 To 34
If Cells(i, 20) = 3 Then
Cells(i, 20).Font.ColorIndex = 3
Else
Cells(i, 20).Font.ColorIndex = 1
End If
Next i
End Sub
  1. ユーザーフォームに配置したコマンドボタン1をクリックすると
  2. 繰り返し処理Forを使い変数は3~34を指定
  3. もし、セルi行目、20列目(T3~T34)の値が3だったら
  4. セルi行目、20列目の文字色を赤色にする
  5. そうでなかったら
  6. セルi行目、20列目の文字色を黒色にする
  7. IFステートメント終了
  8. 変数iの範囲で繰り返す
  9. マクロ記述終了

と、このようになります。

波乗りアヒル
波乗りアヒル

たったこれだけのVBAコードで、指定した範囲内の値が合致すれば赤色文字にして、異なった時は黒色文字にできちゃいます。

ちょっと応用して、成績表に組み込んで使っています

先ほどのVBAコードに付け加えたの次の内容です。

  1. いつ時点での成績表を表示するか選択する
  2. 未選択の時はメッセージを表示してエラー防止する
  3. 画面のちらつきと処理遅延を防ぐ
  4. 成績表シートに移動してシートの保護を解除
  5. 順位の並べ替えをする
  6. ユーザーフォームの切り替え
  7. 不要な行を非表示にする
  8. 文字の大きさと行の幅を調整する
  9. 表の範囲を画面の範囲内で表示させる
  10. 条件に一致したセルを繰り返し探してVBAで文字色を変える
Private Sub CommandButton1_Click()
If UserForm5.TextBox1.Value = “” Then
MsgBox “成績表を表示する週が入力されていません”
Else
ActiveSheet.Unprotect
Range(“BJ3”).Value = UserForm5.TextBox1.Value
Application.ScreenUpdating = False
ActiveSheet.Protect
Sheets(“RESULT”).Select
ActiveSheet.Unprotect
Range(“B3:V34”).Sort Key1:=Range(“U2”), Order1:=xlDescending, Key2:=Range(“K2”), Order2:=xlDescending
Application.ScreenUpdating = True
Range(“A1”).Select
Unload UserForm5
Dim LastRow As Long
Dim i As Long
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To LastRow
If Cells(i, 26) = 0 Then Rows(i).Hidden = True
Next i
Select Case Worksheets(“RESULT”).Range(“AA1”).Value
Case Is = 18
Range(“3:20”).RowHeight = 40
Range(“A3:V34”).Font.Size = 22
Case Is = 19
Range(“3:21”).RowHeight = 40
Range(“A3:V34”).Font.Size = 22
Case Is = 20
Range(“3:22”).RowHeight = 40
Range(“A3:V34”).Font.Size = 22
Case Is = 21
Range(“3:23”).RowHeight = 40
Range(“A3:V34”).Font.Size = 22
Case Is = 22
Range(“3:24”).RowHeight = 40
Range(“A3:V34”).Font.Size = 22
Case Is = 23
Range(“3:25”).RowHeight = 40
Range(“A3:V34”).Font.Size = 22
Case Is = 24
Range(“3:26”).RowHeight = 40
Range(“A3:V34”).Font.Size = 22
Case Is = 25
Range(“3:27”).RowHeight = 38
Range(“A3:V34”).Font.Size = 22
Case Is = 26
Range(“3:28”).RowHeight = 36
Range(“A3:V34”).Font.Size = 22
Case Is = 27
Range(“3:29”).RowHeight = 35
Range(“A3:V34”).Font.Size = 16
Case Is = 28
Range(“3:30”).RowHeight = 33
Range(“A3:V34”).Font.Size = 16
Case Is = 29
Range(“3:31”).RowHeight = 32
Range(“A3:V34”).Font.Size = 15
Case Is = 30
Range(“3:32”).RowHeight = 31
Range(“A3:V34”).Font.Size = 15
Case Is = 31
Range(“3:33”).RowHeight = 30
Range(“A3:V34”).Font.Size = 15
Case Is = 32
Range(“3:34”).RowHeight = 29
Range(“A3:V34”).Font.Size = 15
End Select
Range(“A1:V34”).Select
ActiveWindow.Zoom = True
For i = 3 To 34
If Cells(i, 20) = 3 Then
Cells(i, 20).Font.ColorIndex = 3
Else
Cells(i, 20).Font.ColorIndex = 1
End If
Next i
ActiveSheet.Protect
End If
End Sub
  1. コマンドボタン1をクリックしたら
  2. もしユーザーフォーム5のテキストボックス1が空欄だったら
  3. メッセージ表示「成績表を表示する週が入力されていません」
  4. そうでなかったら(入力されていたら)
  5. 現在表示しているシートの保護を解除
  6. セルBJ3にゆざーフォーム5のテキストボックス1の値を転記する
  7. 画面のちらつきと処理遅延防止する
  8. 現在表示しているシートの保護
  9. シート「RESULT」を選択
  10. 現在表示しているシートの保護を解除
  11. 表の範囲(B3~V34)を第1優先U2で大きい順、第2優先K2で大きい順に並べ替える
  12. 画面のちらつきと処理遅延解除
  13. セルA1を選択する
  14. ユーザーフォーム5を閉じる
  15. 入力済みデータの最終セルまでの処理
  16. 変数iを宣言、iは整数指定
  17. 入力済み最終セルまで1行ずつ下に調べる
  18. 最終行まで探す
  19. もしセル(i行目、26列目)の値が0だったら、その行を非表示
  20. 入力済み最終行まで繰り返す
  21. シート名「RESULT」セルAA1の値が下記条件に合ったら
  22. 条件18の時
  23. 3行目~20列目の行の高さを40に指定
  24. セルA3~V34の範囲の文字の大きさを22に指定
  25. 条件19~32は内容にているので省略します
  26. Select Case終了
  27. セルA1~V34の範囲を指定
  28. 選択範囲を全て画面に表示させる(拡大率指定なし)
  29. 繰り返し処理Forを使い変数は3~34を指定
  30. もし、セルi行目、20列目(T3~T34)の値が3だったら
  31. セルi行目、20列目の文字色を赤色にする
  32. そうでなかったら
  33. セルi行目、20列目の文字色を黒色にする
  34. IFステートメント終了
  35. 変数iの範囲で繰り返す
  36. マクロ記述終了

ちょっと長くなりましたが、簡単にいうと、「はい」を選択したら処理開始、「いいえ」を選択したら、元に戻るという事です

各コントロールまとめて転記シリーズ

ユーザーフォームを使うと配置したコントロール(テキストボックスやラベルなど)とセルとの間で値のやり取りが多くなります。

よく使うのでまとめてみました。

値の場所転記したい場所説明ページ
セルの値ラベル名VBAコード
セルの値テキストボックスの値VBAコード
セルの値コマンドボタンの表示名VBAコード
セルの値セルの値VBAコード
テキストボックス入力値セルの値VBAコード
波乗りアヒル
波乗りアヒル

成績表作成には知っておきたいExcel-VBAもくじ

ボウリングハンデキャップのつけ方
HDCPの種類はリーグのルールにより複雑に ボウリングの成績表(リーグ戦)で必ず必要になるのが、ハンデキャップ(HDCP)です。 ボウリングご予約の時に一番多く使われているのが、女性にだけハンデキャップをつけてあげることが多いですね。 だいだい何点ぐらいのハンデキャップが多いの?
ボウリングリーグ対戦表の数字を名前に自動変換する方法
リーグ戦の対戦表をエクセルで作る時、数字で表されている番号を名前に自動的に変換できると作業時間が短くなり効率的ですね。たった2つのエクセル関数を使うだけで、簡単にできるんです。今回の回戦数を入力するだけで一発変換完了。もちろんお客様にスケジュール対戦表として渡すことも簡単ですよ。
人数に応じてリーグ対戦表を自動選択する方法
複数の表があり、条件に合った表を選んで、さらにセルの値を選んで数字を名前に自動変換できると、とても便利なエクセルができますよね。ボウリングのリーグ対戦表も人数により表が異なるので、参加人数が決まったら、自動的に表を選んで対戦番号がこれも自動的に参加者名に変換されると便利で作業効率がアップして時間短縮になりますよ。
波乗りアヒル
波乗りアヒル

エクセルの勉強お疲れ様です。ちょっとひと休みしませんか?

コメント