私が本質的に解決しようとしている問題は、列A:Eの値をチェックし、これらのいずれかで見つかった場合に列Fに保持されている値を返すVLOOKUPです。
VLOOKUPがタスクに達していないので、INDEX-MATCH構文を調べましたが、単一の列ではなく、値の配列に対してこれを完了する方法について頭を悩ませています。これを試して説明するために、以下のサンプルデータセットを作成しました。
A------B------C------D------E------F
1------2------3------4------5------Apple
12-----13--------------------------Banana
14---------------------------------Carrot
チェックされるセルに1、2、3、4または5が含まれている場合、数式の結果はAppleになります。 12または13の場合はバナナを返し、最後に14が含まれている場合はキャロットを返します。
これの後半は、参照されるセルが単一の値ではなく、完全なテーブル自体であるという事実から来ています。そのため、この検索はさまざまな値に応じて何度も実行されます。
実例として、これらの値が含まれている別のテーブル(以下)があります。私はシステムにどの行を識別させようとしているので、各列に関連付ける「アップル、バナナ、ニンジン」の値を識別しようとしています。テーブルは次のようになります
こんにちは - - - - - -
1 ------(アップル)----
2 ------(アップル)----
12 -----(バナナ)-
等。 - - - - - - - - -
括弧内の値は、式がこれらの値を計算する場所です。
@ Gary'sStudentとの私自身の調査と議論に基づいて、私が使用した解決策は、値を含む可能性のある各列のMATCH式と、空白をキャッチする "IFERROR"ステートメントを作成することでした。
I1 =IFERROR(MATCH($H1,A$1:A$3,0),"")
J1 =IFERROR(MATCH($H1,B$1:B$3,0),"")
K1 =IFERROR(MATCH($H1,C$1:C$3,0),"")
L1 =IFERROR(MATCH($H1,D$1:D$3,0),"")
M1 =IFERROR(MATCH($H1,E$1:E$3,0),"")
etc.
これらの列を非表示にして、ユーザーの混乱や相互作用を防ぐことができます。
次に、これらを1つの値に累積するインデックスを作成しました。これは、問題のROWに一致するはずです。この場合も、値がテーブルに見つからない場合、これを空白値として入力するためのチェック(最初のSUM)があります。
N1 =IF(SUM(I1:M1)=0,"",INDEX($A$1:$F$3,SUM(I1:M1),6))
最後に、いくつかの条件付きフォーマット式を入力して、ユーザーが重複データを識別して置き換え/削除できるようにしました。
A1:E3 Cell contains a blank value [Formatting None Set, Stop if True]
A1:E3 =COUNTIF($A$1:$E$3,A1)>1 [Formatting Text:White, Background:Red]
H1:N1 =COUNTIF($A$1:$E$3,H1)>1 [Formatting Text:Red, Background:Red]
これは、ユーザーがこの重複データを削除するための手がかりにすぎません。
あなたには多くの異なるケースがあります。 1つのケースを考えてみましょう:
列のどこか[〜#〜] a [〜#〜]から[〜#〜] e [〜 #〜]13を含む唯一のセルがあり、列のセルの内容を返します[〜#〜] f [〜#〜]は同じ行にあります。
「ヘルパー」列を使用します。 G1に次のように入力します。
=COUNTIF(A1:E1,13)
と下にコピーします。これにより、行を識別できます。
セルを選択して入力:
=INDEX(F:F,MATCH(1,G:G,0))
「ルール」が変更され、1行に複数の13がある場合、または13を含む複数の行がある場合は、ヘルパー列を変更します。
EDIT#1:
更新に基づいて、最初のステップは、ハードコードされた13を「ヘルパー」列の数式から取り出し、その中に置くことです自分のセル、(sayH1)。その後、単一のセルを変更するだけで、さまざまなケースを実行できます。
テーブルに多数のケースがある場合、各ケースをセットアップするマクロを作成できます(updateH1)結果を記録します。
H1の単一の数式の場合:
_=INDEX($F$1:INDEX(F:F,MATCH("ZZZ",F:F)),AGGREGATE(15,6,ROW($A$1:INDEX(E:E,MATCH("ZZZ",F:F)))/($A$1:INDEX(E:E,MATCH("ZZZ",F:F))=H1),1))
_
これは配列数式なので、参照をデータセットのサイズに制限する必要があります。すべてのINDEX(E:E,MATCH("ZZZ",F:F))
がそれを行います。これは、テキストがある列Fの最後の行を返します。次に、それを反復する最後の行として設定します。
@ Gary'sStudentメソッドは配列数式を避け、必要なメソッドである可能性があります。データセットと数式の数が増えると、計算にかかる時間が増えます。ある時点で、Excelがクラッシュすることさえあります。通常これには数千かかりますが、警告をしたいと思います。
[〜#〜]編集[〜#〜]
配列数式を使用せずに1つの数式であるには:
_=IFERROR(INDEX(F:F,MIN(IFERROR(MATCH($H1,A:A,0),1050000),IFERROR(MATCH($H1,B:B,0),1050000),IFERROR(MATCH($H1,C:C,0),1050000),IFERROR(MATCH($H1,D:D,0),1050000),IFERROR(MATCH($H1,E:E,0),1050000))),"")
_
これはOPの答えに基づいており、その方法を1つの式に組み合わせただけです。
この数式は重複するエントリを無視し、番号が見つかった最初の行を返します。
また、配列ではないため、完全な列参照は計算時間に悪影響を及ぼしません。
別の方法は、最初にこれがどのように「あるべきか」がどのように構成されているかを表す補助テーブルに基づいています。これは、後でデバッグして変更するのが面倒なモンスターの方程式を回避し、5つのルックアップ列を持つという考えとは異なり、さまざまな数の列をきれいに解決することができます。
上記がSheet1にある場合は、Sheet2を追加します。その場所には4つの列があります。行、列、ID、名前
Row
の数式は次のようになります(疑似コードでは、「最後」は「シート2の上の行」を意味します)
=IF(Column = 1, Last row + 1 , Last row)
Column
の数式:
=IF(OR(Last Column = 5; INDEX(StartTable, last row, last column + 1) = ""), 1, Last column+1)
ID
およびName
の数式:
=INDEX(StartTable, Row, Column)
=INDEX(NameColumn, Row, 1)
次に、これを記入します(基本的には、元のテーブルのrow
>行数まで)。
最後に、通常のvlookupまたはインデックス/一致で新しいテーブルを使用します。
PRO:はるかに単純な数式で、使いやすく、理解しやすくなっています。
短所:追加のテーブルが必要で、テーブルの長さを維持する必要があります。これは、値の「文字列」全体に対して単一のスレッドを必要とするため、パフォーマンスに関してはリスクがあります。
また、いくつかのエラー行に問題がなければ、コードは多少単純になり、パフォーマンスが向上する可能性があるため、列の数は常に5であると想定して、rowとcolumnの両方を指定できます。