私はExcelのエキスパートではありません。しかし、IFから返される配列ではなく、絶対配列が渡されると、MAXで完全にラップされた公式が機能することがわかりました。これは、結果として得られる2つの配列の長さが過剰に#N / Aを返すのと一致せず、式全体が#N / Aになるためです。下のスクリーンショットを見てください。
これにより、必要な配列だけを返す、非常に基本的なUDFをVBAで作成することができました。このUDFでは、あまり検証されていません。単一の列参照のみがそれに渡され、予期される戻り値が右隣の列に存在することを確認してください。例えばA1:A4を渡すと、B1:B4の値がチェックされます。
押す ALT + F11 VBAエディタにアクセスする インサート - > モジュール 次のコードを貼り付けます。
Public Function RetArray(r1 As Range, a As String) As Variant
Dim i
i = 0
Dim myarray()
For Each cell In r1
If cell.Value = a Then
i = i + 1
End If
Next cell
ReDim myarray(i)
Dim j
j = 0
For Each cell In r1
If cell.Value = a Then
myarray(j) = cell.Offset(0, 1).Value
j = j + 1
End If
Next cell
RetArray = myarray
End Function
このUDFを最終的なソリューションに使用します。例えばAがH1である列Bの配列を取得するには、次の式を使います。 =RetArray(A1:A6,H1)
次に注意が必要なのは、この戻り値をE列の正確な位置にマップしてDから値を取得することです。
まず、CにD& Cの連結であるヘルパー列を作成します。 E
C1の式は =E1&F1
下の目的のセルまでドラッグします。日付がテキストとしてではなく、Excelの有効な日付形式であることを確認してください。
あなたのテーブルはH1:H4にあります。
今I1に次の公式を入れなさい。
=INDEX($D$1:$D$9,MIN(IF($C$1:$C$9=MAX(IF($F$1:$F$9=RetArray($A$1:$A$8,H1),$E$1:$E$9,0))&RetArray($A$1:$A$8,H1),ROW($C$1:$C$9),99^99)))
押す CTRL + シフト + 入る 配列式を作成して、テーブルの長さ方向にドラッグします。
ただし、この解決策は十分にテストされていません。前の行参照を使用して同じ操作をしない限り、データを行1から開始した場合にのみ正常に機能します。試してみて元に戻してください。他のユーザーからのよりスマートな解決策もチェックしてください。
更新
TRANSPOSE関数を使用してもConstant Arraysが機能し、Cell Referenceが機能しなかった(これにより、Arrayを返すUDFを作成することができました)一方、内部にはConstant Arrayの種類が作成されるようです。そのため、UDFをIFでラップされたTRANSPOSEに置き換えるだけで、VBAコードがなくてもソリューションは機能します。任意のヘルパーコラム。
これを試して、これがあなたに合っているかどうか確認してください。
I1以下の配列公式は、
=INDEX($D$1:$D$9,MIN(IF($E$1:$E$9&$F$1:$F$9=MAX(IF($F$1:$F$9=TRANSPOSE(IF($A$1:$A$8=H1,$B$1:$B$8)),$E$1:$E$9,0))&TRANSPOSE(IF($A$1:$A$8=H1,$B$1:$B$8)),ROW($C$1:$C$9),99^99)))