• ベストアンサー

Excelマクロにて30分単位の計算方法について

Excelのマクロにて30分単位の計算方法についてご存知の方宜しくお願いします。 8:01~8:30のデータを8:30に変換 8:31~9:00のデータを9:00に変換 という様に30分単位で時間の切り上げ計算 8:00~8:29のデータを8:00に変換 8:30~8:59のデータを8:30に変換 という様に30分単位で時間の切り捨て計算 セルにCEILING(A1,"0:30")やFLOOR(A1,"0:30")を使用して記述しても良かったのですが パターンが多すぎてセルに記述する事が出来ませんでした。(文字数制限の為) ので、マクロでの記述方法をご存知の方宜しくお願いします。

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

  • ベストアンサー
  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.2

要はマクロでワークシート関数が使えればいいという感じ? Application.WorksheetFunction.Ceiling Application.WorksheetFunction.Floor でどーかな?

WDY
質問者

お礼

書き込みありがとうございます。 早速実行してみたところ、オブジェクトがありませんとでてしまい 使い方がよく分かりません。 もしよろしければ参考コードを記述していただけないでしょうか? 下記コードでテストしてみました。 Worksheets("sheet").Range("A2").Value = Application.WorksheetFunction.Floor(Worksheets("sheet").Range("A1").Value, Worksheets("sheet").Range("B1").Value) A1にテスト用の時間(8:01) B1に0:30 を入れて実施してみました。

WDY
質問者

補足

失礼しました。 Application.WorksheetFunction.Ceiling Application.WorksheetFunction.Floor を使用して作成する事ができました。 Worksheets("sheet").Range("A2").Value = Application.WorksheetFunction.Floor(Worksheets("sheet").Range("A1").Value, Worksheets("sheet").Range("B1").Value) でエラーになっていたのは書いていた位置がずれていました。 申し訳ございません。 ありがとうございます。

その他の回答 (3)

回答No.4

訂正します。 'Cells("A4") に = 出社(A3) ↓ 'Cells("A4") に = 退社(A3)

回答No.3

'基本形として・・・ 'Cells("A1")に出社時刻を入れ 'Cells("A2") に = 出社(A1) 'Cells("A3")に出社時刻を入れ 'Cells("A4") に = 出社(A3) 'って感じでどうでしょうか? 'なお下のソースは標準モジュールにかいてください。 Function 退社(pTime As Date) As Date Dim pMin As Long Dim pHr As Long Dim RT As Date pMin = CLng(Split(Format(pTime, "hh:mm"), ":")(1)) pHr = CLng(Split(Format(pTime, "hh:mm"), ":")(0)) If pMin = 0 Then RT = CDate(pHr & ":" & "00") ElseIf pMin > 0 And pMin <= 30 Then RT = CDate(pHr & ":" & "00") Else RT = CDate(pHr & ":" & "30") End If 退社 = RT End Function Function 出社(pTime As Date) As Date Dim pMin As Long Dim pHr As Long Dim RT As Date pMin = CLng(Split(Format(pTime, "hh:mm"), ":")(1)) pHr = CLng(Split(Format(pTime, "hh:mm"), ":")(0)) If pMin = 0 Then RT = CDate(pHr & ":" & "00") ElseIf pMin > 0 And pMin <= 30 Then RT = CDate(pHr & ":" & "30") Else RT = CDate(pHr + 1 & ":" & "00") End If 出社 = RT End Function

WDY
質問者

お礼

書き込みありがとうございます。 時間を分割して条件で分岐すれば一番簡単だったかもしれません。 関数にこだわりすぎていて気づきませんでした。 ありがとうございます。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

「パターンが多すぎて…」と言う所が引っかかります。 8時台は切り上げだけど、9時台は切り捨てで、12時台はそのまんま……。 の様な意味ですか? 文字数制限に引っかかると言うのは相当な事だと思います。 もう少し詳細な情報があれば、回答もしやすいのですが。

WDY
質問者

お礼

回答ありがとうございます。 説明が不足していて申し訳ございません。 >8時台は切り上げだけど、9時台は切り捨てで、12時台はそのまんま……。 >の様な意味ですか? その様な意味です。 現在勤怠のシステムを作成しています。 旨く説明が出来ないので例を書き込みます。 例 切り上げの場合 出社間  8:00前に出勤していた場合は、8:00  20分遅刻をしていた場合は(8:20)30分単位で計算するので8:30 切捨ての場合 退社時  18:20にあがった場合は、30分単位で計算するので18:00 という様な計算をしたいです。 >文字数制限に引っかかると言うのは相当な事だと思います。 そうですね。パターンが多すぎて困っています。 夜勤の人、日勤の人、遅刻をした人、半休を使用した人、などなどの パターンがある為、セルの文字数制限に引っかかってしまいました。