Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
時刻集計
投稿日時: 21/11/15 21:50:36
投稿者: Excel苦手

時間が入力されているセルを集計し、
別シートのセルに記述させたいが、
別シートのセルに記述させるときに、
アプリケーション定義エラーになってしまう。
 
エラーにならず別シートに記述させることが
出来る時もある。
 
Dim Kadou As Date
Dim Teishi As Date
 
Sheets("Base").select
n=2
Do Until Cells(n,"A") = ""
   If Cells(n,"J") = 1 then
      Kadou = Cells(n,"A")
   Else
     Teishi = Cells(n,"A")
   End If
   n = n + 1
Loop
 
Sheets("Out").select
CT = 9
Do Until Cells(CT, "B") = ""
   CT = CT + 1
Loop
Cells(CT,"E") = Kadou + Teihi <--- アプリケーション定義エラーになる
Cells(CT,"G") = Kadou
Cells(CT,"I") = Teihi  <--- アプリケーション定義エラーになる
セルE:F,G:H,I:Jは結合されたセルです。
アプリケーション定義エラーになった際のTeishには、6:39:15の値が入っています。
Teishiに強制で、20:00:00と値を代入した際には、アプリケーション定義エラーにはなりません。
 
何が原因かわからず困っています。
よろしくお願いします。

回答
投稿日時: 21/11/15 22:38:02
投稿者: WinArrow
投稿者のウェブサイトに移動

> If Cells(n,"J") = 1 then
この条件は、どのような意味でしょうか?
 
この条件で加算した側でエラーが出ているような気がします。
 
そこで、質問します。
 
>アプリケーション定義エラーになった際のTeishには、6:39:15の値が入っています。
 
これは、どの様に確認しましたか?
 
代入するセルのデータ型はどのようになっていますか?
 
 
 
 
 

投稿日時: 21/11/16 05:58:10
投稿者: Excel苦手

ありがとうございます。
  
 >> If Cells(n,"J") = 1 then
 >この条件は、どのような意味でしょうか?
 稼働区分になります。
 稼働区分が1だと、KadouにA列の時刻を足し算します。
  
この条件で加算した側でエラーが出ているような気がします。
  
    
 >>アプリケーション定義エラーになった際のTeishには、6:39:15の値が入っています。
>これは、どの様に確認しましたか?
デバッグで停止した際に、変数Teishiにマウスポインタを合わせてみた時に
表示されてました。
   
 >代入するセルのデータ型はどのようになっていますか?
h:mm:ssになっています。
  
一か所記載ミスがありました。
Do Until Cells(n,"A") = ""
     If Cells(n,"J") = 1 then
        Kadou = Kadou + Cells(n,"A")
     Else
       Teishi = Teishi + Cells(n,"A")
     End If
     n = n + 1
  Loop
   
お願いします。

回答
投稿日時: 21/11/16 11:31:15
投稿者: WinArrow
投稿者のウェブサイトに移動

回答ありがとうございます。
 
いままでの説明だけでは、原因を推測する音は非常に難しいです。
この手の問題は、回答者側で再現するだけの説明が必要です。
 
投稿する際の注意事項として
・掲示板に記述するコードは、手入力ではなくコードペインをコピペすること。
・変数宣言部は省略しないこと。
  現象に関係しないと判断しても・・・
・エラーメッセ―ジは、省略しないこと。
 アプリケ―ション定義エラーだけでは不十分
 
以上のことを踏まえて、不足していることを追加して
再掲示をお願いします。
 
 
なお、一般機能の関数で
SUMIF関数を使ってみて検証してみましょう。
 
仮に、A2〜A14にデータが入っているとして、
 
任意のセルに
=SUMIF(J2:J14,1,A2:A14)
その隣のセルに
=SUMIF(J2:J14,"<>1",A2:A14)
 

回答
投稿日時: 21/11/16 17:10:51
投稿者: WinArrow
投稿者のウェブサイトに移動

推測ですが、
A列のどこかのセルにマイナス値が入っているものと思います。
 
