アプリ版:「スタンプのみでお礼する」機能のリリースについて

機械の稼働時間を管理したいのですが、機械の種類も多く稼働時間が機械によってさまざまです。
機械も途中でストップして、また再開したり、またストップしたりとあるので稼働時間計算がわかりません。
イメージが伝わるかわからないですが、教えて下さい。
VBAは現在勉強中です。

下記はイメージ
・機械の種類5種類1、2、3、4、5
・A列に日付と時間(2012/9/7 2:00)
・B列に機械の番号(1号機)
・C列に状態(スタート・ストップ)

  A           B  C     
1 2012/9/7 2:00  1 スタート  
2 2012/9/7 5:00  2 スタート
3 2012/9/7 10:00 1 途中ストップ
4 2012/9/7 11:30  3 スタート
5 2012/9/7 13:50 2 再スタート
6 2012/9/7 10:00 1 途中ストップ
7 2012/9/7 13:50 2 再スタート
8 2012/9/8 16:00  1 停止
9 2012/9/8 17:00  2 停止


という感じにシート(sheet1)に入力していき、(sheet2)にそれぞれの現在の稼働時間や動いていなければ停止中という表示をしたいのです。
select caseを使って、機械ごとにまずは機械種類(B列)で一番下(新しい行)を検索して、その行の状態(C列)によってス停止なら「停止中」 スタートなら今の時間からスタートの時間合計を表示。
まではできるのですが、途中停止などが何度も入ったりするので、さっぱりわかりません。また、日をまたいだりしてるので時間計算もうまくできません。
説明が下手ですが、イメージ出来たかたは教えて下さい。
よろしくお願い致します。

A 回答 (3件)

これが


  A           B  C     
1 2012/9/7 2:00  1 スタート  
2 2012/9/7 5:00  2 スタート
3 2012/9/7 10:00 1 途中ストップ
4 2012/9/7 11:30  3 スタート
5 2012/9/7 13:50 2 再スタート
6 2012/9/7 10:00 1 途中ストップ
7 2012/9/7 13:50 2 再スタート
8 2012/9/8 16:00  1 停止
9 2012/9/8 17:00  2 停止

機械ごとにシートを分けて
  A     B          C    D
開始時刻    停止時刻     停止種別  経過時間      
2012/9/7 2:00  2012/9/7 12:00   一時   
2012/9/7 13:00  2012/9/7 16:00   終了   
のようなら簡単なのですけどねぇ。
CC_Tさんも危惧しているように、
記入漏れや記入間違いのチェックも含めて考えないと
危なっかしくて使えないとおもいます。
    • good
    • 0

リストでダブりがあったりでおかしいですが、実データはそんなことないだろうという前提で回答します。


一時停止せずに再スタートとか、まさかあり得ないですよね?


