電子書籍の厳選無料作品が豊富!

workDataシートの16列目に平日昼間の勤務時間(5時間の時には5:00)が入っています。
同じく17、18、19列に平日夜間、特定日昼間、特定日夜間の勤務時間が入っています。

下記のように、これらをスタッフ毎に集計するプログラムを作っています。
staffTotalシートの59〜62列に、4つの時間帯を積算したものを入れたいです。

現時点でエラーが出ず動くのですが、肝心の時間積算が誤っています。
(変数をDim myTime As Dateとすることでエラーは出なくなったが、計算結果が違っている)
時間を積算する部分に間違いがあると思うのですが、どうしたら良いか分かりません。
一旦シリアル値(?)に戻して足し算をするとか、そんな雰囲気かと思うのですが、具体的な方法がわかりません。

Dim lg As Long, i As Long, sid As Long
Dim st As Long, n As Long
Dim myTime As Date

lg = Worksheets("workData").Cells(Rows.count, 1).End(xlUp).Row
   '変数sidは、 workData該当行(i)の担当ID
sid = Worksheets("salesData").Cells(i, 5).Value
'変数sidの番号を、staffTotalの担当IDから探し、staffTotalでの行番号stを取得する
st = Worksheets("staffTotal").Range("A2:A21").Find(sid).Row

  For i = 2 To lg
'平日昼間、平日夜間、特定日昼間、特定日夜間の時間をstaffTotalに積算
 For n = 16 To 19 'workDataの16から19列が該当するのでFor文でループ
 myTime = Worksheets("workData").Cells(i, n).Value
 Worksheets("staffTotal").Cells(st, 43 + n).Value = Worksheets("staffTotal").Cells(st, 43 + n).Value + myTime
 Next n
next i

質問者からの補足コメント

  • ちなみに、シート上での時間の足し算の場合、
    セルの書式設定を[h]:mmにすると、24時間を超える足し算が出来ます。
    こんなイメージで、VBAを使っても24時間を超える時間の足し算をしたいのです。
    (今回はworkDataのシートに複数担当者の勤務記録が混在するため、質問内容のような処理が行いたいのです)

      補足日時:2022/11/15 17:39
  • 添付画像の左側がworkDataで、右側がstaffTotalです。
    (staffTotalに数字は入力されるが、計算結果は間違っています)
    同じような事を簡易的なシートを作ってテストしてみると、思ったような積算結果になります。

    どちらのシートも該当部分(時間が入っているセル)の書式設定は、[h]:ssになっています。
    回答頂いた文章中にある、「クリアされていることが保証」については、
    実行する都度、Worksheets("staffTotal").Range("D2:BV21").ClearContentsを実行しています。
    (毎回、staffTotalの該当セルは空にしている)

    なお、SUM関数での積算についてですが、workDataの中には複数スタッフの勤務が記録されており、それぞれのスタッフごとの判別に変数stを用いていますので、積算に必要なセルが連続していません。

    「VBAで時間(00:00形式)を積算(足」の補足画像2
    No.1の回答に寄せられた補足コメントです。 補足日時:2022/11/15 19:37
  • [h]:ssじゃなく、[h]:mmになっています。

      補足日時:2022/11/15 19:39

A 回答 (1件)

こんばんは



>一旦シリアル値(?)に戻して足し算をするとか、そんな雰囲気かと思うのですが、
>具体的な方法がわかりません。
元のシートの値はシリアル値なのですよね?
もしそうなら、値としては数値なので単純に加算をすればよいはずです。
(セルの表示書式を「標準」にした時に示される値です)

ざっと見て気になったのは、
>Worksheets("staffTotal").Cells(st, 43 + n).Value = Worksheets("staffTotal").Cells(st, 43 + n).Value + myTime
で、加算していっているのだと思いますが、セルの最初の値がどうなっているのか不明(=成り行き)だということ。
クリアされていることが保証されているのなら良いのですけれど、そうでなければ、元にあった値に加算されてゆきます。
あるいは、そうなさりたいということでしょうか?
(計算する毎に、元の値との累計を求めたいという意味)


もしも、単純に列の合計値を転記したいのであれば、毎回セルを介さずともSUM関数などで合計を求める方が簡単だと思います。
https://learn.microsoft.com/ja-jp/office/vba/api …

例えば、
For n = 16 To 19
Worksheets("staffTotal").Cells(st, 43 + n).Value = _
WorksheetFunction.Sum(Worksheets("workData").Cells(2, n).Resize(lg - 1))
Next n
この回答への補足あり
    • good
    • 0
この回答へのお礼

色々と見直しているのですが・・・
各担当者のIDからstaffTotalの該当行を割り出すため、

'変数sidは、 workData該当行(i)の担当ID
sid = Worksheets("salesData").Cells(i, 5).Value
'変数sidの番号を、staffTotalの担当IDから探し、staffTotalでの行番号stを取得する
st = Worksheets("staffTotal").Range("A2:A21").Find(sid).Row

こんな処理をしています。
本来、sidが1の時には、staffTotalの2行目に担当ID1番があるのですが、なぜかstaffTotalの11行目(担当ID10番)に入力されてしまいます。
そもそも、この部分で問題があるようなので、一旦、この質問は終了いたします。
迅速なご回答、ありがとうございました!

お礼日時:2022/11/15 20:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!