RPAの手頃な例題に取り組んでみた
例題
以下のような賃金台帳のエクセルのデータが提出される。
No | タイトル | データ内容 |
---|---|---|
1-1 | 社員コード | 主キー |
1-2 | 社員名 | 従業員名 |
1-3 | 基本給 | 基本給が記載されている。 しかし、ほとんどの人に入力はない。 |
1-4 | 支給額合計 | 支給総額 |
1-5 | 健康保険料 | 健康保険料 |
1-6 | 厚生年金料 | 厚生年金保険料 |
1-7 | 雇用保険料 | 雇用保険料 |
1-8 | 社会保険料合計 | (1-5)~(1-7)の合計額 |
1-9 | 課税対象額 | 「(1-4) - (1-8)」の計算で求められた金額 |
1-10 | 所得税 | 所得税 |
1-11 | 住民税 | 住民税 |
1-12 | 非課税通勤費 | 非課税区間における通勤費。 全従業員に必ずあるわけではない。 |
1-13 | 課税通勤費 | 12の区間をオーバーした分の通勤費。 全従業員に必ずあるわけではない。 |
1-14 | 管理職手当 | 手当のひとつ |
1-15 | 夜勤手当 | 手当のひとつ |
1-16 | 時間外手当 | 手当のひとつ |
1-17 | 差引支給額 | 「(1-4) - (1-8) - (1-10) - (1-11)」の計算結果で求められた金額 |
これを担当者が管理している賃金台帳へ転記するという作業があるらしい。
担当者の賃金台帳の形式は以下の通り。
No | タイトル | 転記内容 |
---|---|---|
2-1 | 社員名 | (1-2) |
2-2 | 基本給 | 「(1-4) - (1-12) - (1-13)」の計算結果で求められた金額。 (1-3)にまともな数値が入っていればこんな珍妙な計算は要らないのだけど(´・ω・`) |
2-3 | 通勤手当非課税 | (1-12) 基本給から2つ空白行があった後に記載される |
2-4 | 通勤手当課税 | (1-13) |
2-5 | 合計 | (2-2)から((2-4)までの合計額 エクセルに数式が入っている。 |
2-6 | 健康保険料 | (1-5) |
2-7 | 厚生年金保険料 | (1-6) |
2-8 | 雇用保険料 | (1-7) |
2-9 | 住民税 | (1-11) |
2-10 | 所得税 | (1-10) |
2-11 | 控除合計 | (2-6)から(2-10)までの合計額 エクセルに数式が入っている。 |
2-12 | 支給額 | 「(2-5) - (2-11)」の計算結果で求められる金額 エクセルに数式が入っている。 |
要はエクセルデータを他のエクセルデータに貼り付けるだけの作業。
VBAでやる方が処理時間も早く終わらせることができるだろうけど、RPAを勉強しているのでそちらで実現してみたい。
問題点
当例題をこなすうえでエラーを出してしまった内容をピックアップ
データの記載方向
先方から提出されるエクセル資料はテーブル形式(1行目にタイトルがあり、2行目以降がデータ)のものである。
しかし、担当者が管理しているのは多重クロス集計表(1行目に社員名がならび、1列目に基本給や健康保険料などの項目が並ぶ。要はタイトルが二つある)の形式を採っている。
そのため、データ転記をする際は取得してきたデータを列方向(横方向)に展開しないといけない。
列名は「A」や「AX」のように数値ではなく文字列で表現されるため、これを解決しなければ転記はできない。
調べてみると、列番号(数値)を列名(英字)に転換する良い例を紹介しているページがあったので参考にした。
Zawanii : 【UiPath】Excelの列番号をアルファベットに変換する
ここで紹介されている手順をxamlに記載し、引数に列番号を戻り値に列名を返却するように設定して組み込んだ。
処理としては以下のような感じ。
nullの取扱い
担当者が管理しているエクセルデータでは、基本給は計算して出力する必要がある。このとき、通勤費は従業員全員に支給されているわけではない。そのため、空のセルを読み込みむこともある。そうした場合、計算する過程で「CInt」を使用するとエラーが発生する。
これを解決する方策として、以下のページに紹介されている方法を採用した。
条件分岐の条件として「String.IsNullOrEmpty()」を使用して、Nullもしくは空文字の場合はTrueが返却されるので、その場合は何も処理をしないように処理を施した。
結論
担当者のエクセルのデータ形式を見直したほうが良いと思う。
よほどの理由が無いのであれば、今の形式は一方的に不便を強いているようにしか感じない。