ネストしたマルチセルアレイ


0

私のデータは最初の2つの表にあります( A1:B6 そして D1:F6 ):

nested multi-cell array formulae

私の意図した最終結果は I1:I4 の対応する値ごとに H1:H4

例えば、あなたは "A"の値を取り、あなたはからすべての対応するコードを見つけます。 B1:B6 (例: "code1"、 "code2"、 "code3")、それから最新の日付を調べます。 E1:E5 (前のステップのコードに対応)に値の日付に対応する結果を与える D1:D5

最新の日付を見つけるステップに行き詰まっています。私はこれらを試しました:

{=IF($F$1:$F$5=IF($A$1:$A$6=$H$1,$B$1:$B$6),$E$1:$E$5)}
{=IF($F$1:$F$5={IF($A$1:$A$6=$H$1,$B$1:$B$6)},$E$1:$E$5)}

何かご指導ください。列を追加することもできますが、問題はマルチアレイの結果です。これは、私の知る限りでは、1つのセルに格納できません。

回答:


3

私はExcelのエキスパートではありません。しかし、IFから返される配列ではなく、絶対配列が渡されると、MAXで完全にラップされた公式が機能することがわかりました。これは、結果として得られる2つの配列の長さが過剰に#N / Aを返すのと一致せず、式全体が#N / Aになるためです。下のスクリーンショットを見てください。

enter image description here

これにより、必要な配列だけを返す、非常に基本的な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から開始した場合にのみ正常に機能します。試してみて元に戻してください。他のユーザーからのよりスマートな解決策もチェックしてください。

enter image description here

更新

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)))

enter image description here


ありがとうございました!あなたの努力に感謝します。私は答えを支持しました、しかし今のところ私は答えとしてそれをマークしません。それはどういうわけか、VBAなしでオプションがあるべきで、そしてまた、私自身の答えよりも単純であるべきだと感じます。私はVBAをかなりよく知っていますが、現在私はそれを避けようとしています。ありがとうございました!
ZygD

UDFの代わりにTRANSPOSEが使用されています。最新の解決策を試してください。
patkim

1

これは長い一日の考察の後、結果がどのように見えるかです:

results

4つのヘルパー列が、それぞれ単一セル配列の式で作成されました。

細胞 C1 下向き

{=MAX(IF(B1=$K$1:$K$5,$J$1:$J$5))}

細胞 D1 下向き

{=IFERROR(INDEX($I$1:$I$5,MATCH(1,(B1=$K$1:$K$5)*(C1=$J$1:$J$5),0)),"")}

細胞 E1 下向き

{=MAX(IF(A1=$A$1:$A$6,$C$1:$C$6))}

細胞 F1 下向き

{=INDEX($B$1:$B$6,MATCH(1,(A1=$A$1:$A$6)*($C$1:$C$6=E1),0))}

そして答えは G1 下向き

{=INDEX($D$1:$D$6,MATCH(1,($B$1:$B$6=F2)*($C$1:$C$6=E2),0))}

これを1列にしておくといいのですが、まあまあ... :)


0

今すぐ友達

基本的には を見つけることです 最新(最近)の日付 Code1、Code2、およびCode3、 対応する一致値がColAのAの場合(元のクエリポストを確認)

両方を味わう必要があるということです。 Code3はAで2回、次にBで2回出現したので

そして、最近書いたようにLatest is Recentです MAX Functionは使用できません、MINはLatestを見つけます。

スクリーンショットを確認してください。

enter image description here

式は、

= IF(D423:D428 = "A"、IF(E423:E428 =({"Code1"、 "Code"、 "Code3"}))、MIN(F423:F428)))

Non-Array公式でさえも問題を解決しました。

NB: データ範囲を使用して式を再設計できます。

私は自分でテストした後にソリューションを投稿しました。違いがある場合は、コメントしてください。


0

少しの修正で、私は 最近の日付 必要な領域内でのみ、 基準は、AとCode1、Code2、またはCode3です。

enter image description here

{= MAX(IF(D423:D428 = "A"、IF(E423:E428 = {"コード1"、 "コード"、 "コード3"}、F423:F428、 "")))}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.