別のテーブルの値と比較して次に大きい値や小さい値を取得する必要があるテーブルがあります。ただし、ルックアップの精度に影響を与えずに、最初のテーブルを任意の基準で並べ替えられるようにする必要もあります。
VLOOKUP、LOOKUP、HLOOKUP、MATCH を使用して次に大きい/次に小さい値を検索するさまざまな方法を検索して読みましたが、見つけた方法はすべて、次に小さい/最大の値のどちらが必要かに応じて、ソース列を昇順/降順に並べ替える必要があるようです。これにより、両方を同時に使用できるようにしたい場合や、数式を壊さずにテーブルを並べ替えたい場合に機能が損なわれます。
Excel で、並べ替えに関係なく次に大きい値/次に小さい値を検索する方法はありますか?
推奨されるソリューションは、ネイティブの Excel 関数のみを使用することです。現在、VBScript にあまり精通しておらず、サードパーティのツールをインストールすることは現時点では選択肢ではありません。ソリューションは Excel 2010 と互換性がある必要があります。そして2013年。
答え1
提案された結果
ARRAY式でIFとSMALLを使用する
写真に示されている結果が目的のものである場合、次に大きいものを見つけるための式は次のようになります。
=SMALL(IF(Relative[Value]>[@Value];Relative[Value];99999999999);1)
説明
Relative[Value]>[@Value]
TRUE
またはの配列を返すFALSE
IF(Relative[Value]>[@Value];Relative[Value];99999999999)
次に、相対テーブルからより大きい値を返し、そうでない場合は範囲外の巨大な値を返します。データに自然に発生することのない値を選択します。または、0
FALSES に値を使用したり、エラー値を操作したりすることもできます。- 次に、
SMALL
引数付きの関数を使用してk=1
、大きい値から最初に小さい値を見つけます。 - 配列数式なので、CTRL+SHIFT+ENTERで数式を入力します。
リンク:
答え2
番号が一意である場合は、次のようにします。
次に小さいもの:
=SMALL(YourRange,RANK.EQ(YourValue,YourRange,1)+1)
次に大きいもの:
=SMALL(YourRange,RANK.EQ(YourValue,YourRange,1)-1)
そうでない場合は、配列数式またはヘルパー列を使用して、より複雑な操作を行うことができます。また、重複する数値をどのように処理するか (同じ値を返すか、異なる値を返すか) を決定する必要があり、そのためには、 の使用に切り替えてLARGE
、 の並べ替え順序を変更する必要があるかもしれませんRANK
。
それでも、これは出発点となるはずです。
答え3
空のヘルパー (悪) 列を使用して、これをコピーして下まで貼り付けます。 =IF(B3>NOW(),B3,"") これを列 T と呼びます。次に、「次へ」フィールドに入力します。 **=MIN(T1:T1000)
関数としては次のようになります:
Function Soonest(scolumn As String) As Date
'
'
Dim a, b
Dim test(20000) As Date
Dim Min As Date
b = 0
For a = 1 To 20000
If (IsEmpty(Range(scolumn & a))) Then
GoTo SkipMe
End If
If (Range(scolumn & a).Value - Now() > 0) Then
b = b + 1
test(b) = Range(scolumn & a).Value
End If
SkipMe:
Next a
If b = 0 Then
Min = "None"
GoTo NoneFound
End If
Min = test(1)
For c = 1 To b
If test(c) < Min Then Min = test(c)
Next c
NoneFound:
Soonest = Min
End Function