確認方法
セルに"########"のように表示されていれば、そこは、マイナス値がはいっています。

回答
投稿日時: 21/11/16 18:40:12
投稿者: WinArrow
投稿者のウェブサイトに移動

アドバイス
 
(1)極力、ループ処理を使わない
 セルのアクセスは時間が掛かります。
 今回の場合、配列関数(SUMIF関数)を使うことで、処理時間が短縮可能です。
  シートの中の空き行(データが入っている行の次の行)を求めるコードを使う。
(2)シートをSelectやAcivateしない。
  シートをSelect(前面に移動する必要はない。)しなくても処理はできます。
(3)セルは、シートで修飾うる
  可読性の向上+処理時間の短縮
 
↓参考コード(A列にマイナスチェックが掛かっています)

Sub Samle()
Dim LastRow As Long, DATALIST As Range
Dim kadou As Date, Teishi As Date
    With Sheets("Base")
        LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
        Set DATALIST = .Range(.Cells(2, "A"), .Cells(LastRow, "A"))
        If WorksheetFunction.CountIf(DATALIST, "<0") > 0 Then
            MsgBox "A列データにマイナス値が含まれています。"
            Exit Sub
        End If
        kadou = WorksheetFunction.SumIf(.Range(.Cells(2, "J"), .Cells(LastRow, "J")), 1, DATALIST)
        Teishi = WorksheetFunction.SumIf(.Range(.Cells(2, "J"), .Cells(LastRow, "J")), "<>1", DATALIST)
    End With
    With Sheets("Out")
        LastRow = .Range("B" & .Rows.Count).End(xlUp).Row + 1
        .Cells(LastRow, "E").Value = kadou + Teishi
        .Cells(LastRow, "G").Value = kadou
        .Cells(LastRow, "I").Value = Teishi
    End With
End Sub

 

回答
投稿日時: 21/11/16 18:58:15
投稿者: WinArrow
投稿者のウェブサイトに移動

アドバイスその2

引用:

 >>アプリケーション定義エラーになった際のTeishには、6:39:15の値が入っています。
>これは、どの様に確認しましたか?
デバッグで停止した際に、変数Teishiにマウスポインタを合わせてみた時に
表示されてました。

 
マウスポインタを合わせた時、データ型が「Date」の場合、「値」がマイナスでもプラスで表示されます。
注意が必要ですね・・・・
 

投稿日時: 21/11/17 17:20:29
投稿者: Excel苦手

ありがとうございます。
 
実際のコードをコピペしたほうが良い事
データ型が「Date」の場合、「値」がマイナスでもプラスで表示される事
LoopやSelectを極力使用しない方がよい事
アドバイスありがとうございます。
 
コードを書けば書くほど、頭の中が無限ループしています。
 
やりたいことと全コード記述します。
 
baseシート
A〜K列まであるが、A,C,J列のみ使用します。
J列の区分は、0と3が停止 1と2が稼働
    A C J
10:01:00 材料A 0
10:02:00 材料A 0
10:03:00 材料A 1
10:04:00 材料A 1
10:05:00 材料A 2
10:06:00 材料A 2
10:07:00 材料B 1
10:08:00 材料B 1
10:09:00 材料B 3
10:10:00 材料B 3
::
 
Outシート
         総時間   稼働時間   停止時間
材料A  05:00    03:00     02:00
材料B  03:00    02:00     01:00
 
 
Sub 時間集計()
  Dim i As Integer
  Dim n As Integer
  Dim CT As Integer
  Dim wRow As Integer
  Dim Item As Integer
  Dim Key1 As String
  Dim Key2 As String
  Dim Total As Date
  Dim Sabun As Date
  Dim Kadou As Date
  Dim KadouS As Date
  Dim KadouE As Date
  Dim Teishi As Date
  Dim TeishiS As Date
  Dim TeishiE As Date
 
  Do Until Cells(n, "A") = ""
     Key1 = Cells(n, "C")
 
     Do While Key1 = Cells(n, "C")
 
        If Key1 <> Cells(n, "C") Then
           If Cells(n, "J") = "1" Or Cells(n, "J") = "2" Then
              KadouS = Cells(n, "A")
           ElseIf Cells(n, "J") = "0" Or Cells(n, "J") = "3" Then
              TeishiS = Cells(n, "A")
           End If
        Else
 
