今回は、アルバイトやパートの給料計算ツールの作成に挑戦してみます。時間の計算は、普通の計算と違って気をつけるべきことが多いので注意して作成しましょう。また、PCのテンキーだけを使って手軽にデータを入力できるようなツールに仕上げてみましょう。
自作ツールのススメ
私たちの身の回りには、PCを使って行うたくさんの仕事があります。そうした仕事を、既存のツールだけをつかって片付けることもできます。しかし、ちょっとしたヒラメキで、ツールを改良するなら、気持ちよく、これまで以上に快適に仕事を片付けることができます。今回、時給計算ツールを作り、実際に使うことを考えて、テンキーだけでデータ入力ができるように作成してみます。
経過時間の計算はどうやるの?
時給計算ツールを作る上で必要となるのが時間の計算です。時間の単位は、数値計算の10進法と異なり60分で1時間となります。そのため、単純に計算することはできません。例えば、朝の8時30分から夕方の17:00まで何時間かを計算する場合、分を少数と考えて、17.00 - 8.30 = 8.70のように単純に計算することはできません。この場合、時間の単位を分に揃えて計算すると楽に計算できます。
- 8時30分の時間の部分を分に直してみると、8時×60分+30分=510分
- 17時00分を直してみると、17時× 60分+0分=1020分
そこで、経過時間を調べるには、1020-510=510分となり、これを60で割ると8時間と30分と求めることができます。
これを元にして、最初に経過時間を調べるプログラムを作ってみましょう。ポイントは、時間を分に直すという部分です。以下のプログラムを『なでしこ3の簡易エディタ』で実行してみましょう。
# 開始時間と終了時間を指定 --- (*1)
開始時間=「08:30」
終了時間=「17:00」
# 分に変換する --- (*2)
開始分=開始時間を分変換する
終了分=終了時間を分変換する
# 差を調べて時間に変換する --- (*3)
経過分=終了分 - 開始分
経過時間=経過分を時間変換
「{終了時間} - {開始時間} = {経過分}分」と表示。
「時間にすると、{経過時間}」と表示。
# 時間を分に変換する関数 --- (*4)
●(HMを)分変換とは
HMを「:」で区切ってSに代入。
M=INT(S[0])×60 + INT(S[1])
Mを戻す。
ここまで。
# 分を時間に変換する関数を定義 --- (*5)
●(Mを)時間変換とは
H=INT(M÷60)
M2 = M % 60
「{H}:{M2}」を戻す。
ここまで
なでしこ3簡易エディタでプログラムを実行すると、次のように表示されます。
プログラムを確認してみましょう。最初に(*1)の部分で、開始時間と終了時間を文字列として与えます。ここを変更すると、様々な時間の経過時間を計算できるので試してみましょう。
次に(*2)の部分では、時間を分に変換します。分に直したら、経過時間を計算するのが容易になります。(*3)の部分で差を調べて、再び時間に変換して、結果がを画面に表示します。
(*4)では文字列で与えた『時:分』の形式の文字列を分に直す関数を定義します。そして、(*5)の部分では、分を『時:分』の形式の文字列に直す関数を定義します。それぞれ、時間に60を掛ける、割るという簡単な方法で求めることができます。
時給を計算しよう
経過時間を求めることができたら、時給の計算が可能です。経過時間、つまり、労働時間に時給を掛け合わせます。実際のところ時給の計算は、職場ごとに異なりますので、その職場のルールに合わせた計算プログラムを作る必要があります。しかし、ここでは簡単に労働時間に対して一分単位で時給を出すという単純な計算で給料計算をしてみましょう。
一分単位で時給を計算する場合には、最初に時給を60で割って分給を求めておくと簡単に給料計算ができます。つまり、上記の方法で、分単位の経過時間を求めておき、それに分給を掛けることで給料を計算するのです。
それでは時給計算ツールを作ってみましょう。同じように、なでしこ3簡易エディタで実行してみてください。
# --- 各種時間と時給を指定 --- (*1)
開始時間=「10:15」
終了時間=「17:30」
休憩時間=「1:00」
時給=930
# --- 労働時間を求める --- (*2)
開始分=開始時間を分変換
終了分=終了時間を分変換
休憩分=休憩時間を分変換
労働分=終了分 - 開始分 - 休憩分
# --- 給料を計算 --- (*3)
分給=時給÷60
給料=INT(分給×労働分)
「労働時間(分)は{労働分}分。」と表示。
「給料は{給料}円。」と表示。
# 時間を分に変換する関数 --- (*4)
●(HMを)分変換とは
HMを「:」で区切ってSに代入。
M=INT(S[0])×60 + INT(S[1])
Mを戻す。
ここまで。
プログラムを実行すると、以下のように表示されます。
プログラムを確認してみましょう。(*1)の部分で、開始時間、終了時間、休憩時間と時給(円)を指定します。この部分を変更して、値が正しいか確かめて見ると良いでしょう。
そして、(*2)の部分では、労働時間を調べています。計算方法は、前回のものとほとんど同じで、時間を分に計算し、分を基本単位として計算を行います。今回は休憩時間を考慮するので、労働時間(分)を求めるのに『終了分 - 開始分 - 休憩分』と記述しています。
それから、(*3)の部分で分ごとの時給である分給を計算し、(*2)で求めた労働時間(分)を掛ければ給料の計算ができます。結果を画面に表示します。なお、(*4)の時間を分に計算するプログラムは、全く前回と同じです。
一ヶ月分の退勤データを読んで計算してみよう
ここまでの部分で、時給計算するプログラムを作ることができました。とは言え、一日分しか計算できていません。そこで、ここでは一ヶ月分の退勤データを与えると、労働時間を計算し、結果を表示するようなプログラムを作ってみましょう。
一ヶ月分の退勤データをテキストボックスに入力し、計算ボタンを押すと、労働時間と給料を計算するというプログラムを作ってみます。退勤データは、一般的なテンキーを利用して入力できる形式を考えてみます。一般的にテンキーには、タブキーと数字キーとEnterキーがあります。そこで、ここでは、CSVでデータを与えることにし、列を区切るにはタブを、行を区切るのにEnterキーを区切ることにします。そして、「日付 (tab) 開始時間 (tab) 終了時間 (tab) 休憩時間」のようなデータを与えることにします。また、テンキーには「:」のキーがないため、「08:30」のようなデータを「08.30」のように入力できるようにします。
それで入力するサンプル退勤データは、以下のようなものにします。(※下記データは見栄え上スペース区切りとなっていますが、実際はタブ区切りにして貼り付けて実行します)
日付 開始時間 終了時間 休憩時間 2 8.30 17.00 1.00 4 8.20 17.30 1.00 9 8.40 17.10 1.00 11 8.25 17.13 1.30 16 8.20 16.50 1.10 18 8.30 17.00 1.00 23 8.00 17.30 1.30 25 8.30 17.00 1.00 30 8.20 17.10 1.00
そして、完全なプログラムは、次の通りです。
# --- 設定 --- (*1)
時給=930
# --- UIを作成 --- (*2)
入力エリア=「」のテキストエリア作成。改行作成。
計算ボタン=「計算」のボタン作成。改行作成。
結果ラベル=「...」のラベル作成。
計算ボタンをクリックした時には
入力エリアのテキスト取得して時給計算。
結果ラベルにそれをテキスト設定。
ここまで。
入力エリアに{
"幅":"90%", "高さ":"150px"
"背景色":"#ffc0c0", "fontSize": "16px"
}をDOMスタイル一括設定。
# 連続で時給の計算を行う関数--- (*3)
●(TAの)時給計算とは
労働分=0
TAを改行で区切って反復
もし、対象が空ならば、抜ける。
対象をタブで区切ってCに代入。
開始分=C[1]を分変換
終了分=C[2]を分変換
休憩分=C[3]を分変換
M=終了分 - 開始分 - 休憩分
労働分=労働分+M
ここまで
分給=時給÷60
給料=INT(分給×労働分)
それは「労働時間(分)は{労働分}分。」& _
「給料は{給料}円。」
ここまで。
# 時間を分に変換する関数 --- (*4)
●(HMを)分変換とは
HM=HMの「.」を「:」に置換。
HMを「:」で区切ってSに代入。
M=INT(S[0])×60 + INT(S[1])
もし、!Mならば、M=0
Mを戻す。
ここまで。
簡易エディタで実行すると、以下のようになります。
プログラムを確認してみましょう。(*1)の部分で時給の値を指定します。そして、(*2)の部分で、入力用のテキストエリアを作成し、計算ボタンを押した時のイベントを定義します。
(*3)の部分では、入力エリアのテキストを読み込んで、各行に入力されている値を計算していきます。方法としては、最初に改行でデータを区切って、反復構文で一行ずつ処理します。その際、各行をタブで区切って、開始分、終了分、休憩分を求めて、労働時間を計算します。労働時間(分)が出たら、それに分給をかけて、給料を算出します。そして、最後の(*4)の部分はほとんど、前回と同じですが、「時.分」の形式も認識するようにしています。
まとめ
以上、今回は時給による給料計算のプログラムを作ってみました。経理処理はなかなか面倒なものです。そこで、ちょっとしたアイデアと自作プログラムを作るなら、ぐっと処理を簡素化できる余地があります。特に、今回、思いつきでテンキーだけで退勤データを入力できるようにしてみました。これで片手でサクサクデータを入力するということができます。実際に、いろいろなデータ入力作業をしていると、もっと簡素化できるのにと思いつくこともあるでしょう。ぜひ、自分ツールを作ってみてください。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。