アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBAの初心者です。
取引実績データのC列「取引先名」を順次読んで重点顧客リストのB列「顧客名」と照合し、部分一致する行があれば、その顧客名を取引実績データのZ列「重点顧客」にコピーしたいです。

この場合の部分一致ですが、取引先名には正式名称(例.ABC食品株式会社)、顧客名には略称(例.ABC食品)が入っています。
したがって、参照元ファイルの文字データの一部が参照先ファイルにあれば、それをコピーする、という動作となります。

ネットで検索しても、逆のパターン(参照元ファイルの略称から参照先ファイルの正式名称を取得する)しか見つけられず、このソースコードでは(当然?)目的を達せられなかったため、質問させていただきます。

質問者からの補足コメント

  • すみません。質問タイトルは正しくは「元データが正式名称、参照テーブルが略称の場合」でした。訂正いたします。

      補足日時:2017/06/16 00:05

A 回答 (4件)

普通は部分一致での検索は複数ヒットしてしまう可能性が有るので、まずは候補をリストとして表示したものからの選択の仕組みを作らないといけないので普通はやりません。


「正式名称」と「略称」の「1対多」のリストを用意しておいて「略称」から「正式名称」を導いてそれを使えばいいだけです。
    • good
    • 0
この回答へのお礼

ご回答有難うございます。
ご指摘はごもっともなのですが、本質問は部分一致を使用することを前提としています。

取引実績データは会社の公式なデータであり、取引先もマスター化されています。
これに対して、重点顧客との照合というのは、営業担当者が独自に行っているものであり、名称の精度や粒度は本人が決めています。
ABC食品の例でいえば、グループ会社も全て対象としたいのであれば、”ABC食品”で登録すれば良いし、親会社のみを検索したければ、”ABC食品株”と登録すれば良いという使い方です。
つまり、検索対象を簡易的に登録でき且つ検索に自由度を与えるために敢えて部分一致を使用したいのです。

 以上、よろしくお願いします。

お礼日時:2017/06/16 11:06

No1の方のいうとおりですね。


部分一致で良いなら
正式名称が「ABC食品株式会社」の場合、
略称が
「AB]
「ABC」
「ABC食品」
「株式会社」
等がマッチしてしまいます。
もし、AB物流株式会社があったなら、ABは、どちらの会社にもマッチしてしまいます。
又、
「ABC株式会社」を「ABC食品株式会社」にマッチさせたくてもこれはマッチしません。

上記のようになっても良いなら、部分一致は使えますが、おそらくそれは、あなたの望んだ結果ではないはずです。
    • good
    • 0
この回答へのお礼

ご回答有難うございます。
是非、部分一致で検索する方法をご教示ください。

お礼日時:2017/06/16 11:10

Dim a, b, r1


a = "ABC食品株式会社"
b = "ABC"
r1 = InStr(a, b)

aが正式名称です。
bが略称です。
r1が1以上の場合、部分一致しています。

if r1 > 0 then
Z列にコピーする処理
end if

のようになります。
    • good
    • 1
この回答へのお礼

ご回答有難うございます。
もう少し教えてください。

InStr関数を使う場合、InStr(a, b) のbはどのように指定すれば良いのでしょうか?

aは、単純にシート名.セル範囲を指定してFor Nextの中で取得して行けば良いのは分かるのですが、bは参照テーブルで直接値を指定できないので、どのように指定すれば良いのか分かりません。

幾つか関数や指定のパターンを調べては試してみたのですが、どれも上手く行きませんでした。(泣

お礼日時:2017/06/16 16:17

>InStr関数を使う場合、InStr(a, b) のbはどのように指定すれば良いのでしょうか?


>aは、単純にシート名.セル範囲を指定してFor Nextの中で取得して行けば良いのは分かるのですが、bは参照テーブルで直接値を指定できないので、どのように指定すれば良いのか分かりません。
回答:
bは、重点顧客リストのB列「顧客名」になるので、これも
For Nextの中で取得すればよいかと。

For row1 = 2 to rowMax1 '取引実績データのC列
a = workbooks(取引実績データのブック名).worksheets(取引実績データのシート名).Cells(row1,"C").value
For row2 = 2 to rowMax2 '重点顧客リストのB列
b = workbooks(重点顧客リストのブック名).worksheets(重点顧客リストのシート名).Cells(row2,"B").value
if Instr(a,b) > 0 then
workbooks(取引実績データのブック名).worksheets(取引実績データのシート名).Cells(row1,"Z").value = b
Exit For 'マッチしたので以降は検索しない
end if
Next row2
Next row1


maxrow1は取引実績データのC列の最大行
maxrow1 = workbooks(取引実績データのブック名).worksheets(取引実績データのシート名).Cells(Rows.count, "C").End(xlUp).row

maxrow2は重点顧客リストのB列の最大行
maxrow2も同様に算出
    • good
    • 0
この回答へのお礼

なるほど、For Nextをネストさせれば良いのですね。おかげ様で目的のマクロが作成できました。大変有難うございました!

お礼日時:2017/06/16 20:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!