★材料は同じでも区分が停止→稼働 / 稼働→停止になるタイミングの
             時間取得に悩んでいます。★

             
        End If
         
        If Cells(n, "J") = "1" Or Cells(n, "J") = "2" Then
           KadouE = Cells(n, "A")
        ElseIf Cells(n, "J") = "0" Or Cells(n, "J") = "3" Then
           TeishiE = Cells(n, "A")
        End If
         
        Sabun = Cells(n + 1, "A") - Cells(n, "A")
        If Sabun <= "0:30:00" Then
           Kadou = KadouE - KadouS
           Teishi = TeishiE - TeishiS
        End If
        n = n + 1
     Loop
          
     Sheets("Out").Select
     CT = 9
     Do Until Cells(CT, "B") = ""
        If Cells(CT, "B") = Key1 Then
           Kadou = Kadou + Cells(CT, "G")
           Teishi = Teishi + Cells(CT, "I")
           Exit Do
        End If
        CT = CT + 1
     Loop
     Cells(CT, "B") = Key1
     Cells(CT, "G") = Kadou
     Cells(CT, "I") = Teishi
     Cells(CT, "E") = Cells(CT, "G") + Cells(CT, "I")
     Range("E39") = Range("G39") + Range("I39")
     Range("G39") = Range("G39") + Kadou
     Range("I39") = Range("I39") + Teishi
     Kadou = 0
     KadouS = 0
     KadouE = 0
     Teishi = 0
     TeishiS = 0
     TeishiE = 0
     Sheets("base").Select
  Loop
   
  Sheets("Out").Select
 
End Sub
 
よろしくお願いします。

回答
投稿日時: 21/11/17 20:57:22
投稿者: WinArrow
投稿者のウェブサイトに移動

コードの中で
 
稼働開始時刻

停止開始時刻
の考え方について
 
稼働開示時刻は、前回の停止終了時刻ではないのですか?
 

引用:

10:01:00 材料A 0
10:02:00 材料A 0
10:03:00 材料A 1
10:04:00 材料A 1
10:05:00 材料A 2
10:06:00 材料A 2

引用:

Outシート
         総時間   稼働時間   停止時間
材料A  05:00    03:00     02:00

この例では
10:01:00〜10:02:00 差:1:00(停止)
10:03:00〜10:06:00 差:3;00稼働)
10:01:00〜10:06:00 差:5:00(材料Aの合計)
つまり、停止→稼働に移る間の1分が計算には入っていない。
シート(out)とも異なりますが・・・・・
 
  

回答
投稿日時: 21/11/17 21:01:47
投稿者: WinArrow
投稿者のウェブサイトに移動

もう一つ

引用:
Do Until Cells(n, "A") = ""

この時点(処理の最初)では、
変数:nがoになっているはず。→エラーになります。

投稿日時: 21/11/17 21:24:00
投稿者: Excel苦手

ありがとうございます。
 
Do Until Cells(n, "A") = ""
 
>この時点(処理の最初)では、
> 変数:nがoになっているはず。→エラーになります。
コメントアウトしていたものを削除した時に誤って
n=2を削除してしまったようです。
 
失礼しました。
 
>10:01:00〜10:02:00 差:1:00(停止)
>10:03:00〜10:06:00 差:3;00稼働)
>10:01:00〜10:06:00 差:5:00(材料Aの合計)
>つまり、停止→稼働に移る間の1分が計算には入っていない。
停止→稼働に移るときの1分は計算に含めないとダメでした。
 
材料が変わるときの時間は含めません。
10:06:00 材料A 2
10:07:00 材料B 1
上記の1分はどちらにも含めません。

回答
投稿日時: 21/11/17 21:36:50
投稿者: simple

横から失礼します。理解力が足りなくて恐縮です。
 
