はじめに
Excelを使っていると、
同じセルを何度も見ている
操作の途中で止まって考えている
実はF5をほとんど使っていない
……といった「操作の癖」が必ず出ます。
あるとき思いました。
これ、全部Excel側で分かってるよな?
なら逆に、
Excelを「使われる側」ではなく「評価する側」に回したらどうなるのか。
それを Excel VBA で本気で作ってみました。
作ったもの
Excelがユーザーの操作を採点するシステムです。
評価対象はデータではありません。
操作そのものです。
Excelは裏で、次のような情報を記録しています。
選択変更の回数
操作間隔(平均・最大)
無操作で止まっていた時間(=迷い)
同じセルを何度も選んだ回数
F5(ジャンプ)を使ったかどうか
作業を終えると、Excelはこう言います。
評価:62点
・操作に迷いが見られます
・同じセルを何度も確認しています
・F5を使わないのは減点です
完全に嫌な上司です。
実装の考え方
① すべての操作を拾う入口は SelectionChange
マウス操作でも、
キーボード移動でも、
必ず通るのが Worksheet_SelectionChange です。
ここを入口にすると、
ユーザー操作を偏りなく取得できます。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
modUserJudge.Judge_OnSelectionChange Me, Target
End Sub
このイベントだけで、
操作回数
操作間隔
同一セルの連打
をすべて集計できます。
② 「迷い」は無操作時間で定義する
迷いの定義は、かなり単純です。
Dim gap As Double
gap = DateDiff("s", gLastActionTime, Now)
If gap >= 8 Then
gHesitationCount = gHesitationCount + 1
End If
前回操作から一定秒数以上空いたら、
「判断に迷っていた」とみなす。
雑ですが、
実際に使うと驚くほど人間の感覚に合います。
③ ログは「見えないシート」に保存する
操作ログとランキングは、
VeryHidden シートに保存しています。
ws.Visible = xlSheetVeryHidden
ポイントはここです。
シートは 存在する
でも Excel の「再表示」には出てこない
そのため、
「_JudgeLog というシートが無いのに
その名前に変更しようとすると
『存在してます』と言われる」
という、地味に怖い挙動になります。
Excelは正しいです。
見えないだけで、ちゃんと存在しています。
④ F5を監視する(性格が悪い)
ジャンプ(F5)を使うかどうかも、
操作スタイルの差が出ます。
Application.OnKey "{F5}", "Judge_OnF5"
使わない → 減点
使う → 加点
完全に余計なお世話ですが、
評価者としては一応見ています。
ランキング機能(自分との戦い)
スコアは毎回保存し、
過去最高
前回との差
操作回数・迷い回数
を比較できるようにしました。
Excelにこう言われます。
前回よりスコアが下がっています。
地味に効きます。
なぜ MsgBox を使っていないのか
作業中に煽りたかったのですが、
MsgBox は 自動で消せません。
そのため、
UserForm
数秒表示
OnTime で自動消去
という構成にしています。
突然出て、勝手に消える。
「今の操作、迷ってますよね?」
完全に性格が悪いです。
業務効率は上がるのか?
1ミリも上がりません。
ただ、
自分の操作癖が数値で見える
無意識の迷いが可視化される
Excelとの主従関係が逆転する
という、
技術者的にはかなり面白い体験になります。
まとめ
Excelは簡単に人を評価できる
ログは想像以上に取れる
「見えないけど存在する」仕組みは普通に怖い
Excelを
便利な道具ではなく
観測者・評価者として扱うと、
VBAの遊び方が一段変わります。
おわりに
実用性はありません。
でも、こういう
役に立たない本気を作るのが楽しくて、
VBAを触っています。
▼こんなのも作ってるので読んで行ってもらえるとうれしいです
Excel VBAで進捗バーを実装する方法
