プロが教える店舗&オフィスのセキュリティ対策術

ExcelでON,OFFの切り替え時間をカウントしたい。

MS Excelにてデータの整理を行っています。
今回、ONとOFFの信号を読み取ってそれを各セルに表示しているのですが、
それをカウントしたいのです。
現在エクセル上では以下のようになっています。

  A  B  C  D
1 時間 信号
2 1  ON
3 2  ON
4 3  ON
5 4  ON
6 5  OFF
7 6  OFF
・ ・  ・
・ ・  ・
・ ・  ・

これらを
(1)トップ(セル番B2)から始め、下のセルをどんどん読んでいく
(2)ONが連続していればカウント続行、OFFになったらカウントを止める。そのカウントをcell C2に入れる。
(3)次は逆にOFFをカウントしていき、同じようにONになったらカウントを止める。そのカウントをcell D2に入れる
(4)(2)と(3)を繰り返し行い、ONのカウントはC列に、OFFのカウントはD列に入力していく。
(5)参照する対象のセルが空白であれば、演算(マクロ?)をストップする。

というふうにしたいのですがよくわかりません。
なお、時間は1セル1秒の間隔になっていますので、セルの数をカウントする方法で構いません。

VBAを使っても構いませんので、どなたかご教授お願いいたします。

A 回答 (4件)

一例です。


各連続する区間をカウントしていますので相違しているようでしたら読み捨て下さい。

Sub カウント()
a = 1
b = 1
For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row
Select Case Cells(i, "B").Value
Case "ON"
If Cells(i, "B") <> Cells(i + 1, "B") Then
Cells(i, "C").Value = a
a = 1
Else
a = a + 1
End If
Case "OFF"
If Cells(i, "B") <> Cells(i + 1, "B") Then
Cells(i, "D").Value = b
b = 1
Else
b = b + 1
End If
End Select
Next i
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございました。
きちんとカウントすることができました。
初心者のため、コードの内容についてはわかりませんので自身で学習してみたいと思います。

お礼日時:2010/10/05 16:15

 もし、勘違いしていたならばすみません。



 作業列を設ければ関数でも可能だと思います。

 例えば、F列とG列を作業列として使用するものとします。
 まず、F2セルに次の数式を入力して下さい。

=IF($B$1="OFF",1,"")

 次に、G2セルに次の数式を入力して下さい。

=IF($B$1="ON",1,"")

 次に、F3セルに次の数式を入力して下さい。

=IF(AND($B2="ON",$B3<>"ON"),COUNT(F$2:F2)+1,"")

 次に、G3セルに次の数式を入力して下さい。

=IF(AND($B2="OFF",$B3<>"OFF"),COUNT(G$2:G2)+1,"")

 そして、F3~G3の範囲をコピーして、予定されるB列の行数を上回るのに充分な回数になるまで、同じ列の4行目以下に貼り付けて下さい。
 次に、C2セルに次の数式を入力して下さい。

=IF(ROWS($1:1)>COUNT($F:$F)-($B$2="OFF"),"",MATCH(ROWS($1:1)+($B$2="OFF"),$F:$F)-MATCH(ROWS($1:1),$G:$G))

 次に、D2セルに次の数式を入力して下さい。

=IF(ROWS($1:1)>COUNT($G:$G)-($B$2="ON"),"",MATCH(ROWS($1:1)+($B$2="ON"),$G:$G)-MATCH(ROWS($1:1),$F:$F))

 そして、C3~D3の範囲をコピーして、予定されるON・OFFの切り換え回数を上回るのに充分な回数になるまで、同じ列の4行目以下に貼り付けて下さい。

 以上でカウント可能になると思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
カウント方法の一例として参考にさせていただきます。

お礼日時:2010/10/05 16:41

VBAは忘れてしまいましたので、少々いい加減ですが、



こんな感じ?
(ActiveSheetが対象。ON、OFF以外の値が出てきたところで停止します。)

Sub sample()
Dim rng As Range
Dim val As String, count As Long

Set rng = ActiveSheet.Cells(1, 2)
ActiveSheet.Columns("C:D").ClearContents
count = 0

Do
 val = rng.Offset(1, 0).Value
 If (val <> "ON" And val <> "OFF") Then Exit Do
 If (val = rng.Value) Then
  count = count + 1
 Else
  Call setCount(count, rng.Value)
  count = 1
  o_val = val
 End If
 Set rng = rng.Offset(1, 0)
Loop
Call setCount(count, rng.Value)
End Sub

Sub setCount(cnt As Long, v As String)
Dim c As Integer
 If (cnt = 0) Then Exit Sub
 If (v = "ON") Then c = 3 Else c = 4
 ActiveSheet.Cells(Rows.count, c).End(xlUp).Offset(1, 0).Value = cnt
End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
実行してみた結果、表示はされましたが、
「ONとOFFどちらか」または「ONとOFFどちらも」実際の値よりも+1されてしまいます。
自身で学習して解析してみたいと思います。

お礼日時:2010/10/05 16:45

値の比較判定を行い、その結果を出力するのはVBAでマクロを作らないと無理と思います。

また、これでは質問でなく「マクロを作ってください。仕様は以下の通りです。」という依頼です。

無料で引き受けてくれる方が出るまで時間がかかると思います。
    • good
    • 0
この回答へのお礼

貴重なご指摘ありがとうございます。
参考までにヒントだけでも教えてくださいという意味で質問させていただきました。

お礼日時:2010/10/05 16:21

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