• 締切済み

開始、終了日時を検出して並列計算する方法

Excelで以下の計算をしたいのですが、算出方法が分かりません。。。 マクロじゃないと実現しませんか? A列に開始日時、B列に終了日時、C列に任意の数値が存在する以下のようなExcelがあり、 D列に各日の総計を出したいです。 A列の日付けが365日分、同日で複数のデータがあることもあるので 2000行くらいのデータです。 一括で処理したいのですが、D列に開始日時、終了日時の検出し、 重複する場合に足し算をする方法が分からず、どのような関数、数式を入れて解決できますでしょうか。 宜しくお願い致します。 A     B    C  D 開始日時 終了日時 数値 総数 7/10   7/10   1  1 7/11   7/15   2  2 7/12   7/12   1  3 (1+2) 7/12   7/12   2  4 (4+2) 7/12   7/12   1  3 (1+2) 7/13   7/14   3  5 (3+2) 7/14   7/14   1  6 (1+2+3) 7/15   7/16   1  3 ~

みんなの回答

  • kkkkkm
  • ベストアンサー率66% (1746/2622)
回答No.6

> 月日が同じ場合に時間が異なれば足し合わせる方法は If Cells(j, "A").Value = Cells(j - 1, "B").Value Then のところを If Format(Cells(j, "A").Value, "YYYY/mm/dd") = Format(Cells(j - 1, "B").Value, "YYYY/mm/dd") _ And Format(Cells(j, "A").Value, "hh:mm") <> Format(Cells(j - 1, "B").Value, "hh:mm") Then にしてください。 あと最初の方にある Cells(i, "A").Select は不要なので削除しておいてください。

kawaguuu
質問者

お礼

お礼が遅くなり申し訳ございません。 いただいたマクロで求めていた動作になりました! 本当にありがとうございました!

すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率66% (1746/2622)
回答No.5

No4は最初の 7/11   7/15 のデータだけの検索で終わってました。 7/15   7/16 以降も開始日時終了日時を次行でセットして検索 上記のパターンを繰り返して検索するようにしました。 Sub Test() Dim i As Long, j As Long, LastRow As Long Dim mCount As Long: LastRow = Cells(Rows.Count, "A").End(xlUp).Row For i = 2 To LastRow mCount = 0 Cells(i, "A").Select If Cells(i, "A").Value < Cells(i, "B").Value Then Cells(i, "D").Value = Cells(i, "C").Value For j = i + 1 To LastRow If Cells(j, "A").Value < Cells(i, "B").Value Then Cells(j, "D").Value = Cells(j, "C").Value + Cells(i, "C").Value If Cells(j, "A").Value = Cells(j - 1, "B").Value Then Cells(j, "D").Value = Cells(j, "D").Value + Cells(j - 1, "C").Value End If mCount = mCount + 1 ElseIf Cells(j, "A").Value >= Cells(i, "B").Value Then Exit For End If Next Else Cells(i, "D").Value = Cells(i, "C").Value End If i = i + mCount Next End Sub

kawaguuu
質問者

補足

ありがとうございます!!! すごくわかりやすいですし、求めていた挙動になりました!! ちなみになんですが、 >>3行目の12日の開始日時と2行目の終了日時の月日は同じだけど時間が別だから別と考える 月日が同じ場合に時間が異なれば足し合わせる方法は ご提示いただいたマクロのどこを変えればよろしいでしょうか。。。 宜しくお願い致します。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー あ、盲点でした。。。。 ご説明簡単にしたかったので7/12(月/日)としましたが、 本当は開始と修了日時どちらも時間まで吐き出されたデータなんです。。 A     B    C  D 開始日時     終了日時    数値 総数 7/11 12:00  7/15 9:00   2  2 7/12 8:00   7/12 12:00  1  3 (1+2) 7/12 9:00   7/12 14:00  2  4 (2+2) 7/15 8:00   7/16 11:00  1  3 (1+2) 開始と終了が同じ日の分は、別途集計取っていまして。今回算出したかったのは 開始日と終了日が異なる場合(7/11≒7/15)、それ以降の行の開始日時に対して日付けと時間が被る場合、つまり、開始日時が7/15 9:00以前の場合は数値の足し合わせをする。 といった感じです。 こんなまどろっこしいやり方ではなく、単純に日時だけで重複の判定して足し合わせていった方が定義しやすいのでしょうか。 よろしくお願いいたします。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 何度もご回答いただいてすみません、お手数おかけします。 下記(3)の行に()つけ忘れです。申し訳ございません。。 他の余分な行を削除して、下記(0)~(3)の行だけにすると以下のようになります。 (0)7/11   7/15   2  2 (1)7/13   7/14   3  5 (3+2) (2)7/14   7/14   1  6 (1+2+3) (3)7/15   7/16   1  3 (1+2) (0)の数値の2が7/15終了なので(3)まですべての行に加算して、 (1)の数値の3が7/14終了なので(2)の7/14開始と重複とみなして加算されます。 したがって、(2)の行の総数は1+2+3=6となります。 複雑ですみません。複雑だからこそうまく定義できなくて困ってます。涙 ーーーーーーーーーーーーーーーーーーーーー 一部間違えていました。 すみません。 あと、説明が下手で申し訳ないのですが、各行の日付けごとに合計値が出したいです。 A3の7/11の終了日時が7/15なので、同行のC3の数値2がA4~A*の開始日時が7/15を過ぎるまでC4~C*の値に+2して、D列の総数に表示されるようにしたいです。 A     B    C  D 開始日時 終了日時 数値 総数 7/10   7/10   1  1 7/11   7/15   2  2 7/12   7/12   1  3 (1+2) 7/12   7/12   2  4 (2+2) 7/12   7/12   1  3 (1+2) 7/13   7/14   3  5 (3+2) 7/14   7/14   1  6 (1+2+3) 7/15   7/16   1  3 ~

すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率66% (1746/2622)
回答No.4

1) 7/11 12:00  7/15 9:00   2  2 2) 7/12 8:00   7/12 12:00  1  3 (1+2) 3) 7/12 9:00   7/12 14:00  2  4 (2+2) 4) 7/13 9:00  7/14 16:00  3  5 (3+2) 5) 7/14 16:00  7/14 18:00  1  6 (1+2+3) 6) 7/15 8:00   7/16 11:00  1  3 (1+2) 5行目の14日の開始日時と4行目の終了日時の月日と時間が同じだから同一で考える 3行目の12日の開始日時と2行目の終了日時の月日は同じだけど時間が別だから別と考える これで理解できたと思います。7/15 9:00などの日時表記はエクセル上で日時として認識されていると考えているマクロです(数式だとわからないので)。文字として認識されていればちょっと面倒なのでやめておきます(笑) 以下のマクロで試してみてください。 Sub Test() Dim i As Long, j As Long, LastRow As Long Dim mCount As Long: mCount = 0 LastRow = Cells(Rows.Count, "A").End(xlUp).Row For i = 2 To LastRow If Cells(i, "A").Value < Cells(i, "B").Value Then Cells(i, "D").Value = Cells(i, "C").Value For j = i + 1 To LastRow If Cells(j, "A").Value < Cells(i, "B").Value Then Cells(j, "D").Value = Cells(j, "C").Value + Cells(i, "C").Value If Cells(j, "A").Value = Cells(j - 1, "B").Value Then Cells(j, "D").Value = Cells(j, "D").Value + Cells(j - 1, "C").Value End If mCount = mCount + 1 End If Next Else Cells(i, "D").Value = Cells(i, "C").Value End If i = i + mCount Next End Sub

すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率66% (1746/2622)
回答No.3

> (イ)の数値の3が7/14終了なので(ウ)の7/14開始と重複とみなして加算されます。 開始日とすぐ上の行の終了日とが同じなら上の行の数値を加算するとした場合 7/12   7/12   1  3 (1+2) 7/12   7/12   2  4 (2+2) 7/12   7/12   1  3 (1+2) この3行は上記の条件に一致しないのでしょうか。 7/12   7/12   1  3 (1+2) 7/12   7/12   2  5 (2+2+1) 7/12   7/12   1  5 (1+2+2) になりそうなのですが…。

kawaguuu
質問者

補足

