成績表の中から最高点を探して文字色変更や別のセルに書き出す方法
テストの成績表で各科目の点数の中から最高点を探す作業を、目で見て探して色を変更するのが面倒だと思って何かいい方法がないか?と探していますよね。
西船ボウルのリーグ成績表でも、参加者全員の各ゲームのスコアーの中からハイゲーム(HG)を一瞬で見つけ出す方法として、エクセルVBAを使って自動化しています。
- VBA関数「WorksheetFunction」
- 検索「Find」
- 文字色「Font.Color」
たった6行だけの短い簡単なVBAコードを書くだけで、コマンドボタンを1クリックで一瞬でハイゲームを見つけ出してくれるので、あっという間にスタンディングが終わりますよ。
最高点を探して文字色変更
上の図のようにボウリング成績表があり、赤枠の中が参加者全員のボウリング3ゲームのスコアー全てです。
ここでは、自動的に赤枠のセルの範囲の中からハイゲーム(最高点)を見つけ出して、スコアーを赤色文字にするエクセルVBAコードをコマンドボタンに登録します。
HGを探して色付け
エクセルVBAでは、ハイゲーム(最高点)言い換えれば、「一番大きな数字」を探すのでMAX関数をVBAバージョンで使用して、一旦格納。
格納した数字のセルの場所を探して、見つけたら赤色文字にする流れです。
次のようにエクセルVBAコードを書くと、自動的にセルC2からセルE8までの範囲の中から最大値を探して、見つけたら文字色を「赤色」に変更してくれます。
Sub ハイゲーム()
HG = WorksheetFunction.Max(Range(“C2:E8”))
Dim i As Range
Set i = Range(“C2:E8”).Find(What:=HG, LookAt:=xlWhole)
i.Font.Color = RGB(255, 0, 0)
End Sub
では1行目から解説じゃ
- 「ハイゲーム」というタイトルでマクロ宣言
- 値「HG」は、セルC2~E8の範囲内の最大値を格納(見つけたハイゲームスコアー)
- 変数「i」Dimで宣言
- 「i」はセルC2~E8の範囲内で、格納値「HG」があるセル番地を指定する
- 指定したセル番地「i」の文字色を「赤色」にする
- マクロ記録終了
ポイントは、エクセル関数で最大値を見つけるのは「MAX関数」で、ワークシート上で数式を使うと…
ですが、エクセルVBAで使うと…
と、このように変わりますが、内容は一緒です。
では、次に見つけたHGのスコアーを別のセルへ記載させましょう。
HGを別のセルへ記載する
実は、HGを見つけて色を変えるよりも、別のセルに書き出す(記載する)VBAコードの方が簡単です。
次のようにエクセルVBAコードを書くと、自動的にセルC2からセルE8までの範囲の中から最大値を探して、セルB16へ書き出します。
Sub ハイゲーム書き出し()
Range(“B16”).Value = WorksheetFunction.Max(Range(“C2:E8”))
End Sub
色付けと異なり、「格納値」の部分を「書き出すセル番地」に書き換えただけで完成なので、変数や格納とかが不要になったので、とてもシンプルなエクセルVBAコードになりました。
実際にこんな使い方しないでしょ!書き出したら、選手名も書き出すでしょ、足りないんじゃない!!
HGを探して名前と点数を書き出す
西船ボウルのリーグ成績表では、スコアーを入力していくと自動的にHG・HSなどを探し出して、セルに選手名とスコアーを表示するようになっていますので、自分の目で探すことはありません。
実際の成績表ではHGやHSのセル行があるので、HG列(G列)に各選手のHGを表示しておいて、自動的にセルG列の中から最大値を探して、誰のスコアーなのかも探して、セルB16へスコアー、セルA16へ名前を書き出します。
Sub ハイゲーム書き出し()
HG = WorksheetFunction.Max(Range(“G2:G8”))
Dim i As Range
Set i = Range(“G2:G8”).Find(What:=HG, LookIn:=xlValues)
i.Select
Range(“B16”).Value = i
Range(“A16”).Value = ActiveCell.Offset(0, -6).Value
If WorksheetFunction.CountIf(Range(“G2:G8”), i) >= 2 Then
MsgBox “重複”
Else
End If
End Sub
では1行目から解説じゃ
- 「ハイゲーム検索書き出し」というタイトルでマクロ宣言
- 値「HG」は、セルG2~G8の範囲内の最大値を格納(見つけたハイゲームスコアー)
- 変数「i」Dimで宣言
- 「i」はセルG2~G8の範囲内で、格納値「HG」があるセル番地を計算式の値で指定する
- 指定したセル番地「i」を選択する
- セルB16にセル番地「i」の値を書き出す
- セルA16に選択中のセルから左へ6個目のセルの値を書き出す
- もしハイゲームが2人以上いたら
- 重複とメッセージ表示
- そうでなかったら何もしない
- Ifステートメント終了
- マクロ記録終了
ポイントはFind(What:=HG, LookAt:=xlWhole)の部分で、格納したハイゲームスコアー「204」は文字ですが、G列は計算式で表した値です。
そのまま使用してしまうと、同じ204とセルに表示されているけど文字と値は異なるので、検索不能となりマクロエラーになります。
またハイゲームが2人いる場合もあるので、重複した場合のみメッセージ表示して名前を手入力しています。
HGと同じ方法でセル番地だけ変えれば、ハイシリーズ(HS)を探すことも簡単ね!
今回は、サンプルの為に8名にしていますが、通常のリーグ戦の参加者は20名~30名なので、この中からハイゲーム(最高点)を探し出して、該当者の名前も探すのはとても大変で、VBAの知識がない時は目で見て探していたのでよく間違えたのもでしたね。
もちろん上記以外にも内容は同じでもVBAコードの書き方は他にもありますので、実際にボウリングリーグ成績表で使っているエクセルVBAコードを参考にしてくださいね。
コマンドボタン1クリックで、男女別HG、HS、AVE TOP3なども一瞬で見つけ出して書き出すから仕事が早いのぉ~
ボウリング成績表で必須のVBAコード
エクセルのボタンの配置方法やリボンツールバーの「開発」設定がまだの場合、この機能使えないので設定から始めましょう~
西船ボウルで使用しているエクセルで作っているリーグ成績表(スタンディング)で、必ず使っているVBAコードです。
実際にはワークシート上にコマンドボタンを配置せず、専用の入力フォームも(ユーザーフォーム)作成してフォーム上にボタンなどを配置しています。
成績表作成でよく使う便利機能
エクセルファイル操作の便利機能