アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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の中で実現するのは意味がないと思います。
    • good
    • 1
この回答へのお礼

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

お礼日時:2007/03/25 15:25

処理速度を求めるならシート上の任意のセルに


=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 関数を調べてみます。

補足日時:2007/03/25 14:38
    • good
    • 1

1) C列の値を配列変数に入れる。


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

この回答への補足

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

補足日時:2007/03/25 14:34
    • good
    • 1

VBAのコードがほしいのですかね?


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

この回答への補足

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

補足日時:2007/03/25 14:05
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A