(Q1)
提示されたデータ
10:01:00 材料A 0
10:02:00 材料A 0
10:03:00 材料A 1
10:04:00 材料A 1
10:05:00 材料A 2
10:06:00 材料A 2
10:07:00 材料B 1
10:08:00 材料B 1
10:09:00 材料B 3
10:10:00 材料B 3
の時の、想定結果はどうなるのが望ましいのですか?
また、実際の結果は、どうなるんですか?
 
(Q2)
10:01:00 材料A 0
で始まっているのはなぜですか?
0 というのは、状態なんですか?
それとも停止させたという動作を表すのですか?
後者とすると、それが2回続くのはなぜですか?
 
(Q3)
A列の時刻は、1分刻みと決まっていて、
その時の状態を示すのですか?それとも?
 
(Q4)
10:06:00 材料A 2
10:07:00 材料B 1
材料Aは継続したままなんですか?
二つの材料を同時に使って作業することがあるんですか?
 
他人に説明されているのですから、現実的な、そして内容を説明できるものを
説明とともに提示してもらえませんか?
 
疑問だらけで恐縮ですが、説明してください。
 
# 直前の回答を読んでいない状態で質問することを了解ください。

回答
投稿日時: 21/11/17 22:37:43
投稿者: WinArrow
投稿者のウェブサイトに移動

質問
 
例示は、分単位となっています。
最初の質問時には、"6:39:15"という話が出ているのですが、
実際は、どうなんですか?
 
KEYが変わったときの空白時間は計算しない。
同一KEYの中で、
稼働→停止の切替では、空白時間を加算する。
停止に加算するのか?
稼働に加算するのか?
どちらでしょうか?
 
区分の切替パターンは?整理すると何か見えてきませんか?
パターン1:0→1→2→3
パターン2:0→1→2・・・・・例示の材料A
パターン3:1→2→3
パターン4;1→3 ・・・・・・例示の材料B
パターン5:2→3
パターン6:2→0
 
 
 
 
 

回答
投稿日時: 21/11/18 07:20:46
投稿者: simple

大分、素朴な質問をしてしまったようです。
基本的には、一行ごとに判定していけばよいのでは?

・次の観察時刻(n+1)の材料が現在(n)の材料と同一で、
  status が 1 または 2  
   ⇒  時刻(n+1) -時刻 (n) を、現在の材料 の稼働時間にセット
・次の観察時刻(n+1)の材料が現在(n)の材料と同一で、
  status が 0 または 3  
   ⇒  時刻(n+1) -時刻 (n) を、現在の材料 の停止時間にセット
・それ以外(現在の材料と、次の観測時点の材料が異なる)
   ⇒ノーカウント

【データと結果例】
 
   A列          C列       J列     L          M         N         O    
 1                                 材料A                材料B
 2                                 稼働時間   停止時間  稼働時間  停止時間
 3 10:01:00      材料A      0                   0:01:00         
 4 10:02:00      材料A      0                   0:01:00         
 5 10:03:00      材料A      1       0:01:00                 
 6 10:04:00      材料A      1       0:01:00                 
 7 10:05:00      材料A      2       0:01:00                 
 8 10:06:00      材料A      2                                       
 9 10:07:00      材料B      1                            0:01:00 
10 10:08:00      材料B      1                            0:01:00 
11 10:09:00      材料B      3                                       0:01:00
12 10:10:00      材料B      3                                       

骨子はこんな感じでできるのでは?
確認のため、あえてワークシートに結果を書き出しています。
【コード例】
Sub test()
    Dim material$, next_material$
    Dim t0 As Date, t1 As Date
    Dim status&
    Dim k&

    For k = 3 To Cells(Rows.Count, "A").End(xlUp).Row
        material = Cells(k, "C")
        next_material = Cells(k + 1, "C")
        t0 = Cells(k, "A")
        t1 = Cells(k + 1, "A")
        status = Cells(k, "J")
        Select Case True
            Case material = next_material And (status = 0 Or status = 3)
                Select Case material
                    Case "材料A": Cells(k, "M") = t1 - t0
                    Case "材料B": Cells(k, "O") = t1 - t0
                End Select
            Case material = next_material And (status = 1 Or status = 2)
                Select Case material
                    Case "材料A": Cells(k, "L") = t1 - t0
                    Case "材料B": Cells(k, "N") = t1 - t0
                End Select
            Case Else
        End Select
    Next