あ、盲点でした。。。。 ご説明簡単にしたかったので7/12(月/日)としましたが、 本当は開始と修了日時どちらも時間まで吐き出されたデータなんです。。 A       B       C  D 開始日時    終了日時    数値 総数 7/11 12:00  7/15 9:00   2  2 7/12 8:00   7/12 12:00  1  3 (1+2) 7/12 9:00   7/12 14:00  2  4 (2+2) 7/15 8:00   7/16 11:00  1  3 (1+2) 開始と終了が同じ日の分は、別途集計取っていまして。今回算出したかったのは 開始日と終了日が異なる場合(7/11≒7/15)、それ以降の行の開始日時に対して日付けと時間が被る場合、つまり、開始日時が7/15 9:00以前の場合は数値の足し合わせをする。 といった感じです。 こんなまどろっこしいやり方ではなく、単純に日時だけで重複の判定して足し合わせていった方が定義しやすいのでしょうか。 よろしくお願いいたします。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 何度もご回答いただいてすみません、お手数おかけします。 下記(3)の行に()つけ忘れです。申し訳ございません。。 他の余分な行を削除して、下記(0)~(3)の行だけにすると以下のようになります。 (0)7/11   7/15   2  2 (1)7/13   7/14   3  5 (3+2) (2)7/14   7/14   1  6 (1+2+3) (3)7/15   7/16   1  3 (1+2) (0)の数値の2が7/15終了なので(3)まですべての行に加算して、 (1)の数値の3が7/14終了なので(2)の7/14開始と重複とみなして加算されます。 したがって、(2)の行の総数は1+2+3=6となります。 複雑ですみません。複雑だからこそうまく定義できなくて困ってます。涙 ーーーーーーーーーーーーーーーーーーーーー 一部間違えていました。 すみません。 あと、説明が下手で申し訳ないのですが、各行の日付けごとに合計値が出したいです。 A3の7/11の終了日時が7/15なので、同行のC3の数値2がA4~A*の開始日時が7/15を過ぎるまでC4~C*の値に+2して、D列の総数に表示されるようにしたいです。 A     B    C  D 開始日時 終了日時 数値 総数 7/10   7/10   1  1 7/11   7/15   2  2 7/12   7/12   1  3 (1+2) 7/12   7/12   2  4 (2+2) 7/12   7/12   1  3 (1+2) 7/13   7/14   3  5 (3+2) 7/14   7/14   1  6 (1+2+3) 7/15   7/16   1  3 ~

すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率66% (1746/2622)
回答No.2

上から見ていって終了日時(同行B列)が開始日時(同行A列)より後の場合(条件X)、下方向に開始日時(A列)だけを見て検索「B列は無視} 条件Xが一致した行のB列の終了日時より検索対象行の開始日時が大きくなるまで検索対象行の数値に条件Xが一致した行の数値を加算する。 次は大きくなった行から同じように操作する。 と理解したので、 7/13   7/14   3  5 (3+2) までは分かったのですが 7/14   7/14   1  6 (1+2+3) 7/15   7/16   1  3 この二つの関係がわからないのです(ともに15日は超えていないのに+2ではないのかと)…頭悪くてすみません。

kawaguuu
質問者

補足

何度もご回答いただいてすみません、お手数おかけします。 最終行の総数に()つけ忘れです。申し訳ございません。。 他の余分な行を削除して、下記(ア)~(エ)の行だけにすると以下のようになります。 (ア)7/11   7/15   2  2 (イ)7/13   7/14   3  5 (3+2) (ウ)7/14   7/14   1  6 (1+2+3) (エ)7/15   7/16   1  3 (1+2) (ア)の数値の2が7/15終了なので(エ)まですべての行に加算して、 (イ)の数値の3が7/14終了なので(ウ)の7/14開始と重複とみなして加算されます。 したがって、(ウ)の行の総数は1+2+3=6となります。 ややこしくてすみません。複雑だからこそうまく定義できなくて困ってます。涙 ーーーーーーーーーーーーーーーーーーーーー 一部間違えていました。 すみません。 あと、説明が下手で申し訳ないのですが、各行の日付けごとに合計値が出したいです。 A3の7/11の終了日時が7/15なので、同行のC3の数値2がA4~A*の開始日時が7/15を過ぎるまでC4~C*の値に+2して、D列の総数に表示されるようにしたいです。 A     B    C  D 開始日時 終了日時 数値 総数 7/10   7/10   1  1 7/11   7/15   2  2 7/12   7/12   1  3 (1+2) 7/12   7/12   2  4 (2+2) 7/12   7/12   1  3 (1+2) 7/13   7/14   3  5 (3+2) 7/14   7/14   1  6 (1+2+3) 7/15   7/16   1  3 ~

すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率66% (1746/2622)
回答No.1

A列開始日時とB列終了日時が同一のものの、C列の数値の合計(例示しているものは結果がそうなっていないのでよく分かりませんが)だとしたら B2に =SUMPRODUCT(($A$2:$A$3000=A2)*($B$2:$B$3000=B2)*($C$2:$C$3000)) で下にコピーで…。

kawaguuu
質問者

補足

一部間違えていました。 すみません。 あと、説明が下手で申し訳ないのですが、各行の日付けごとに合計値が出したいです。 A3の7/11の終了日時が7/15なので、同行のC3の数値2がA4~A*の開始日時が7/15を過ぎるまでC4~C*の値に+2して、D列の総数に表示されるようにしたいです。 A     B    C  D 開始日時 終了日時 数値 総数 7/10   7/10   1  1 7/11   7/15   2  2 7/12   7/12   1  3 (1+2) 7/12   7/12   2  4 (2+2) 7/12   7/12   1  3 (1+2) 7/13   7/14   3  5 (3+2) 7/14   7/14   1  6 (1+2+3) 7/15   7/16   1  3 ~

すると、全ての回答が全文表示されます。

関連するQ&A