今から10年以上前、自分が仙台にいた頃作ってたAccessで勤怠管理をするプログラムになります。当時はクラウドもASPと呼ばれる一部のサービスしかなく、またスマフォもない時代。タイムカードで勤怠管理をしておりました。ただ、其の手間は結構なもので、有給取得管理や土曜出勤管理などもあり、Excelで作業は苦痛でした。

ということで、つくったのがコレ。ただ、当時使っていたシステム連携用の機能は削除し、一方で現代用にメニュー等はリボン化したものになります。一部の機能(PDF連続印刷&メール送信)についてはリメイクが必要なので、現在は機能として停止させてありますし、また一部は旧来のライブラリを使ったものになってるので、現在ここも置き換え中。

※本アプリは実運用というよりは、Accessの勉強のキッカケになればと思いアップしています。一応実運用してたプログラムなので、使えなくはないですが、会社の規定やルールによっては機能の追加実装が必要でしょう。

ダウンロード

ZIPで固めてるだけです。中には以下のようなファイルが入っています。

  1. willson.accdb - プログラムの本体です。テーブルは別のファイルへとリンクテーブルで繋いでいます。
  2. base.accdb - マスターやデータ類を格納してるファイル。起動時に自動的にこのファイルへのリンクテーブルで接続させてます。
  3. base1.accdb - 空っぽのファイル。バックアップファイル作成時にここへテーブルをコピーして圧縮します。
  4. 7-zip32.dll - ZIP圧縮の為の高機能ライブラリ。base1.accdbを圧縮して保存します。

また、本プログラムは、32bit版Accessで動作しますので、Runtimeは32bit版をご利用ください。動作は、Access 2010, 2013, 2016で確認しています。

主な機能

初回起動時に一回、コンテンツの許可が求められます。許可を与えないとVBAが実行できません。古いプログラムではありますが、当時の様々なノウハウを詰め込んでます。

プログラムの設定

ここでは、プログラムの初期設定を行います。但し、現在はSMTP Server Addressなどのメール関係は機能を止めています(当時BASP21で送信をさせてしていましたが、いい加減古いので、現在は別の手段を構築中)。必ず設定してから利用しましょう。エラーが出ますので(エラートラップとか当時なんもしてなかった・・・)

  1. 管理範囲は職員マスタ上で設定した経理所場コードに基づいて設定します。ここで管理範囲を絞ると、職員マスタ上には出現しなくなるので注意が必要です。
  2. 半休取得限度日数を設定すると、半休登録時に制限が掛かります。就業規則に乗っ取り設定をすると良いでしょう。
  3. 年間要土曜出勤日数は、1年間で必要な土曜出勤日数を設定するものです。完全週休二日制の場合には不要でしょう。
  4. 印刷位置調整は、アマノAタイムカードで印刷をする時のプリンタ毎のズレを補正する為の設定です。縦位置横位置をmmで指定して調整しましょう。
  5. 土曜出勤日チェックは終了時に土曜出勤日数データをチェックする機能です。
  6. タイムカード印刷センタリングは使わないと思いますが、印刷位置をセンタリングした上で調整する場合に利用します。通常はオフで問題なし。

図:機能停止させてる設定もある

データのバックアップ

既存のbase.accdbを圧縮し、暗号化ZIPとして出力・取り込みする為の機能です。ファイルの拡張子はrouとして設定しています。最近でこそAccessはファイルが破損しなくなりましたが、データの誤った削除や損失に備えて、逐一バックアップを取っておくと良いでしょう。

また、取り込みを行うと既存のテーブルデータは全て削除されますので、インポートをする時は注意が必要です。但し、このプログラムは、起動時に自動で5世代に渡ってバックアップをカレントディレクトリに作っていますので、そちらから復帰も可能です。

また、いろいろExcel出力では、主要なテーブルのデータをxlsx形式で出力する事ができるようになっています。データの二次利用などを考えている場合にはこちらからデータを出力して利用すると良いでしょう。

年度更新の実施

年度更新は、旧年度のデータから以下のデータを新年度として引き継ぎます。

  1. 未消化となってる休日出勤データを引き継ぎます。
  2. 消化済みの休日出勤データは消滅します。
  3. 会社の制度によって違うと思われるので、年初の有給休暇付与日数および旧年度での未利用有給休暇の長期療養休暇への積立については運用が必要です。

職員マスター一覧

年休等の基本データを一覧表示で編集可能にしています。こちらは個別ではないので、編集可能項目は必要最低限です。一覧で確認したい場合に利用します。

図:これも新しい方式に変えようと思ってます。

メイン画面

勤怠管理画面

