• ベストアンサー

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

お願いいたします。 エクセル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分おきに絶え間なく入力されてくるとき、データ更新 のたびに近接データを探して底データを特定のセルに格納します。 そしてそこから次の計算処理に入ります。その一環です。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルVBA 不要行の削除について

    皆さんこんにちは。 お忙しいところ恐れ入ります。 以下の内容をVBAで実行したく色々やってみたのですが、思うように動きません。 もしお分かりになる方がおられましたらご教示の程ねがえませんでしょうか? 1.A列に”無作為な数値(例えば1から100)”と”空セル”がランダムに並んでいる。 2.このA列に、指定した数値(例えば3,7,15,23,50,88など色々)があった場合、  その指定した数値が書かれている行のみを行ごと削除したい。 以上です。 お忙しいところ恐れ入りますが、どうぞよろしくお願いいたします。

  • Excel VBA セルの値を変更後にVBA作動

    Excel VBAを活用して、特定のセルの値が変更されたときに、VBA処理を発動させることになりました。 処理といたしましては、C列(3列目)の4行目以下の空白セルに数値を入力するか、セルに入力されている数値を変更した場合にVBAを発動させたいです。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 3 And Target.Row >= 4 Then MsgBox "セルの値が更新されました" End If End Sub 上記のコードを実行してみたところ、3列目(C列)の4行目を選択した段階でVBAが作動してしまいます。 セルの値変更後に作動するようにするには、どう修正すればよろしいでしょうか?

  • 数値の入ったセルの末尾に、「%」つけるVBA

    A列,C列,E列の数値の入ったセルの末尾に、「%」をつける VBAを教えていただけないでしょうか

  • エクセルVBA 条件にあうときセルを塗りつぶすには?

    エクセルVBA 条件にあうときセルを塗りつぶすには? エクセルVBAについて教えてください。 _________A 列 _________B 列_________C列_________D列 -------------------------------------------- 1行| 基準値_________ 5_____________1____________8 2行| りんご____________1_____________9____________0 3行| みかん___________12___________5____________3 4行| ぶどう____________15___________7____________8 5行| バナナ____________3_____________1____________4 上図のようにデータがあります。 (実物は列行共に膨大です。また条件を4つ以上つける予定なので条件付書式は使えません) 各列の基準値に対して、セルの増減が、0以下のときに黄色に、5から8のとき大きくなるときに赤、9以上のときに青にセルの色を塗りつぶしたいです。 どのようにすればよいでしょうか? B列の場合、基準値が5です。 B2のセルの場合、基準値5と1(B2セル)の増減は-4です。 増減が0以下のときは黄色に、増減が5から8のときは赤に、増減が9以上のときに青にするので、このときは黄色に塗りつぶします。 B3のセルの場合、基準値5と12(B3セル)の増減は7です。 増減が5から8のとき赤に塗りつぶすので、このセルは赤に塗りつぶします。 B4のセルの場合、基準値5と15(B4セル)の増減は10です。 増減が9以上のとき青色に塗りつぶすので、このセルは青色に塗りつぶします。 C2のセルの場合は、C列の基準値は1(C1セル)です。 基準値1と9(C2のセル)の増減は8です。 増減が5から8のとき赤に塗りつぶすので、このセルは赤に塗りつぶします。 よろしくお願いいたします。

  • excelのセル参照

    vba初心者です。 excelのvbaでセル範囲(rangeなど)を指定して数値の入力や参照をしますが vbaを使わずに元のワークシート側で行・列の挿入、削除した場合 vbaにはその分反映されません。(当然ですが) Range("C3:D4")の場合、B列に列を挿入したらRange("D3:E4") となるような。 vbaの修正を最小限に抑える簡単で良い方法はありますか。

  • セル中の”パーセントの数値”によって字の色を変更

    エクセルマクロの機能でセル中の”パーセントの数値”によって字の色を変えて表示させたいと考えています。下記のようなことは可能なのでしょうか? F列3行目と4行目に”パーセントの数値”があります(例:95.23%)。 ここに、下記のような条件で数値の色が変わるようにしたいのですがエクセルのマクロで実現することは可能でしょうか? F列3行目:90%~108%は太字の緑色。0~80%若しくは108.1%以上は太字の赤色。 F列4行目:75%~90%は太字の緑色。0~90%若しくは90.1%以上は太字の赤色。 もし、お時間ある方がいらっしゃりましたらアドバイス頂ければ嬉しい限りです。 恐れ入りますが宜しくお願い致します。

  • エクセルVBAについてお尋ね致します。数式が入力されたセルを異なるセル

    エクセルVBAについてお尋ね致します。数式が入力されたセルを異なるセルの条件によって「値」のみ残す方法を模索しております。 使用する列および行の例 列=A、B  行=5~10、15~20、25~30(A列、B列共通) 上記対象セルの内訳 A列(参照セル)=数値 ※空欄の場合もあります B列(変更セル)=数式(Aセル数値 * ○○%) ※B1セルの例:=IF(A1="","",A1*10%) のような数式が記入されております。 (例) Private Sub CommandButton1_Click() ’参照セルの指定 ("A5:A10","A15:A20","A25:A30") のようなコード*** ※現在はAセルの範囲としておりますが、後に変更の可能性を有しますので範囲指定が可能な形式を望みます。 ’変更セルの指定 セル指定のコード*** ※現在はBセルとしておりますが、これも後に変更の可能性を有しますのでA・B・Cのような入力(もしくはA=1、B=2、C=3)による指定可能な形式を望みます。 ’参照セル(Aセル)に数値が入力されている場合、数式から得られた変更セル(Bセル)の値を”値のみ”で残す。 実行コード*** ※参照セル(Aセル)が空欄の場合は変更を望まないので、変更セル(Bセル)は何も致しません。(数式のまま残す) End Sub このようなマクロを望んでおります。 イメージとしては数値がAセルに入力されていた際に同じ行のBセルにおいて右クリックコマンド内〔コピー〕 → 〔形式を選択して貼り付け〕 → 〔値〕の貼り付けを行うことをご想像下さい。 列や行の変更が予想されるので変更が可能なことを望んでおりますが、結果が伴えば他の体裁は気に致しません。 お手数ですがご教授宜しくお願い致します。 以上

  • エクセルの数値選択で

       A   B   C   D --------------------------- 1  100   500  1000  5000    … 2   3     4     5     6     … 3   5     3     5     7     … 4   2     3     4     5     … 5   4     5     2     7     … の表があったとします。 X1のセルに数値を入力すると、その数値が100未満ならX2に3~X5に4を代入、100<=X1<500ならX2に4~X5に5を代入するなど、複数の列に対し1行目の数値を判定し2行目以下の数値を指定のセルに代入したいと思います。 4以上の複数列に対しては、どのような式を使えばいいのでしょうか。IF式を使ったのですがうまくいきません。 どなたかご教示ください。

  • 文字を検索し、同行の離れたセルに単語と数値を反映

    B列から「○○」という文字を検索し、 (1)該当した行のIセルに「小計」と入力 (2)Jセルに、Cセルの数値に「個」を付けたものを表示させる という作業を延々と繰り返しています。 該当する行はランダムにあります。 並べ替えが出来ない状態なので、VBAなのかな??と思うのですが、 マクロの記録ぐらいしかやったことがなくて…。 良い方法があれば教えて下さい。 お願いします。

  • エクセルのセル内の数値を変えたい

    他部署からコピーしたシート内のセルに00001234という数値があります。この数値から0000を取り1234という数値にしたいのです。列に100行くらいありますので、行を一括で行いたいのです。方法を教えていただきたいのですが、よろしくお願いいたします。

専門家に質問してみよう