👀

VBAで予約システム作ってみた

2024/02/23に公開

目的

アルバイトである娯楽施設で働いているのだが,その中で貸出するのに遊具の鍵を渡さなければならない.パソコンでこの台は何時に貸し出し,何時に返却されるかを管理をパソコンでエクセルにより行われていた.当然全ての台が貸し出されている時に遊びたいとお客様に言われた時貸出の予約をしなければならない.しかしその予約は大きな紙に手書きで書き込む方法をとっていた.これでは紙が勿体無いし,何より使い勝手が悪く見落しが起きる可能性がありお客様とのトラブルにつながる.

そこで私はこの予約をエクセルのVBAを使って構築することにした.さらに,もともと組み込まれていたプログラムを効率的にするように改良した.

完成図

完成したものをgithubにあげた
https://github.com/kosuke-ttm/Round1Reservation.git

下の写真が今まで使っていたシートの写真である.ここでの問題点は貸出可能である台が視覚的に分からない.

図1

これを改良して...
次のように変更した.追加で使えないことを示すための停止ボタンや充電開始と充電完了のボタンを充電ボタンにまとめて少なくし,ステータスの部分に稼働,停止,充電中,充電必要という表示ができるようにした.値を条件指定して色にもこだわった.

図2

これに追加して予約ができるようにしたシートが次のようである.

図3

実際に使うと次のようになる

図4

これを作るのが一番難しかった.そもそも予約をする上でどのようにしたら分かりやすく効率よくできるかのアイディアを出すのに苦労した.予約したい時間のセルを選択した状態で予約ボタンを押すと予約番号と案内時間と予約台数が書かれた紙が自動で印刷されるようにした.
予約ボタンを押した時に利用開始時間から返却予定時間までのセルを結合して分かりやすく表示されるようにした

つまづいたこと

予約をした時,間違えて異なる時間のセルを選択してしまうことがあった場合に戻る操作をできるようにしたいと指摘されたのだが,マクロの場合だと,Ctrl+Zが効かないことを知ってどのようにすれば良いのかとても悩んだ.予約ボタンをする前の状態を記録するためのオブジェクト的な変数を用意すれば良いのかと思い,色々試していたが,セルのコピーを継続的に変数として保持するのはできない(調べても出てこなかった)のでよろしくないことであるのを承知の上で,シートの誰も触らない下の方のセルにコピーしてペーストするようにプログラムを書いた.このようにすれば下の方に履歴として予約情報が残り,戻るボタンを押した時,そこを参照するだけで良いことになる.コードも簡単なコードで済んだので画期的な方法であると思う.

学んだこと

もともと予約システムはなく貸出のみを管理することができるマクロが組み込まれていたが,そこに書かれていたVBAコードはとても非効率で処理が共通する部分もわざわざ全て細かく書かれており,短く書くことができるにも関わらずものすごく長くコードが書かれていた.それはなぜか,おそらくこれを作った人はプログラミングの知識はなかったのだと考えられる.マクロを実現するには2つの方法がある.一つはVBAのプログラミングのコードを書く方法で2つ目はマクロのレコーディング機能により人の操作をエクセル側が自動でプログラムを作成させてマクロを記録する方法がある.従来の貸し出しのシステムを作成した人は後者の方法を使ってやっていたのだと考えられる.
しかし,後者の方法は前者の方法に比べて柔軟性が一気に欠けることを身にしみて実感した.

職場の人の反応

一言で言うと自分の想像の10倍以上の反応ですごいと称賛された.一人も不満を言う人はいなかった.
早速たくさんのフィードバックをいただいて,その時自分がエンジニアになった気分ですごく楽しかった.この経験は会社に入って大いに活用できると思った.
フィードバックは例えば次のようなものがあった.

  • 予約ボタンを間違えて押した時に一つ前の操作に戻したい.
    • Ctrl+Zをしても戻せなかった(マクロで一度実行したことは元に戻せない).そこで一つ一つの操作が行われる度に該当範囲をコピーして記録しておくようにして戻るボタンを追加した.
  • 貸し出しと予約でシートが2つに分かれているが,予約をするとき貸出回数やステータス(貸し出し中なのか充電中なのか

今後の展開

作成していく段階でバグの修正や職場の人からのアイディアを聞いて作成したが,職場の人とのフィードバックは継続的にやっていきたいと思う.

Discussion