###前提・実現したいこと
下記内容を実現するにあたり、コードについて教えていただければ幸いです。
A B C
みかん
りんご りんごジュース りんご缶
りんごジュース
すいか すいか割り
りんご缶
すいか割り
A列がすでに入力済みで、B、C列はVBAを実行することで自動で値を入力したいと考えています。
A列を上から検索値として下方向に検索をかけて、部分一致かつ文字が検索値より長い場合に、同じ行の隣の列(B、C、D)に検索値を与えたいです。
###発生している問題・エラーメッセージ
今現在は下記内容までできていますが、①②③が分からず、皆様からご教授いただければと思います。 ※そもそも実現可能なのでしょうか。 Dim c As Object Dim searchWord As Variant Dim Target As Range Dim firstWord As String '最初の検索 Set Target = Range("A1") '①検索値を列方向へ移動 searchWord = Target.Value Set c = Range("B4:B5000").Find(searchWord, LookAt:=xlPart) '②検索値よりも長い単語を条件 If c Is Nothing Then MsgBox searchWord & "は見つかりませんでした。" End If firstWord = c.Address '③同じ行の隣の列に値を貼り付け Do ' c に対する処理 ' 次を検索 Set c = Cells.FindNext(c) If c Is Nothing Then Exit Do End If If c.Address = firstWord Then Exit Do End If '③同じ行の隣の列に値を貼り付け Loop ①:検索値を下方向へずらしていく。Offsetで可能? ②:検索条件として、検索値よりも長い単語を検索結果としたい場合、どこに条件をいれるのがいいのか。 ③:検索結果としてヒットした単語の隣の行に検索値を与える。B列が埋まっている場合は、C列にというやり方がわかりません。。。 VBA自体これまでやってこなかったこともあり、質問も分かりずらいかと思いますが、ご教授願います。
出力例で、「りんご缶 りんごジュース」というのがありますが、部分一致という場合、通常は「検索値」が「検索対象」の一部(含まれる)という意味になりますが、りんご缶 はりんごジュースの一部ではないですよね。これも結果に含むとなると、Findでは無理で関数を自作することになりますが、これは必要ですか。その場合、どこまで一致すれば、一致とみなすのかの基準を明確にする必要もあります。
大変失礼しました。おっしゃる通りでりんご缶はりんごジュースの一部ではないので、検索結果としては隣の列に値を入れないです。出力例が間違っており恐縮です。
予想ですが、A列を「りんご」で検索して「りんごジュース」が見つかったら、次に「りんごジュース」を検索値としてA列を検索して「リンゴジュース1ダース」を見つける。検索結果が返らなくなったら元の検索値「りんご」の右に「りんごジュース」「りんごジュース1ダース」を書き込む。というようなイメージで合っていますか?これならFind関数で対応可能ですが、文面通りですと「りんごジュース」で探して「リンゴ」を見つける様なことになり、上で指摘のあったように自作することになります。
ご指摘ありがとうございます。実現したいこととしては、りんごで検索して、部分一致かつ、単語が長いものである(先ほどは単語が短いとしておりました。申し訳ないです。)、りんごジュースや、りんごジュース1ダースがヒットすると思うので、そのヒットしたものをりんごの隣の列に並べるイメージです。りんごが全て完了したら、下の行に移動し、りんごジュースで検索をかけ、りんごジュースよりも長い言葉であるりんごジュース1ダースがヒットするので、りんごジュースの隣にりんごジュース1ダースが入るイメージです。その場合は、Find関数の部分一致と単語の長さを条件に実現できるのではないかと思っていました。こちらocdpdcoさんの理解と同じでしょうか。認識の齟齬があリましたら、こちらの説明不足で大変申し訳ないです。
回答3件
あなたの回答
tips
プレビュー