• ベストアンサー

Excel 通算期間を算出するマクロ

Excelで派遣社員の派遣労働契約を管理しています。 労働契約法により通算雇用期間5年以上で無期雇用へ転換しないといけません。継続的に契約している人はDATEDIF関数で通算雇用期間の算出ができますが、人によっては出入りが激しかったり同じ期間に複数の契約があったりと、関数では間に合わないことがあります。 そこで、図のようなExcelがあった時、連続した雇用期間や空白期間を別シート等に書き出すことはマクロで可能でしょうか。どうか教えて頂きたいです。 ※わかりやすいように期間のセルを色付けしています。実際のエクセル表には色はついていません。

質問者が選んだベストアンサー

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (454/692)
回答No.2

ごめんなさい、 間違えています。 (ソースコードのマジックナンバーを無くすときにチョンボっています。) 差し替えます。 m(_ _)m Sub sample()  Dim NowTDate As Date  Dim GetRow As Integer  Dim PutRow As Integer  Dim Getsh As Worksheet  Dim Putsh As Worksheet  Dim JituCount As Integer  Dim KaraCount As Integer  Const GetColf = 6   '契約開始日列  Const GetColt = 7   '契約終了日列    Const PutColK = 3   '期間名列  Const PutColF = 4   '期間開始列  Const PutColT = 5   '期間終了列  Const PutColD = 6   '期間日数列  Const PutColM = 7   '期間月数列    Set Getsh = ThisWorkbook.Sheets(1)  '集計元シート  Set Putsh = ThisWorkbook.Sheets(2)  '主計先シート    JituCount = 1 '契約カウンター  KaraCount = 1 '空白カウンター  GetRow = 2   'データの開始行  PutRow = 2   '出力先のデータ開始行    Putsh.Cells(1, PutColK).Value = ""  Putsh.Cells(1, PutColF).Value = "開始日"  Putsh.Cells(1, PutColT).Value = "終了日"  Putsh.Cells(1, PutColD).Value = "日数"  Putsh.Cells(1, PutColM).Value = "月数"  Putsh.Cells(PutRow, PutColF).Value = Getsh.Cells(GetRow, GetColf).Value  Putsh.Cells(PutRow, PutColT).Value = Getsh.Cells(GetRow, GetColt).Value  Putsh.Cells(PutRow, PutColK).Value = "期間" & Format(JituCount, "0")  JituCount = JituCount + 1  NowTDate = Putsh.Cells(PutRow, PutColT).Value    Do   GetRow = GetRow + 1   If Getsh.Cells(GetRow, GetColf).Value = "" Then Exit Sub     If Getsh.Cells(GetRow, GetColf).Value <= NowTDate + 1 Then    NowTDate = WorksheetFunction.Max(Getsh.Cells(GetRow, GetColt).Value, NowTDate)    Putsh.Cells(PutRow, PutColT).Value = NowTDate    Putsh.Cells(PutRow, PutColD).Value = _     Putsh.Cells(PutRow, PutColT).Value - _     Putsh.Cells(PutRow, PutColF).Value + 1       Putsh.Cells(PutRow, PutColM).Value = _     (Year(Putsh.Cells(PutRow, PutColT).Value) * 12 + _      Month(Putsh.Cells(PutRow, PutColT).Value)) - _     (Year(Putsh.Cells(PutRow, PutColF).Value) * 12 + _      Month(Putsh.Cells(PutRow, PutColF).Value)) + 1      Else    PutRow = PutRow + 1       Putsh.Cells(PutRow, PutColK).Value = "空白" & Format(KaraCount, "0")    KaraCount = KaraCount + 1    Putsh.Cells(PutRow, PutColF).Value = NowTDate + 1    Putsh.Cells(PutRow, PutColT).Value = Getsh.Cells(GetRow, GetColt).Value - 1       PutRow = PutRow + 1    Putsh.Cells(PutRow, PutColK).Value = "期間" & Format(JituCount, "0")    JituCount = JituCount + 1    Putsh.Cells(PutRow, PutColF).Value = Getsh.Cells(GetRow, GetColf).Value    Putsh.Cells(PutRow, PutColT).Value = Getsh.Cells(GetRow, GetColt).Value    Putsh.Cells(PutRow - 1, PutColT).Value = Putsh.Cells(PutRow, PutColF).Value - 1       NowTDate = Getsh.Cells(GetRow, GetColt).Value       Putsh.Cells(PutRow, PutColD).Value = _     Putsh.Cells(PutRow, PutColT).Value - _     Putsh.Cells(PutRow, PutColF).Value + 1       Putsh.Cells(PutRow - 1, PutColD).Value = _     Putsh.Cells(PutRow - 1, PutColT).Value - _     Putsh.Cells(PutRow - 1, PutColF).Value + 1       Putsh.Cells(PutRow, PutColM).Value = _     (Year(Putsh.Cells(PutRow, PutColT).Value) * 12 + _      Month(Putsh.Cells(PutRow, PutColT).Value)) - _     (Year(Putsh.Cells(PutRow, PutColF).Value) * 12 + _      Month(Putsh.Cells(PutRow, PutColF).Value)) + 1       Putsh.Cells(PutRow - 1, PutColM).Value = _     (Year(Putsh.Cells(PutRow - 1, PutColT).Value) * 12 + _      Month(Putsh.Cells(PutRow - 1, PutColT).Value)) - _     (Year(Putsh.Cells(PutRow - 1, PutColF).Value) * 12 + _      Month(Putsh.Cells(PutRow - 1, PutColF).Value)) + 1      End If  Loop End Sub