End Sub

合計の計算は省略しています。追加可能でしょう。
なお、最終行は、停止状態で終わるのか、継続状態でおわるのか不明ですので、
判断していません。そちらで決めてください。

回答
投稿日時: 21/11/18 13:56:24
投稿者: simple

Select Caseの中の判定順序が説明と逆になっていますが、特段の意図はありません。
記載の順序によりません。
(コードは基本部分だけですから、もし考え方がこれでOKなら、
材料の数を可変にしたり、合計時間を作成したりということになるでしょう。)

投稿日時: 21/11/18 16:00:25
投稿者: Excel苦手

WinArrowさん、ありがとうございます。
>最初の質問時には、"6:39:15"という話が出ているのですが、
>実際は、どうなんですか?
作業を進めていく中で、アプリケーションの定義エラーが解消されました。
 
>KEYが変わったときの空白時間は計算しない。
はい。計算しません
>同一KEYの中で、稼働→停止の切替では、空白時間を加算する。
計算しないです。すみません。最初の説明が正しくできていませんでした。
 
simpleさん、ありがとうございます。
私が記述したコードがこんなに短くできることに感動しています。
ありがとうございます。
>(コードは基本部分だけですから、もし考え方がこれでOKなら、
> 材料の数を可変にしたり、合計時間を作成したりということになるでしょう。)
合計時間の足し算は可能です。
材料の数を可変にする方法を教えて頂きたいです。
 
また、ワークシートに書かない方法も教えて頂ければ幸いです。
Select Caseがこのような使い方ができることにびっくりしています。
>Case "材料A": Cells(k, "M") = t1 - t0
 
もう1点教えてください。
材料が同じで、区分が0or3から1or2に変更になったときに、
処理を抜けさせる時の、条件の書き方を教えてください。
 
よろしくお願いします。

回答
投稿日時: 21/11/18 18:01:22
投稿者: simple

Sub test()
    Dim dicW As Object, dicI As Object  ' W:working,  I:idleのつもり
    Dim material$, next_material$       ' 型宣言子($)は、 As Stringと同じ
    Dim t0 As Date, t1 As Date
    Dim status&                         ' 型宣言子(&)は、 As Longと同じ
    Dim k&
    
    Set dicW = CreateObject("Scripting.Dictionary") 
    Set dicI = CreateObject("Scripting.Dictionary")

    '材料をkeyに,時間をitemに持つ辞書を作成(時間は初期設定)
    Dim s As String
    For k = 3 To Cells(Rows.Count, "C").End(xlUp).Row
        s = Cells(k, "C").Value
        dicW(s) = 0
        dicI(s) = 0
    Next
    
    '一件ごとに判定して、時間を加算していく
    For k = 3 To Cells(Rows.Count, "A").End(xlUp).Row
        material = Cells(k, "C")
        next_material = Cells(k + 1, "C")
        t0 = Cells(k, "A")
        t1 = Cells(k + 1, "A")
        status = Cells(k, "J")
        Select Case True
            Case material = next_material And (status = 1 Or status = 2)
                dicW(material) = dicW(material) + t1 - t0
            Case material = next_material And (status = 0 Or status = 3)
                dicI(material) = dicI(material) + t1 - t0
            Case Else
        End Select
    Next
    
    '結果の書き出し
    Dim cnt&
    [N2] = "稼働時間": [O2] = "停止時間"
    Cells(2, "M").CurrentRegion.NumberFormatLocal = "h:mm:ss"
    
    cnt = dicW.Count
    Cells(3, "M").Resize(cnt, 1) = Application.Transpose(dicW.keys)
    Cells(3, "N").Resize(cnt, 1) = Application.Transpose(dicW.items)
    Cells(3, "O").Resize(cnt, 1) = Application.Transpose(dicI.items)