本プログラムのメイン画面。職員コード〜個別の土日出勤・有給取得のデータを登録します。またサブ機能として、タイムカード印刷機能やレポート印刷機能があります。現在はいくつかの機能は不可視にしてあります(Access2016以降で動くように作り直しが必要であるため・・・元がAccess97でしたからかなり差がありました)。

  1. タイムカード作成にチェックをいれるとタイムカード印刷対象になります。
  2. 退職にチェックをいれると表示されなくなります。
  3. メール送信はチェックを入れると一括送信の対象になりますが、現在は使用できません。
  4. 一応、半休だけでなく時間休の設定も対応させました。
  5. 土曜出勤、休日出勤とその振替などに関する項目が下のパネルになります。
  6. 右上の鉛筆マークで所場(支店などや部署でのコードと名前)を登録します。必ず設定するようにしましょう。

図:Excelではこういった管理は本当に苦痛でした。

タイムカード印刷

また、タイムカードはアマノAタイプに対応。昔はこれを判子で事前に土曜日やら日曜日やら祝日やらを押して用意していました。ものすごい手間でしたね。ただ、現代に於いてはこの手の出退勤管理はもはやFelicaを使ったものが主流(さらに言えば、グループウェア上で直接管理)なので、タイムカードという方式は絶滅していくでしょう(実際自分が現在作ってるようなものは、MySQLサーバ立てて、クライアント側で直接出退勤を入力する方式だったり、また、G Suite上で構築する場合は、それ専用のUIを用意しています)。

印刷機能は1〜31日まで。アマノAタイプは両面で印刷が必要なので、表と裏の2回に分けての印刷が必要です(一発で両面印刷するにはカードの厚みが・・・)以下の機能があります。

  1. 既定値にて、土日祝日などを一括で設定します。設定後は隣のボタンをクリックすると全員に適用されます。
  2. 個別では、事前申請のある有給や産休などの登録が個別に可能になっています。

それぞれ裏と表用にボタンがあるので、表からまず全員分印刷、その後裏を全員分印刷するような感じになります。

図:タイムカード印刷もすごい時間かかってた当時

図:休日一括設定画面

レポート印刷機能

当時、このレポートを毎月月末に全員に一斉にメール送信していました。これが非常に効果的で、有給の申請を未提出のままになってる人や、現在の残り有給残日数の問い合わせの低減、など締めをする上ではスムーズに情報提供を促すきっかけになりました。今でこそ、この手の申請系もワークフローシステムで行うのが常識なので、紙での申請というのは見なくなりましたが、有給だけでなく未振替の土日出勤など個人で覚えていられないので、こういったアナログな手法も効果がありました。

現在はこの一括送信機能は停止中です。

図:こんな感じで一覧表示してPDF化して送ってました

Excelで管理する場合との違い

本プログラムは実はほとんどVBAコードを記述していません。なぜAccessを利用するのか?その利点をまとめたものがこのプログラムになります。特にメイン画面に至っては構築に際してガッツリコードが書かれてるのは、上部の検索画面がそれです(これも他のライブラリを利用しているので、自前で書いたのはわずか)

  1. Excelでこの手の管理をする場合、2次元管理しかできない。しかし、Accessは複数次元管理がフォーム上で可能になる。
  2. 本プログラムのメイン画面のサブフォームは親のフォームと職員コードで連携してる。これもコードレスで実現が可能。
  3. Excelの利点は自由に縦横に色々記述できる点だが、それがデメリットでもある。入力制限をしてきちんとデータの整合性を保てるのがAccessの利点(数値フィールドに大文字数字入れられたり、日付も2019.10.5とか入れられても、管理側は非常に困ることになる。
  4. レコードで管理なので、管理対象もセルではなく1行単位。Excelの場合セル単位での管理を求められるので、データの別テーブルへの移動なども正確なコードを記述しなければならない。しかし、Accessはクエリで簡単にそれが実現できる(追加クエリや削除クエリ)
  5. レコードの更新(例えば旧年度から新年度への以降)に際して、既存のデータ(例えば、年休残日数)などを、更新クエリにて一括更新する事が可能。

クエリを制する者はAccessを制すると言っても過言ではありません。また、特にExcelから脱却できず非効率且つ不確実で、複数シートに跨って面倒な処理をしてる人が絶えないのが1.の問題点。

Excelは所詮シート単位なので1画面に出せるデータは縦横の2次元データです。しかし、Accessはフォームを使って、マスターデータ(職員マスター)に付随する、別のテーブルデータ(勤怠データ)などを、サブフォームで同時に表示可能で、尚且、サブフォームでのデータ入力は、自動的に親フォームの職員IDが入ってくれるので誰の勤怠データなのか意識する事もなく、データの整合性を保つ事ができる(親レコードを移動すれば、サブフォームも内容が変わる)。

そのサブフォームも複数配置可能で、レポートにおいてもサブレポートでそれが実現可能です。この利点をきちんと説明してるサイトが余りにも少ないので、今回ちょっと要望があったのでアップしてみました。いずれ、この利点についてもブログにて詳細に説明していこうと思っています。

関連リンク