
私は VLOOKUP、MATCH、INDEX、さらには Fuzzy アドオンも使用しました。これらのうちの 1 つまたは組み合わせが機能すると思いますが、それを機能させるためのノウハウがないため、常に「#N/A」が表示されます...
問題: 参照がいっぱいの、項目の合計数が異なり、列が 2 つあります。1 つの列の数値は部分的に同じですが、一部変更されています。次のようになります。
Column A typical number (ex): 025983553-1
Column B typical number (ex): 225983553
しかし、私は何千もの数字を持っており、A の各セルを B の全範囲と一致させ、セル B6544 でも一致があれば、(列 C で)「True B6544」のようなものを取得したいと考えています。
私が扱っているものの(小さな)例(正確な参照ではなく、社内の適切なデータです):
B J H
1 025983553-1 225983553 True, B1
2 025973223-1 222222345 False
3 025965463-2 233444667 False
4 025911122-4 211198989 False
5 025998764-1 212989238 False
6 025925925-3 224397501 False
7 025900000-2 225973223 True, B2
8 025999999-5 223334445 False
9 025965453-6 211100110 False
10 025943536-2 225911122 True, B4
...
ご覧のとおり、J1 は B1 と部分的に一致するため、H1 は「True、B1」を返します。
上で述べたように、MATCH、VLOOKUP、INDEX、Fuzzy アドオンを試しました。次のようにする必要があることは理解しています。
=VLOOKUP(B1, $J$1:$J$10, valueThat IwantIThink, FALSE)
しかし、何も機能していないようです...どんな助けでもありがたいです!
答え1
次の小さなユーザー定義関数を試してください:
Public Function PartialMatch(r1 As Range, r2 As Range) As Variant
Dim boo As Boolean, v As Variant, r As Range
boo = False
v = Mid(r2.Text, 2)
For Each r In r1
If InStr(1, r.Text, v) > 0 Then
PartialMatch = "True, " & r.Address(0, 0)
Exit Function
End If
Next r
PartialMatch = boo
End Function
図に示すように、K1入力:
=partialmatch($B$1:$B$10,J1)
下方向にコピーします。
このルーチンは、サブ文字列から先頭の数字を削除し、列内でその数字を検索します。
答え2
Excelは正規表現をサポートしていないので、補助列を必要としない数式はないと思います。私の例では、
- Aには「-」の付いた数字が含まれています
- Bには一致する数字が含まれています
- CにはBの最初の桁を除いた値が含まれます
- A の値が列 B のいずれの値とも一致しない場合は D は「FALSE」、一致するセルへの参照がある場合は「TRUE」になります。
C1 の式は次のとおりです。
=RIGHT(B1,LEN(B1)-1)
これにより、B1 の最初の桁が削除されます。
D1 の式は次のとおりです。
=IFERROR("TRUE, "&ADDRESS(MATCH(MID(A1,2,SEARCH("-",A1)-2),C$1:C$10,0),COLUMN(B1)),FALSE())
これで目的の出力が生成されるはずですが、TRUE/FALSE とセル参照を 2 つの列に分割することをお勧めします。したがって、ADDRESS
一致が見つかった場合はセル参照が、そうでない場合はエラーが返される部分についてのみ説明します。
VLOOKUP
は、一致した値と同じ行の値を返すため、ここでは役に立ちません。MATCH
一方、は一致した値の行を返します。
MID(A1,2,SEARCH("-",A1)-2)
A1 の 2 番目の文字から始まり、最初の "-" の出現までの部分文字列を返します。これが探している値です (lookup_value
)。MATCH(lookup_value, C$1:C$10, 0)
は、 が最初に出現する行を返しますlookup_value
。範囲に関数を適用することはできず、Excel は正規表現をサポートしていないため、補助列 C が必要です。最後のパラメーター (0
) が必要なのは、値が並べ替えられていないためです。返される行の値は指定された範囲に対する相対値であるため、範囲が行 1 から始まらない場合は、そのことを考慮する必要があります (ROW([first cell])-1
の結果に追加するなどMATCH
)。ADDRESS(matched_row, COLUMN(B1))
セル参照を生成します。 の代わりに行の絶対番号を使用することもできますCOLUMN(B1)
が、人間が読みやすい形式ではありません。
どの参照を絶対参照にするか、または相対参照にするかは、自分で決める必要があります。
答え3
まだ全体像が把握できていないため、質問に部分的に答えようとしています。
データを処理して比較するためのヘルパー列を 2 つ追加しました。これにより、理解が深まります。
列は、先頭と末尾のC-helper
を削除します。 列は、 の先頭の数字 (または最初の数字) を削除します。次に、に対してデータの を 実行し、vlookup() の結果に基づいてデータが見つかったかどうかを確認します。 0
- number
I- helper
J col
vlookup
I-helper
C - helper
私が持っている式は
C - helper
:==MID(B4,2,LEN(B4)-3)
I - helper
:=MID(D4,2,LEN(D4)-1)
vlookup col
:=IF(ISNA(VLOOKUP(E4,$C$4:$C$13,1,FALSE)),"not_found","found")
問題の次の部分は、このエントリが見つかった場所を特定することです。エントリが見つかった場合はそのアドレスが返され、そうでない場合は文字列が返されますNot_Available is returned
。サンプルデータは次のようになります。
ABC - ヘルパー JI - ヘルパー vlookup col HI X-ヘルパー 1 025983553-1 25983553 225983553 25983553 が見つかりました True、B1 $C$4 2 025973223-1 25973223 222222345 22222345 not_found FALSE 利用不可 3 025965463-2 25965463 233444667 33444667 not_found FALSE 利用不可 4 025911122-4 25911122 211198989 11198989 not_found FALSE 利用不可 5 025998764-1 25998764 212989238 12989238 not_found FALSE 利用不可 6 025925925-3 25925925 224397501 24397501 not_found FALSE 利用不可 7 025900000-2 25900000 225973223 25973223 が見つかりました 真、B2 $C$5 8 025999999-5 25999999 223334445 23334445 not_found FALSE 利用不可 9 025965453-6 25965453 211100110 11100110 not_found FALSE 利用不可 10 025943536-2 25943536 225911122 25911122 が見つかりました True、B4 $C$7
編集
私が持っている式は
X - helper
:=IF(F4="found",CELL("address",INDEX($B$4:$C$13,MATCH(E4,$C$4:$C$13,0),2)),"Not_Available")