エクセルを使用して以下のある数値を知りたいです。

今、ある数値が100.05になっており刻々と0.01づつ変化しています。
100.05→100.06→100.07→100.06→100.07→100.06
上記の様に上下どちらに動くは不明です。

さて知りたい数値とは99.00や100.00や101.00など小数点以下が00の時のラインを踏んだ回数です。
但し以下の条件があります。
※同じラインを上下している場合はカウントしない。

例)カウント3の場合
99.99→100.00→100.01→(省略)→100.99→101.00→100.99→(省略)→100.01→100.00
上記では100.00と101.00と100.00を踏んでいます。

例)カウント1の場合
99.99→100.00→99.99→100.00→100.01→100.00→100.01→100.00→99.99
上記では100.00で一度カウントされているものの他のラインを踏んでいないために同じライン上での上下はカウントされません。

以上、計算の仕方(アルゴリズム)をご教授ください。
宜しくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2008/08/29 05:55:30
  • 終了:2008/08/29 23:41:42

ベストアンサー

id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912008/08/29 09:37:28

ポイント60pt

値が刻々と変化というのは、特定セルの値が変化しているのでしょうか。

それとも時系列で変化している値が並んでいるのでしょうか。


後者であれば、たとえばA列に対象となるデータがある場合、下記のような計算式

で取得できると思います。

A B C
1 100.05 =INT(A1) =IF(MOD(INT(A1*100),100)=0,1,0)
2 100.04 =IF(MOD(INT(A2*100),100)=0,INT(A2),B1) =IF(B1=B2,C1,C1+1)
3 100.05 以下B2をコピー 以下C2をコピー

でC列にカウントした値が表示されます。


前者の場合は、VBA のWorksheet_Change 関数を使用すれば下記のようになるでしょうか。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub
    
    Application.EnableEvents = False
    If (CInt(Range("A1") * 100) Mod 100) = 0 Then
        If Range("C1").Value <> CInt(Range("A1").Value) Then
            Range("C1").Value = CInt(Range("A1").Value)
            Range("B1").Value = Range("B1").Value + 1
        End If
    End If
    Application.EnableEvents = True
End Sub

A1が値、B1がカウント、C1が直前の整数値です。


いずれにせよ、直前の値を保持しそれと比較した結果をカウントするのが

基本的な考え方になります。

id:spyglass

説明が抜けておりましたが後者のセルの変化値のカウントです。

完璧な答えです、イルカ賞です。

有難う御座いました。

2008/08/29 23:39:38

その他の回答(2件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332008/08/29 07:29:03

ポイント10pt

VBAを使うという前提で回答します。


  • カウンタ C に 0 を代入
  • 直前の値 OLD に -1 (あり得ない値)を代入
  • 繰り返し開始
    • 検査する値を取り出し N に代入
    • N の小数点以下を取り出し F に代入 F = N - int(N)
    • if (F <> 0 and N <> OLD) then
      • カウンタ C をインクリメント C = C + 1
    • 直前の値 OLD に N を代入する
  • 繰り返し終了
id:spyglass

100.05→100.06→100.07→100.06→100.07→100.06

上記を試してみたところまだ小数点以下"00"を踏んでいないにも関わらず全てでインクリメントが発生しました。

逆に100.00を踏むとインクリメントされません。

NGの様です。

2008/08/29 23:39:27
id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912008/08/29 09:37:28ここでベストアンサー

ポイント60pt

値が刻々と変化というのは、特定セルの値が変化しているのでしょうか。

それとも時系列で変化している値が並んでいるのでしょうか。


後者であれば、たとえばA列に対象となるデータがある場合、下記のような計算式

で取得できると思います。

A B C
1 100.05 =INT(A1) =IF(MOD(INT(A1*100),100)=0,1,0)
2 100.04 =IF(MOD(INT(A2*100),100)=0,INT(A2),B1) =IF(B1=B2,C1,C1+1)
3 100.05 以下B2をコピー 以下C2をコピー

でC列にカウントした値が表示されます。


前者の場合は、VBA のWorksheet_Change 関数を使用すれば下記のようになるでしょうか。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub
    
    Application.EnableEvents = False
    If (CInt(Range("A1") * 100) Mod 100) = 0 Then
        If Range("C1").Value <> CInt(Range("A1").Value) Then
            Range("C1").Value = CInt(Range("A1").Value)
            Range("B1").Value = Range("B1").Value + 1
        End If
    End If
    Application.EnableEvents = True
End Sub

A1が値、B1がカウント、C1が直前の整数値です。


いずれにせよ、直前の値を保持しそれと比較した結果をカウントするのが

基本的な考え方になります。

id:spyglass

説明が抜けておりましたが後者のセルの変化値のカウントです。

完璧な答えです、イルカ賞です。

有難う御座いました。

2008/08/29 23:39:38

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 yamadakouzi 296 250 6 2008-08-29 11:55:37
  • id:yamadakouzi
    yamadakouzi 2008/09/05 22:52:20
    回答を開いて、気に入らなくて、0点ならば納得がいくのですが、折角回答したのですから見てほしいものですね!!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません