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
。
A4
、A7
、および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を返し、他の一部の値のみを修正します。
何が起こっているのかについての洞察はありますか?
@ 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.数式に不要な括弧のペアがありました。上記で削除しました。