機械の状態と、運転スタートからの積算運転時間が知りたいとして、時間の方は「基準時」とステータス変更時間の間で経過時間を計算し、スタートまで遡って積算させるロジックで行けるんじゃないかと。
以下、セル参照や行検索の部分は省略してるから、そのままVBAに入れても動きっこないですが、
ロジックの参考になるでしょうか?(^^;
~~~~~~~~~~~~~~~~~~~~~~~

'---宣言
 dim 「基準時」 as date,「運転時間」 as date
 dim 「機械」 as integer,「判断行」 as integer
 dim 「表示」 as string

'---機械別の処理
for 「機械」=1 to 5   '<--リアルタイム更新しないなら、For~Nextループで済む
  「基準時」=now  '<--これはマクロ実行時を基準とする場合。
  「運転時間」=0
  「判断行」=当該機械の最新状況の入った行数  '<-これ、別ループで検索ね。
 
'---
判断:
 Select case 判断行のステータス
  case 停止 
    「表示」="停止中"
    goto 次の機械
  case スタート
    「表示」="運転中"
    「運転時間」=now-スタート時間
    goto 次の機械
  case 再スタート
    「表示」="運転中"
    「運転時間」=「基準時」-判断行の時間 '(暫定計算)
    goto 次の行 
  case 途中ストップ
    表示="一時停止中"
    「基準時」=判断行の時刻
    goto 次の行 

'---
次の行:
    「判断行」=当該機械の次のステータス変化行。  '<-これも、別ループで検索ね。
    goto 判断
 
'---
表示更新:
   状態表示セル=表示
   運転時間セル=「運転時間」 ’←24時間越対応のため、セルの書式設定は[hh]:mmにして下さい。

'---
次の機械:
next 「機械」

'---

end sub
    • good
    • 0

別のシートや別の表に、整理した表を作りましょう。



以下の表は、元の表を並び替えて、始動、停止の時刻を、2、3、5、6、8、9…29、30行目に繰り返して入力した物です。時刻は「日付と時刻を一緒に、yyyy/mm/dd hh:mmの形式で入力します。

4、7、10、13…行目には、予め、式を入力しておき、表示形式を「hh:mm」にして「時:分」の表示にします。

23行目も、式を入力したら、表示形式を「hh:mm」にして「時:分」の表示にします。

   A      B           C           D
1         1号機        2号機        3号機
2  始動    2012/9/7 2:00  2012/9/7 5:00  2012/9/7 11:30
3  停止    2012/9/7 10:00 2012/9/7 13:50
4  時間    以下の式1     以下の式2      以下の式3
5  始動    2012/9/8 16:00
6  停止 
7  時間    以下の式4     以下の式5      以下の式6
(略)
29 始動
30 停止
31 時間    式は略        式は略        式は略
32 稼動時間 以下の式7     以下の式8      以下の式9
33 状態    以下の式10    以下の式11     以下の式12

式1
=IF(ISBLANK(B2),0,IF(ISBLANK(B3),NOW(),B3)-B2)

式2
=IF(ISBLANK(C2),0,IF(ISBLANK(C3),NOW(),C3)-C2)

式3
=IF(ISBLANK(D2),0,IF(ISBLANK(D3),NOW(),D3)-D2)

式4
=IF(ISBLANK(B5),0,IF(ISBLANK(B6),NOW(),B6)-B5)

式5
=IF(ISBLANK(C5),0,IF(ISBLANK(C6),NOW(),C6)-C5)

式6
=IF(ISBLANK(D5),0,IF(ISBLANK(D6),NOW(),D6)-D5)

式7
=SUMIF(B2:B31,"<2000/1/1",B2:B31)

式8
=SUMIF(C2:C31,"<2000/1/1",C2:C31)

式9
=SUMIF(D2:D31,"<2000/1/1",D2:D31)

式10
=IF(MOD(COUNTIF(B2:B31,">=2000/1/1"),2),"稼働中","停止中")

式11
=IF(MOD(COUNTIF(C2:C31,">=2000/1/1"),2),"稼働中","停止中")

式12
=IF(MOD(COUNTIF(D2:D31,">=2000/1/1"),2),"稼働中","停止中")

式7~9は、個々の始動から停止までの時間のみを抽出して合計する式です。

日付時刻として入力されている物か、始動から停止までの時間が計算された物なのかの判断は「データが2000年よりも小さいか?」で判定しています。

式10~12は「日付時刻として入力されている物を数えて、奇数なら稼働中、偶数なら停止中」と言う式です。

日付時刻として入力されている物か、始動から停止までの時間が計算された物なのかの判断は「データが2000年よりも大きいか?」で判定しています。

稼働中の機器は「NOW()」により現在時刻を使用して計算しているので、F9キーを押すと再計算されて、現在の稼働時間が表示されます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
エクセルではchie65535さんのように稼働時間計算は作成できたのですが、1年分のデータを入力しているとどうしても、ファイルが重くなったり、後から日付を指定して表示出来なくて困ってしまったのでVBAで作成できたらと思い質問しました。
丁寧な回答ありがとうございました。

お礼日時:2012/09/07 19:33

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