End Sub

以下の形式で結果を出力します。
 
        稼働時間    停止時間
材料A   0:03:00     0:02:00
材料B   0:02:00     0:01:00

なお、最後の質問は私には意味がわかりませんでした。
途中で作業をやめるのですか?

回答
投稿日時: 21/11/18 22:57:21
投稿者: simple

引用:
もう1点教えてください。
材料が同じで、区分が0or3から1or2に変更になったときに、
処理を抜けさせる時の、条件の書き方を教えてください。

・モデル例(10件以内のデータにしてください)
・想定結果
を示してください。

投稿日時: 21/11/19 12:26:59
投稿者: Excel苦手

simpleさんありがとうございます。
 
教えていただいたコードでやりたかったことができそうです。
コードを実行してみたのですが、少し時間に差がありました。
私の説明が悪く、どのように伝えればよいのかわからず。
 
少し長いですが、実際のデータと結果を掲載させていただきます。
また、同一材料はいま合算出来るようになっていますが、
下記のように、材料Aと材料Bが入り混じった際に、
最下部にパターン2のように計算結果が出るようにできますか?
パターン1の方法と2種類作成できるようにしたいです。
 
11:16:40    材料A    1
11:16:50    材料A    2
11:17:00    材料A    2
11:17:10    材料A    2
11:17:20    材料A    2
11:17:30    材料A    2
11:17:40    材料A    2
11:17:50    材料A    2
11:18:00    材料A    2
11:18:10    材料A    2
11:18:20    材料A    2
11:18:30    材料A    3
11:18:40    材料A    0
11:18:50    材料A    0
11:19:00    材料A    0
11:19:10    材料A    0
11:19:20    材料A    0
11:20:00    材料A    0
11:20:10    材料A    0
11:20:20    材料A    0
11:20:30    材料A    0
11:20:40    材料A    0
11:20:50    材料B    0
11:21:00    材料B    0
11:21:10    材料B    1
11:21:20    材料B    2
11:21:30    材料B    2
11:21:40    材料B    2
11:21:50    材料B    2
11:22:00    材料B    2
11:22:10    材料B    2
11:22:20    材料B    3
11:22:30    材料B    0
11:22:40    材料B    0
11:22:50    材料A    0
11:23:00    材料A    0
11:23:10    材料A    0
11:23:20    材料A    0
11:23:30    材料A    0
13:00:05    材料A    0
13:00:15    材料A    0
13:00:25    材料A    0
13:00:35    材料A    1
13:00:45    材料A    2
13:00:55    材料A    2
13:01:05    材料A    3
13:01:15    材料A    0
13:01:25    材料A    0
13:01:35    材料A    0
        
パターン1      稼働時間    停止時間
   材料A    0:02:00     0:03:40
   材料B    0:01:00     0:00:30
        
パターン2      稼働時間    停止時間
   材料A    0:01:40     0:02:10
   材料B    0:01:00     0:00:30
   材料A    0:00:20     0:01:30

回答
投稿日時: 21/11/19 15:03:55
投稿者: simple

引用:
コードを実行してみたのですが、少し時間に差がありました。
私の説明が悪く、どのように伝えればよいのかわからず。

まだ説明されていないことがあるのなら、当方では不可能です。
説明するのは質問者さんの務めだとおもいますよ。
 
材料が変わる都度
材料名     稼働時間     停止時間
を表の右側に書いていき、それをワークシート関数(SUMIF等)で集計するのが
早いのではないですか?
 
とりあえず、私はここまでとさせてください。

投稿日時: 21/11/19 16:29:59
投稿者: Excel苦手

simpleさん、ありがとうございました。
 
> 説明するのは質問者さんの務めだとおもいますよ。
すみません。
説明の書き方が不十分なようでした。
色々とありがとうございました。
 
教えていただいた内容をもとに考えてみます。
すみませんでした。

回答
投稿日時: 21/11/19 18:19:45
投稿者: WinArrow
投稿者のウェブサイトに移動