sgskrm
質問者

お礼

ご丁寧にありがとうございます! まさに欲しかった結果が得られました。すごい! 大変助かりました、お礼申し上げます。

その他の回答 (2)

  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.3

マクロを使わなくても、各々の期間を算出する列を作り、SUMIFで合計すればいいだけでは? Excelの日付は、1900年1月1日を1とした連番になっていますから、引き算すれば日数が出てきます(表示形式を標準に戻せばわかります)。日数がわかれば、あとはそれを合計すればいいだけなので。

sgskrm
質問者

お礼

ありがとうございます。 同一の期間に掛け持ちして働いている場合もあり、関数だけでは対応できないことがありました。

  • HohoPapa
  • ベストアンサー率65% (454/692)
回答No.1

こんなカンジでいかがでしょうか。 ほとんどテストしていませんので、ポカがあるかもしれません。 よかったら参考にしてください。 ※思ったよりボリュームがありました。(^^)/~~~ Sub sample()  Dim NowTDate As Date  Dim GetRow As Integer  Dim PutRow As Integer  Dim Getsh As Worksheet  Dim Putsh As Worksheet  Dim JituCount As Integer  Dim KaraCount As Integer    Const GetColf = 6   '契約開始日列  Const GetColt = 7   '契約終了日列    Const PutColK = 3   '期間名列  Const PutColF = 4   '期間開始列  Const PutColT = 5   '期間終了列  Const PutColM = 6   '期間月数列  Const PutColD = 7   '期間日数列    Set Getsh = ThisWorkbook.Sheets(1)  '集計元シート  Set Putsh = ThisWorkbook.Sheets(2)  '主計先シート     JituCount = 1 '契約カウンター  KaraCount = 1 '空白カウンター  GetRow = 2   'データの開始行  PutRow = 2   '出力先のデータ開始行     Putsh.Cells(1, PutColK).Value = ""  Putsh.Cells(1, PutColF).Value = "開始日"  Putsh.Cells(1, PutColT).Value = "終了日"  Putsh.Cells(1, PutColM).Value = "日数"  Putsh.Cells(1, PutColD).Value = "月数"    Putsh.Cells(PutRow, PutColF).Value = Getsh.Cells(GetRow, GetColf).Value  Putsh.Cells(PutRow, PutColT).Value = Getsh.Cells(GetRow, GetColt).Value  Putsh.Cells(PutRow, PutColK).Value = "期間" & Format(JituCount, "0")  JituCount = JituCount + 1  NowTDate = Putsh.Cells(PutRow, PutColT).Value     Do   GetRow = GetRow + 1   If Getsh.Cells(GetRow, GetColf).Value = "" Then Exit Sub       If Getsh.Cells(GetRow, GetColf).Value <= NowTDate + 1 Then    NowTDate = WorksheetFunction.Max(Getsh.Cells(GetRow, GetColt).Value, NowTDate)    Putsh.Cells(PutRow, PutColT).Value = NowTDate     Putsh.Cells(PutRow, PutColM).Value = _     Putsh.Cells(PutRow, PutColT).Value - _     Putsh.Cells(PutRow, PutColF).Value + 1          Putsh.Cells(PutRow, PutColD).Value = _     (Year(Putsh.Cells(PutRow, PutColT).Value) * PutColM + _      Month(Putsh.Cells(PutRow, PutColT).Value)) - _     (Year(Putsh.Cells(PutRow, PutColF).Value) * PutColM + _      Month(Putsh.Cells(PutRow, PutColF).Value)) + 1         Else    PutRow = PutRow + 1        Putsh.Cells(PutRow, PutColK).Value = "空白" & Format(KaraCount, "0")    KaraCount = KaraCount + 1    Putsh.Cells(PutRow, PutColF).Value = NowTDate + 1    Putsh.Cells(PutRow, PutColT).Value = Getsh.Cells(GetRow, GetColt).Value - 1         PutRow = PutRow + 1    Putsh.Cells(PutRow, PutColK).Value = "期間" & Format(JituCount, "0")    JituCount = JituCount + 1    Putsh.Cells(PutRow, PutColF).Value = Getsh.Cells(GetRow, GetColf).Value    Putsh.Cells(PutRow, PutColT).Value = Getsh.Cells(GetRow, GetColt).Value    Putsh.Cells(PutRow - 1, PutColT).Value = Putsh.Cells(PutRow, PutColF).Value - 1         NowTDate = Getsh.Cells(GetRow, GetColt).Value         Putsh.Cells(PutRow, PutColM).Value = _     Putsh.Cells(PutRow, PutColT).Value - _     Putsh.Cells(PutRow, PutColF).Value + 1         Putsh.Cells(PutRow - 1, PutColM).Value = _     Putsh.Cells(PutRow - 1, PutColT).Value - _     Putsh.Cells(PutRow - 1, PutColF).Value + 1         Putsh.Cells(PutRow, PutColD).Value = _     (Year(Putsh.Cells(PutRow, PutColT).Value) * PutColM + _      Month(Putsh.Cells(PutRow, PutColT).Value)) - _     (Year(Putsh.Cells(PutRow, PutColF).Value) * PutColM + _      Month(Putsh.Cells(PutRow, PutColF).Value)) + 1         Putsh.Cells(PutRow - 1, PutColD).Value = _     (Year(Putsh.Cells(PutRow - 1, PutColT).Value) * PutColM + _      Month(Putsh.Cells(PutRow - 1, PutColT).Value)) - _     (Year(Putsh.Cells(PutRow - 1, PutColF).Value) * PutColM + _      Month(Putsh.Cells(PutRow - 1, PutColF).Value)) + 1       End If  Loop End Sub

