• ベストアンサー

最も近い数値のあるセルを探す

お願いいたします。 エクセルVBAです。 例えばC列に10000行以上にわたって数値が不作為に 並んでいるばあい、347.398に一番近い数値の あるセルの行を求めるコードはどのようになりますか? ご教示お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.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の中で実現するのは意味がないと思います。

catshoes01
質問者

お礼

ありがとうございます。今 #2さんの方法でコードを組んでいるところです。(#2さんの手順はわかりやすいので) その後にご紹介のコードを試してみます。 (最近接データを探す単一の関数はなかったのですねーー。)

その他の回答 (3)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

処理速度を求めるならシート上の任意のセルに =MAX(INDEX((ABS($C$1:$C$10000-347.398)=MIN(INDEX(ABS($C$1:$C$10000-347.398),)))*ROW($C$1:$C$10000),)) を入力して、求める行番号を計算させておきます。 1分おきにこの値を転記してはどうですか。 ただしこの式では差分の絶対値が最小となるセルが複数ある時は最後の行を求めています。

catshoes01
質問者

補足

これがVBAでコード化可能であれば、それでもよいです。 Max Index Min 関数を調べてみます。

noname#31387
noname#31387
回答No.2

1) C列の値を配列変数に入れる。 2) 347.398 - 配列変数の値 で絶対値を求める 3) クイックソートで並べ替えで最小値を求める くらいで出来ませんかね。 それとも、もっと複雑なのでしょうか? 同じ数値があるときとか +,-のどちらの値を優先するとか

catshoes01
質問者

補足

これでよいのです。ただVBAに詳しくないのでコード例を教えて 頂ければ助かります。数値は+値しかとりません。 求めるのは数値のあるセルの行の値を取り出すことです。

  • chiezo2005
  • ベストアンサー率41% (634/1537)
回答No.1

VBAのコードがほしいのですかね? VBAを使わなくても,C列でソートして探せばすぐに見つかると思いますが・・・

catshoes01
質問者

補足

ありがとうございます。VBAでないと処理ができないのです。 しかもしょり速度を求められます。手動は不可。 データが1分おきに絶え間なく入力されてくるとき、データ更新 のたびに近接データを探して底データを特定のセルに格納します。 そしてそこから次の計算処理に入ります。その一環です。