- ベストアンサー
最も近い数値のあるセルを探す
お願いいたします。 エクセルVBAです。 例えばC列に10000行以上にわたって数値が不作為に 並んでいるばあい、347.398に一番近い数値の あるセルの行を求めるコードはどのようになりますか? ご教示お願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#03です。一応マクロも書きました。 Sub Macro() Dim idx, MinR As Long Dim TargetVal, MinVal As Single Dim ws TargetVal = 347.398 '← 目標値 With Worksheets("Datum") '← ワークシート名 Set ws = .Range("A1") MinVal = 10 ^ 6 For idx = 1 To .Range("C65536").End(xlUp).Row If IsNumeric(ws(idx, 3)) Then If Abs(ws(idx, 3) - TargetVal) < MinVal Then MinVal = Abs(ws(idx, 3) - TargetVal) MinR = idx End If End If Next idx MsgBox ("目的の行は" & MinR & "行目です") End With End Sub 機種にもよりますが、10000行でも2秒程度でしょう。 >これがVBAでコード化可能であれば とのことですが、#03の方法ではワークシートに式を入れておけば済む話ですからこの式をVBAの中で実現するのは意味がないと思います。
その他の回答 (3)
- zap35
- ベストアンサー率44% (1383/3079)
処理速度を求めるならシート上の任意のセルに =MAX(INDEX((ABS($C$1:$C$10000-347.398)=MIN(INDEX(ABS($C$1:$C$10000-347.398),)))*ROW($C$1:$C$10000),)) を入力して、求める行番号を計算させておきます。 1分おきにこの値を転記してはどうですか。 ただしこの式では差分の絶対値が最小となるセルが複数ある時は最後の行を求めています。
補足
これがVBAでコード化可能であれば、それでもよいです。 Max Index Min 関数を調べてみます。
1) C列の値を配列変数に入れる。 2) 347.398 - 配列変数の値 で絶対値を求める 3) クイックソートで並べ替えで最小値を求める くらいで出来ませんかね。 それとも、もっと複雑なのでしょうか? 同じ数値があるときとか +,-のどちらの値を優先するとか
補足
これでよいのです。ただVBAに詳しくないのでコード例を教えて 頂ければ助かります。数値は+値しかとりません。 求めるのは数値のあるセルの行の値を取り出すことです。
- chiezo2005
- ベストアンサー率41% (634/1537)
VBAのコードがほしいのですかね? VBAを使わなくても,C列でソートして探せばすぐに見つかると思いますが・・・
補足
ありがとうございます。VBAでないと処理ができないのです。 しかもしょり速度を求められます。手動は不可。 データが1分おきに絶え間なく入力されてくるとき、データ更新 のたびに近接データを探して底データを特定のセルに格納します。 そしてそこから次の計算処理に入ります。その一環です。
お礼
ありがとうございます。今 #2さんの方法でコードを組んでいるところです。(#2さんの手順はわかりやすいので) その後にご紹介のコードを試してみます。 (最近接データを探す単一の関数はなかったのですねーー。)