web-dev-qa-db-ja.com

INDEX + MATCH関数が間違った値を返す

INDEXおよびMATCH関数を使用して(I4内の)間隔時間で検索し、一致する対応する行から値をプルするExcel2013のスプレッドシートがあります(列A)。 3つを除くすべての行で期待どおりに機能します。これらの問題のある行では、実際には上のセルから値を返します。

私はコードを使用しています:

=INDEX(B:B, (MATCH($I$4, A:A)))

間隔時間を検索するために使用する値は、セルI4(たとえば、10:00 AM)にあり、一致する列はA:Aです。返そうとしている値はB:Bにあります。

間隔時間の列の範囲はA2-A37(6:00 AM〜11:30 PM、30分単位)で、返される値の範囲はB2-B37

A4A7、およびA10(それぞれ、午前7:00、午前8:30、および午前10:00)で値を検索する場合を除いて、すべての値が正しく返されます。目的の値を超えるセルからのデータ(つまり、I4 = 7:00 AM(A4に等しい)の場合、数式はB3ではなくB4の値を返します。 、I4 = 8:30 AM(A7)→B6の代わりにB7、およびI4 = 10:00 AM(A10) →B9の代わりにB10)。

完全一致を使用しようとすると:

=INDEX(B:B, (MATCH($I$4, A:A, 0)))

問題のある行の値#N/Aを返し、他の一部の値のみを修正します。

何が起こっているのかについての洞察はありますか?

4
JarrBett

@ fixer1234は正しいと思います—これは浮動小数点の丸め誤差です時間値。何が起こっているのか完全には理解していませんが、システムで再現することができ、回避策を見つけました。数式を次のように変更します。

_=INDEX(B:B, MATCH($I$4+TIME(0,0,1), A:A))
_

これにより、_I4_値に1秒(TIME(0,0,1);引数はTIME(hours,minutes,seconds))が追加されます。それは「こぶを越えて」それを取得するのに十分であるように思われるので、それは_A4_(または_A7_または_A10_)の値以上であるとテストします。ところで、私はTIME(0,0,0.9)を試しましたが、どうやらTIME()は小数秒を尊重しないので、それをTIME(0,0,0)として扱います。つまり、単なるゼロです。ミリ秒を取得したい場合は、TIME(0,0,1)*0.001を使用できます。

P.S.数式に不要な括弧のペアがありました。上記で削除しました。

4
Scott