• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:2つのセルに入力された異なる数値同士を比較して、もっとも近い値のある行)

EXCELに関する表の異なる数値同士の比較方法と近い値の検索方法について

このQ&Aのポイント
  • EXCELにおいて、異なる数値同士を比較して、もっとも近い値のある行を検索する方法について教えてください。
  • 異なる数値同士の比較では、【x】と【2x】、【y】と【2y】を対応させる必要があります。
  • もっとも近い値を検索し、その行の【#】の数値を抽出する方法は分かりましたが、2番目や3番目に近い値を検索する方法がわかりません。ご助力をお願いします。

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

  • ベストアンサー
  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.2

>=MIN(IF(MIN(ABS($G$2:$G$1000-B2))=ABS($G$2:$G$1000-B2),$F$2:$F$1000)) この式で最も近いセルがうまく表示できるということなら、以下の式で2番目、3番目の数値を求めることができます。 =MAX(IF(SMALL(ABS($G$2:$G$1000-B7),2)=ABS($G$2:$G$1000-B7),$F$2:$F$1000)) =MIN(IF(SMALL(ABS($G$2:$G$1000-B7),3)=ABS($G$2:$G$1000-B7),$F$2:$F$1000))

tanmaina
質問者

お礼

MackyNo1様 ご返答ありがとうございます。 なるほど、SMALL関数をそこに入れて、頭をMIN→MAXに変更したのですね。 全く思いつきませんでした。大変参考になります。 この式を参考にさせて頂いて進めてみたいと思います。 ありがとうございました。

その他の回答 (3)

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.4

>なるほど、SMALL関数をそこに入れて、頭をMIN→MAXに変更したのですね。 少し複雑なので補足すると、基本はすべてMIN関数でできるはずですが、差の絶対値が同じデータが2つある場合は、数式で得られた配列に該当する数値が2つあるので、MINでは同じデータがヒットしてしまいます。 すなわち最小値(一番小さい差)と2番目に小さい差のデータが同じ場合は、いずれもMINで計算すると、2番目のデータは結局最小値のデータと同じ結果を返しますのでMAX関数を使う必要があるわけです。 同様に、差が2番目に小さいデータと3番目のデータが同じ値となった場合は、どちらもMAXまたはMINでは同じ値を返します。 それを避けるために、2番目のデータの表示でMAXを使ったので、3番目のデータの表示にはMIN関数を使用しています。

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.3

#1です。 問題は、2つの項目同士を比較して、「近い」ということをどう判定するかでしょう。 補足に書かれた式では、x,yそれぞれで近い行を調べて、それが同じ時としていますが、 懸念されているように、違った場合は困ってしまいます。 通常は、(x,y)を平面座標にプロットして、その距離が近いかどうかを調べる方法でしょう。 (x,y)と(x2,y2)の距離は、√{(x-x2)*(x-x2)+(y-y2)(y-y2)}で計算できます。 この方法でマクロを作成すると、下記のようになります。 (距離は比較するだけなので、ルート計算はしていません) Sub Test() Dim i As Integer, j As Integer, r1 As Integer, r2 As Integer Dim x As Double, y As Double, x2 As Double, y2 As Double Dim S As Double, S1 As Double, S2 As Double, S3 As Double Dim n1 As Integer, n2 As Integer, n3 As Integer r1 = Cells(Rows.Count, 1).End(xlUp).Row ' A表の最終行 r2 = Cells(Rows.Count, 6).End(xlUp).Row ' B表の最終行 For i = 2 To r1 x = Cells(i, 2) y = Cells(i, 3) S1 = 0 S2 = 0 S3 = 0 n1 = 0 n2 = 0 n3 = 0 For j = 2 To r2 x2 = Cells(j, 7) y2 = Cells(j, 8) S = (x - x2) * (x - x2) + (y - y2) * (y - y2) ' 距離の計算 If S < S1 Or n1 = 0 Then S3 = S2 S2 = S1 S1 = S n3 = n2 n2 = n1 n1 = Cells(j, 6) ElseIf S < S2 Or n2 = 0 Then S3 = S2 S2 = S n3 = n2 n2 = Cells(j, 6) ElseIf S < S3 Or n3 = 0 Then S3 = S n3 = Cells(j, 6) End If Next Cells(i, 4) = n1 & "," & n2 & "," & n3 ' D列へ書き込み Next End Sub 実際に示されたデータで実行してみると、ほとんどが2,3,4か2,4,3になっていますが、 これは、yの値がどのy2よりも大きいためのようです。 もし、この結果が希望どおりではない場合は、距離の算出式を変えるという方法もあります。

tanmaina
質問者

お礼

nag0720様 ご返答ありがとうございます。 恥ずかしながらほとんど理解出来ていないのですが こういう方法もあったのかと大変勉強になります。 提示して頂きました回答ですと、確かにx,yごとでそれぞれ 簡単にランク付け出来るようにデータが出たので 比較が出来るようになりました。 深夜にも関わらずご返答頂きましてありがとうございました。

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

>もっとも近い値を検索し、その行の【#】の数値を抽出するという関数は >過去ログから検索して作成することは出来たのですが、 その作成したものを提示してくれませんか?

tanmaina
質問者

補足

nag0720様 お世話になります。 過去ログではなく他のHPからの流用でした。 試してみたのが以下の式です。 xとyとそれぞれ個別に当てはめて求めて2つの【#】の数値が一致した物を当たりとしました。 添付した画像に対応させた式になっています。 数式の場所はどこでもいいのですが、(仮に)D2セルに =MIN(IF(MIN(ABS($G$2:$G$1000-B2))=ABS($G$2:$G$1000-B2),$F$2:$F$1000)) これを、{Shift}+{Ctrl}+{Enter}で「配列数式」としました。 個別でやっているのでお互いに最も近い数値を認識する場所がずれてしまうことが あるのでそれを解消出来なくて困っていました。

関連するQ&A