条件によりVBAで文字色を変更
表の中で条件に合ったセルの値の文字だけ色を変えて目立たせたいことありませんか?
もちろんワークシート上で【ホーム】➡【条件付き書式】➡【新しいルール】で条件設定したい全てのセルに設定できますが、複数となるとめんどくさいし大変ですよね。
そこでVBAを使って、ユーザーフォームに配置したコマンドボタンにVBAコードを書きこんでおけば、ボタン1回押すだけでできるので効率的ですし簡単です。
ただ単に文字色を指定するならばColorIndexでしたいセル番号を書けばいいのですが、それだけならば、下記ページに詳細を書いてあるので、ここでは省略します。
ここでやりたいことは、条件に一致したセルを繰り返し探してVBAで文字色を変える事です。
複数のセルをそれぞれ条件に合っていれば、赤色文字に変更、そうでない場合は黒色文字に変更するって感じです。
IF~ThenとFor~Nextを組み合わせる
ここでやりたいことは、表の中の特定の列(ここでは20列目)の3行目~34行目の値が「3」の時には、目立つように赤色文字に、そうでない時は黒色文字にします。
なぜ条件を付けるかというと、成績表などではデータ入力される度に点数が変わるので、常に条件に一致するとは限ら無い為です。
前回条件に合った為に赤色文字になったとしても、今回は条件に合わず黒色文字に戻したいからです。
では、実際にはこのようなVBAコード書いています。
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をクリックすると
- 繰り返し処理Forを使い変数は3~34を指定
- もし、セルi行目、20列目(T3~T34)の値が3だったら
- セルi行目、20列目の文字色を赤色にする
- そうでなかったら
- セルi行目、20列目の文字色を黒色にする
- IFステートメント終了
- 変数iの範囲で繰り返す
- マクロ記述終了
と、このようになります。
たったこれだけのVBAコードで、指定した範囲内の値が合致すれば赤色文字にして、異なった時は黒色文字にできちゃいます。
ちょっと応用して、成績表に組み込んで使っています
先ほどのVBAコードに付け加えたの次の内容です。
- いつ時点での成績表を表示するか選択する
- 未選択の時はメッセージを表示してエラー防止する
- 画面のちらつきと処理遅延を防ぐ
- 成績表シートに移動してシートの保護を解除
- 順位の並べ替えをする
- ユーザーフォームの切り替え
- 不要な行を非表示にする
- 文字の大きさと行の幅を調整する
- 表の範囲を画面の範囲内で表示させる
- 条件に一致したセルを繰り返し探してVBAで文字色を変える
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をクリックしたら
- もしユーザーフォーム5のテキストボックス1が空欄だったら
- メッセージ表示「成績表を表示する週が入力されていません」
- そうでなかったら(入力されていたら)
- 現在表示しているシートの保護を解除
- セルBJ3にゆざーフォーム5のテキストボックス1の値を転記する
- 画面のちらつきと処理遅延防止する
- 現在表示しているシートの保護
- シート「RESULT」を選択
- 現在表示しているシートの保護を解除
- 表の範囲(B3~V34)を第1優先U2で大きい順、第2優先K2で大きい順に並べ替える
- 画面のちらつきと処理遅延解除
- セルA1を選択する
- ユーザーフォーム5を閉じる
- 入力済みデータの最終セルまでの処理
- 変数iを宣言、iは整数指定
- 入力済み最終セルまで1行ずつ下に調べる
- 最終行まで探す
- もしセル(i行目、26列目)の値が0だったら、その行を非表示
- 入力済み最終行まで繰り返す
- シート名「RESULT」セルAA1の値が下記条件に合ったら
- 条件18の時
- 3行目~20列目の行の高さを40に指定
- セルA3~V34の範囲の文字の大きさを22に指定
- 条件19~32は内容にているので省略します
- Select Case終了
- セルA1~V34の範囲を指定
- 選択範囲を全て画面に表示させる(拡大率指定なし)
- 繰り返し処理Forを使い変数は3~34を指定
- もし、セルi行目、20列目(T3~T34)の値が3だったら
- セルi行目、20列目の文字色を赤色にする
- そうでなかったら
- セルi行目、20列目の文字色を黒色にする
- IFステートメント終了
- 変数iの範囲で繰り返す
- マクロ記述終了
ちょっと長くなりましたが、簡単にいうと、「はい」を選択したら処理開始、「いいえ」を選択したら、元に戻るという事です

Excel-VBAを使えば数分かかる作業がたったの1秒で終了しますよ!
コメント