MS Excel 2003 で試合のリマインダーを抽出する方法

MS Excel 2003 で試合のリマインダーを抽出する方法

さまざまな関数の組み合わせを試してみましたが、検索されていない/一致していない値を返す特定の関数はないようです。大量のデータを整理する必要があるため、手動で行うには数日かかります。

MS Excel 2003 でリスト B に基づいてリスト A の残りを抽出したいと考えています。

*リストAは2000アイテム、リストBは最大10〜30アイテムのみ

リスト A
No.1----1 2 3 4 5 6 (各桁は 1 つのセルに配置され、常に 6 桁になります)
No.2----1 1 2 3 4 5 (各桁は 1 つのセルに配置され、常に 6 桁になります)
No.3----1 3 4 5 6 7 (各桁は 1 つのセルに配置され、常に 6 桁になります)

リスト B
No.1----1 2 3 (各桁は 1 つのセルに配置され、常に 3 桁になります)
No.2----1 1 4 (各桁は 1 つのセルに配置され、常に 3 桁になります)
No.3----2 3 5 (各桁は 1 つのセルに配置され、常に 3 桁になります)

例えば:

リスト A では、リスト B からの入力に基づいて一致するもの (存在する場合) を検索し、残りを出力として返します。一致するものが見つからない場合は、出力は必要ありません。

リストA
No.1----1 2 3 4 5 6 (各数字は1つのセルに配置され、常に6桁になります)

