今、ある数値が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で一度カウントされているものの他のラインを踏んでいないために同じライン上での上下はカウントされません。
以上、計算の仕方(アルゴリズム)をご教授ください。
宜しくお願いします。
値が刻々と変化というのは、特定セルの値が変化しているのでしょうか。
それとも時系列で変化している値が並んでいるのでしょうか。
後者であれば、たとえば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が直前の整数値です。
いずれにせよ、直前の値を保持しそれと比較した結果をカウントするのが
基本的な考え方になります。
VBAを使うという前提で回答します。
100.05→100.06→100.07→100.06→100.07→100.06
上記を試してみたところまだ小数点以下"00"を踏んでいないにも関わらず全てでインクリメントが発生しました。
逆に100.00を踏むとインクリメントされません。
NGの様です。
値が刻々と変化というのは、特定セルの値が変化しているのでしょうか。
それとも時系列で変化している値が並んでいるのでしょうか。
後者であれば、たとえば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が直前の整数値です。
いずれにせよ、直前の値を保持しそれと比較した結果をカウントするのが
基本的な考え方になります。
説明が抜けておりましたが後者のセルの変化値のカウントです。
完璧な答えです、イルカ賞です。
有難う御座いました。
回答者 | 回答 | 受取 | ベストアンサー | 回答時間 | |
---|---|---|---|---|---|
1 | yamadakouzi | 296回 | 250回 | 6回 | 2008-08-29 11:55:37 |
説明が抜けておりましたが後者のセルの変化値のカウントです。
完璧な答えです、イルカ賞です。
有難う御座いました。