関連するQ&A

  • 派遣社員、無期労働契約への転換は5年超?8年超?

    労働契約法の改正で「有期労働契約が反復更新されて通算5年を超えたときは、労働者の申し込みにより、期間の定めのない労働契約(無期労働契約)に転換できる」ことになるようです。 元々派遣社員として3年間働いて、4年目以降は派遣先に直接雇用され契約社員として働いた場合、派遣社員として働き始めてから通算で5年を超えたときに転換申込権を行使できることになるのでしょうか? 若しくは、契約社員となった時点から数えて5年を超えたときに、即ち派遣社員として働き始めてから通算で8年を超えたときに転換申込権を行使できることになるのでしょうか? 「労働契約法改正のあらまし」で「通算契約期間は、同一の使用者ごとに計算する」と書いてあるので、同じ場所で同じ仕事をし続けても、派遣先の契約社員となった時点でカウントがリセットされるような気がしますが。。

  • 契約更新せずに有期労働契約が通算で5年を超えたら?

    契約の更新が行われず結果的に有期労働契約が通算で5年を超えた場合は、どうなるのでしょうか? 法律上は有期労働契約が通算で5年を超えて繰り返し更新された場合は、無期労働契約に転換するとなっていますが。。 即ち、例えば契約の更新はしない条件で1年の雇用契約を結び1年後に雇止めを行うのですが、1年ごとにアルバイトや契約社員の募集を行う中で、再度応募して再び1年の雇用契約を結ぶ。 これを繰り返して間断なく5年を超えて働き続けた場合です。 つまり、募集がかけられる度に応募して働いた結果、5年を超えてしまった場合、無期労働契約への転換権が労働者に発生するのか?という質問です。

  • 被保険者期間の通算について

    2006年の5月から7月末まで短時間労働被保険者(週20時間程度の就労)でした。 そこを退職後、今年の3月から再就職して一般被保険者となりました。(どちらも派遣です) 現在の勤め先は7月末までの契約で、更新しないで退職する予定です。 お聞きしたいのですが、私の場合、去年の短時間労働の期間も被保険者期間として通算できるものなのでしょうか? 通算できれば、ぎりぎり受給資格を得られると思うのですが・・・

  • 雇用保険の加入期間の通算について

    ただ今、求職活動中の者です。 正社員で5年程継続して勤務し、去年の8月10日付けで退職しました。 手当て受給などの申請は一切せずに、今に至ります。 “1年以内に就職した場合、前勤務先の雇用保険の加入期間が通算される”という制度を利用したいと考えています。 私の場合、具体的には、 今年の8月10日までに“雇用の契約”を結べば、通算されるのでしょうか? それとも、 今年の8月10日までに“雇用保険に加入”しなければ、通算されないのでしょうか? 派遣社員で働く事も視野に入れたのですが「就業3ヶ月に達した場合に、加入基準を満たした事になり、加入の手続きが出来る」と聞きました。 また、正社員や契約社員になれたとしても“試用期間”などがあると、雇用契約をした時点では雇用保険に加入出来ない事が多いのでしょうか? 一度、電話で最寄のハローワークに、加入期間の通算について質問しました。 「雇用契約した日が一年以内であれば、通算される。」 と言われたのですが、具体的に質問しなかったため、不安が残りました。 お忙しいとは思いますが、皆様のご回答、お待ちしております。 よろしくお願いいたします。

  • 登録型派遣が常用型派遣に?(改正労働契約法)

    改正労働契約法が4月から施行されると聞きました。 「無期労働契約への転換」が派遣社員に適用される場合、登録型派遣が常用型派遣に変わると解釈して宜しいでしょうか。 即ち例えば、ある登録型派遣の派遣会社に派遣登録をして、間断なく5年間働いたとき(派遣先は1年ごとに変わるとします)、無期労働契約への転換申込権を行使すれば、派遣元との雇用形態が常用派遣に変わり、たとえ派遣の仕事が無くても給与が支給されることになるのでしょうか。 更には定年までこの派遣会社に雇用され続けることも可能になると解釈して良いのでしょうか。 また、そうなると登録型の派遣会社は転換申込権を行使されない仕組みにする(つまり5年以上登録をさせないようにする)ような気がするのですが、どうなんでしょう。。

  • EXCEL DATEDIF関数について

    質問があります。 EXCELのDATEDIF関数で日付の期間内の年数、月数、日数、時間を2つのデーターから算出したいのですが、うまくできません。 そもそもDATEDIF関数では時間に対しては対応できないのでしょうか? また算出できる方法が有れば教えて頂けないでしょうか? データー基(例) A,14/04/30 00:01 B,14/05/02 05:03 宜しくお願い致します。

  • 期間を求めるエクセル関数について

    期間を求めるエクセル関数について DATEDIF(B14,B16,"Y")&"年"&DATEDIF(B14,B16,"YM")&"ヶ月"という関数で求められる数値に+1にする関数があれば教えて下さい。 例えば、1983年4月~1985年6月の期間を上記の関数で求めると2年2ヶ月(26ヶ月)になるのですが、2年3ヶ月(27ヶ月)としたいのですがどうしたら良いでしょうか? 単純に考えて+1にすればいいので簡単なのかと思ったのですが、なかなか関数が作れませんでした。。。

  • 雇用保険の通算について

    お世話になります。 基本的な質問で申し訳ありません。 結婚しているため、短期契約の仕事を繰り返してきました。 すべて雇用保険はついています。 雇用保険の受給についてお伺いしたいです。 2007年12月~1ヶ月労働 2008年 1月~3ヶ月労働 2008年 5月~4ヶ月労働 2008年10月~3ヶ月労働 2009年 1月~2ヶ月(これから就職) このように働きましたが、 1、通算1年以上、雇用保険に入っていたことになりますが雇用保険は受給できるのでしょうか? 2、雇用保険の受給が通算1年となる場合、通算の期間がどのくらい間が空いてよいものなのでしょうか?   例:半年働いて、半年休み、そこから1ヶ月や2ヶ月だけなど働いていった場合、2年間かけて雇用保険加入が通算1年間となった場合などはどうなるのでしょうか? 根本的によく仕組みをわかっていなくて、 すごく変な質問でしたらすいません。 ご回答お待ちしております。

  • 無期雇用型派遣

    ①無期雇用型の派遣労働者は一つの派遣先と契約期間を無期限としても、労働契約は有効になるのでしょうか。 ②登録型の派遣でも、一定の要件を満たせば、有期雇用労働者として、30日前の雇い止め予告は必要ですか。

  • 離職票の通算契約期間、更新回数について

    質問です。 私は派遣社員として特定の企業に2年間勤めていたのですが 会社都合により契約を打ち切られました。 早速派遣会社に離職票を申請したのですが、送られてきたものの (3)労働契約期間満了による離職 の箇所の通算契約期間が17箇月、更新回数が6回になっていました。 これは派遣会社の社会保険に登録していた年月とは合致するのですが 実質働いていた年月よりは明らかに少ないです。 これはおかしいのではないでしょうか?

専門家に質問してみよう