リスト B に基づく
No.1----1 2 3 (一致が見つかりました (1&2&3 が存在します)、残りの部分を手動で選択します # # # 4 5 6 または = 456)
No.2----1 1 4 (一致が見つかりませんでした (1&1&4 が存在しません)、出力なし)
No.3----2 3 5 (一致が見つかりました (2&3&5 が存在します)、1 # # 4 # 6 を選択します、または出力 = 146)

私は、COUNT 関数を使用してリスト A のすべての項目における 0 ~ 9 の各数字の頻度をカウントし、次に IF および AND 関数 (一致と見なされるために必要な各数字とその数を指定) を使用して、リスト B のどの項目がリスト A と一致するかを判断することにしました。

したがって、リスト A のすべての項目について、Excel でリスト B 全体を実行する必要があり、出力は出力なしから最大 3 つの出力までの範囲になります。

また、検索に使用する数式を変更せずにリスト B の値を変更し、同じワークシートを簡単に繰り返し使用できるようにする機能も必要です。

これまで、他の関数を使用する試みはすべて、希望どおりに残りを抽出できませんでした。何か提案があれば教えてください。

答え1

さて、ここに機能する解決策がありますが、設定時に頭がおかしくなるかもしれません。私は一度に 1 つのステップずつ構築し、1 セットの計算を行い、それを次の計算で使用しました。機能するモデルができたら、逆方向に作業を進め、セル参照を実際の数式に置き換えて、すべての数式が中間計算ではなく実際のリストのみを参照するようにしました。数式は急増しました。実際、最初の試みではセルの容量を超える数式が生成されました。私はそれを 2 つのテーブルに分割し、最初のテーブルが 2 番目のテーブルに入力されるようにしました。テーブルは非常に大きく、すべてのセル参照が適切な場所を指し、テーブル全体で 2 方向に数式を入力しようとすると、完全に気が狂ってしまうでしょう。そのため、間接参照をいくつか追加して、数式をコピーして貼り付けるだけで、手動でクリーンアップしなくても機能するようにしました。残念ながら、かなり大きな数式が生成されました。

これをスプレッドシートの特定の場所にある例として説明します。他の場所にピースを配置する必要がある場合は、最初のセルの行と列の参照をすべて編集し、コピーして貼り付けてテーブルに入力します。自分の正気を保つために、既知の例をいくつか設定して、テーブル全体に入力する前に、各テーブルの最初の数行と数列が機能していることを確認できるようにします。予防的にアスピリンを数錠飲んで、始めましょう。

これは、行 1 から始まるデータ (2,000 行) を含む列 A から F のリスト A に基づいています。リスト B は、行 1 から始まるデータ (30 行) を含む列 H から J のリストです。

最初のテーブルは L1 から始まります。このテーブルは、リスト A レコード内のリスト B エントリの位置のリストを作成します。例:

                          Position:  1 2 3 4 5 6          
    So if a List A record contains:  1 3 3 5 7 9
    and a List B record contains:    1 3     7
    the entry in this table will be: 1 2     5  (stored as a single number: 125)

リスト B のレコードがリスト A のレコードと一致しない場合は、セルに #N/A が表示されます。このテーブルのレイアウトは次のようになります。

            [L]     [M]      [N]       [O]  
    [1]             <=======List B Row========>
    [2] List A Row   1        2         3    ...
    [3]     1
    [4]     2
    [5]     3
        ...

実際には、行番号を列 M から列 AP の行 2 の列見出しとして、また列 L の行ラベルとして入力する必要があります。これらは、数式でポインターとして使用されるものです。リスト B エントリの各行に 1 つずつ、合計 30 のデータ列があり、行 3 から始まるリスト A のエントリを表す 2,000 行があります。表の各セルは、リスト B エントリとリスト A エントリを反映しています。M3 の数式は次のとおりです。

    =MATCH(INDIRECT("H"&M$2),$A1:$F1,0)&MATCH(INDIRECT("H"&M$2),$A1:$F1,0)
     +MATCH(INDIRECT("I"&M$2),INDIRECT(ADDRESS($L3,MATCH(INDIRECT("H"&M$2),$A1:$F1,0)+1, , )&":$F"&$L3),0)&MATCH(INDIRECT("H"&M$2),$A1:$F1,0)
     +MATCH(INDIRECT("I"&M$2),INDIRECT(ADDRESS($L3,MATCH(INDIRECT("H"&M$2),$A1:$F1,0)+1, , )&":$F"&$L3),0)
     +MATCH(INDIRECT("J"&M$2),INDIRECT(ADDRESS($L3,MATCH(INDIRECT("H"&M$2),$A1:$F1,0)
     +MATCH(INDIRECT("I"&M$2),INDIRECT(ADDRESS($L3,MATCH(INDIRECT("H"&M$2),$A1:$F1,0)+1, , )&":$F"&$L3),0)+1, , )&":$F"&$L3),0)

ここでは読みやすくするために数式を分割していますが、すべて 1 つの数式です。サンプル データを使用して M3 から N4 で機能することを確認し、コピーして貼り付けて表に入力します。

2 番目のテーブルは AR1 から始まります。このテーブルは同じように構成されています。

           [AR]    [AS]      [AT]      [AU]  
    [1]             <=======List B Row========>
    [2] List A Row   1        2         3    ...
    [3]     1
    [4]     2
    [5]     3
        ...

この表は最初の表と同様に機能します。各セルはリスト B レコードとリスト A レコードの結果を表します。この表には余りが含まれます。したがって、最初の表で示した例では、余りは 359 になります。

    So if a List A record contains:  1 3 3 5 7 9
    and a List B record contains:    1 3     7
    the remainder is:                    3 5   9

セル AS3 に入力する数式は次のとおりです。

    =IF(ISNA(M3),"",IF(ISERROR(FIND(COLUMN(INDIRECT("a"&$AR3)),M3)),INDIRECT("a"&$AR3),"")&
     IF(ISERROR(FIND(COLUMN(INDIRECT("b"&$AR3)),M3)),INDIRECT("b"&$AR3),"")&
     IF(ISERROR(FIND(COLUMN(INDIRECT("c"&$AR3)),M3)),INDIRECT("c"&$AR3),"")&
     IF(ISERROR(FIND(COLUMN(INDIRECT("d"&$AR3)),M3)),INDIRECT("d"&$AR3),"")&
     IF(ISERROR(FIND(COLUMN(INDIRECT("e"&$AR3)),M3)),INDIRECT("e"&$AR3),"")&
     IF(ISERROR(FIND(COLUMN(INDIRECT("f"&$AR3)),M3)),INDIRECT("f"&$AR3),""))

この表の各セルには、一致がなかった場合は残りの部分または null 文字が含まれます。

リスト A の各レコードの結果の概要を取得したいとします。テーブルの各行はリスト A のレコードを表すため、概要はテーブルの各行の末尾に配置できます。テーブルの 30 列は列 BV で終了するため、結果は列 BW にあります。BW3 の数式は次のようになります。

    =AS3&IF(ISBLANK(AS3),""," ")&AT3&IF(ISBLANK(AT3),""," ")& ... &BV3&IF(ISBLANK(BV3),""," ")

ここでは 30 個の用語すべてを表示するのではなく、最初の 2 つと最後の用語だけを表示します。同じパターンに従って残りを追加します。各一致の結果を連結して結果文字列を作成します。セルに値がある場合は、次の値の前にスペースを追加します。別の区切り文字が必要な場合は、スペースをコンマなどの別のものに変更します。この数式をすべての行の BW 列にコピーします。

これはおそらく、結果を保存するのに最も便利な場所ではありません。すべてが機能するようになったら、移動できます。実際、何かを移動すると、セル参照の大規模なクリーンアップが必要になる場合があります。必要な出力を別の場所に作成し、セル参照を使用して既に設定されているものを参照する方が合理的です。

関連情報