Excel苦手 さんの引用:

パターン1      稼働時間    停止時間
   材料A    0:02:00     0:03:40
   材料B    0:01:00     0:00:30
        
パターン2      稼働時間    停止時間
   材料A    0:01:40     0:02:10
   材料B    0:01:00     0:00:30
   材料A    0:00:20     0:01:30

 
パターン1の材料Aの停止時間

パターン2の2番目の材料Aの停止時間
の集計値は、どの様に計算したのですか?
 
途中に
>13:01:05
という行があるから、1時間以上になると思いますが・・・

回答
投稿日時: 21/11/19 18:27:13
投稿者: WinArrow
投稿者のウェブサイトに移動

区分の切替パターンの整理をアドバイスしたが、
キチンと整理されていないようですね・
 
いままでの説明の中では、稼働→停止、停止→稼働、材料が変わったときの時間差は計算しないと
いう説明してきているが、
区分切替時の時間差を加算したり、しなかったり、統一性がない。

回答
投稿日時: 21/11/19 18:28:18
投稿者: WinArrow
投稿者のウェブサイトに移動

区分の切替パターンの整理をアドバイスしたが、
キチンと整理されていないようですね・
 
いままでの説明の中では、稼働→停止、停止→稼働、材料が変わったときの時間差は計算しないと
いう説明してきているが、
区分切替時の時間差を加算したり、しなかったり、統一性がない。

投稿日時: 21/11/19 19:49:44
投稿者: Excel苦手

WinArrowさん、ありがとうございます。
 
本当に申し訳ございません。
また、書き忘れています。
30分以上の時間差は、稼働にも停止にも含めません。
すみません。
 
設備の関係で、突如流す材料が変わったり、
前方が詰まったりすると、停止したりするので、
その都度条件の見直しが発生しています。
 
質問内容がコロコロ変わってしまい、
せっかくご指導いただいているのに、誠に申し訳ございません。
 
教えていただいているコードを確認し、考え方整理します。
ありがとうございます。

回答
投稿日時: 21/11/19 23:29:22
投稿者: WinArrow
投稿者のウェブサイトに移動

条件を整理する意味で
コードを作成する前に、数式で検証してみましょう。
 
上記データをシートに展開します。
(実際の表ではなく作業用シートを用意するとよいでしょう)
A列:時刻
B列:材料
C列:区分1
D列:区分2
E列:稼働時間1
F列:停止時間1
G列:稼働時間2
H列:停止時間2
 
1行目は項目タイトルとする
E〜H列は、表示形式("0:mm:ss")セット
A〜Cは、上記データの通り
D列:=IF(Or(C2=1,C2=2),"A","B")
E列:=IF(OR($C2<>$C1,$B2<>$B1,SUM($A2,SUM($A1)*-1)>=TIME(0,30,0)),0,IF(OR($C2=1,$C2=2),$A2-$A1,0))
F列:=IF(OR($C2<>$C1,$B2<>$B1,SUM($A2,SUM($A1)*-1)>=TIME(0,30,0)),0,IF(OR($C2=0,$C2=3),$A2-$A1,0))
G列:=IF(OR($D2<>$D1,$B2<>$B1,SUM($A2,SUM($A1)*-1)>=TIME(0,30,0)),0,IF($D2="A",$A2-$A1,0))
H列:=IF(OR($D2<>$D1,$B2<>$B1,SUM($A2,SUM($A1)*-1)>=TIME(0,30,0)),0,IF($D2="B",$A2-$A1,0))
 
D2〜H2を下へフィルコピー
 
集計は。「データ」タブの「小計」を使います。
B列をキーにして、E〜Hを集計します。
数式を見れば条件が分かるはずです。
※「SUM($A2,SUM($A1)*-1)」は、時間差を求める数式

投稿日時: 21/11/25 09:18:51
投稿者: Excel苦手

WinArrowさんありがとうございました。
 
計算式で差を求めたものを集計する方法で、無事解決しました。
ありがとうございました。
 
また、お礼が遅くなり申し訳ございませんでした。