- ベストアンサー
アンケートで条件から抽出し分類するマクロ エクセル
- 製品のアンケートをまとめたいと思っておりますが、マクロを習いたてのため上手くいきません。再度ご質問させていただきます。
- 1セルにあるコメント(文字列)から複数あるキー検索し、キーの多いものを、そのコメントの結果にしたいです。
- コメント1については、”検索グループA”をコメント1の横に表示したい。コメント2については、”検索グループC”をコメント2の横に表示したい。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Sheet1のE1に =ISNUMBER(FIND(B1,Sheet2!A1))+ISNUMBER(FIND(C1,Sheet2!A1))+ISNUMBER(FIND(D1,Sheet2!A1)) という式を入れると、Sheet2のA1のコメントが B1:D1の3つのキーワードのうち、いくつに合致しているかを返します。 この式をE100まで入れたら =INDEX(Sheet1!A1:A100,MATCH(MAX(Sheet1!E1:E100),Sheet1!E1:E100,FALSE)) という式で、該当する検索グループを返すことができます。 (※最大値が同値で複数ある場合は、上にある方が優先されます) これをSheet2の2000行分、ループさせるような形です。 処理にちょっと時間がかかるかもしれませんが… Sub データ検索() Dim m As Long Dim n As Long Sheet2.Range("B1:B2000").ClearContents For m = 1 To 2000 If Sheet2.Cells(m, 1) <> "" Then Sheet1.Range("E1:E100").ClearContents For n = 1 To 100 If Sheet1.Cells(n, 1) <> "" Then Sheet1.Cells(n, 5).Formula = "=ISNUMBER(FIND(B" & n & ",Sheet2!A" & m & "))+ISNUMBER(FIND(C" & n & ",Sheet2!A" & m & "))+ISNUMBER(FIND(D" & n & ",Sheet2!A" & m & "))" End If Next n Sheet2.Cells(m, 2) = Application.WorksheetFunction.Index(Sheet1.Range("A1:A100"), Application.WorksheetFunction.Match(Application.WorksheetFunction.Max(Sheet1.Range("E1:E100")), Sheet1.Range("E1:E100"), False)) End If Next m Sheet1.Range("E1:E100").ClearContents End Sub
その他の回答 (1)
- web2525
- ベストアンサー率42% (1219/2850)
コメントの分割が最大の難点になるのではないでしょうか? コメントは全て日本文で"が"が検索の区切りになっていて、検索する単語自体に"が"の文字が含まれて居ないのであれば問題は無いのですが、その点はいかがでしょうか? 検索する単語の区切り文字が複数存在していたり、検索単語自体に区切り文字が使われていると、コメントの検索単語の分割自体が不可能になります
お礼
アドバイスありがとうございます。コメント自体はセル毎に分割済みですぐマクロさえできれば、作業できる段階です。また、下記のようにやってみましたが、(大分検討違いですが・・・)単独フレーズから単独条件をあてることはできますが、複数対複数の検索ができません。よろしくお願いします。 ---------------------------- Sub 同じ条件でデータ検索() Dim myRange As Range, srcRange As Range, myAddress As String, i As Integer Set srcRange = Range("C22") Set myRange = srcRange.Find(What:=Range("D30").Rows(1).Value, LookIn:=xlValues, LookAt:=xlPart, MatchByte:=False) 'myRangeは検索結果を格納中 If Not myRange Is Nothing Then myAddress = myRange.Address i = 9 Do Cells(30, i).Value = myRange.Offset(, -1).Value Set myRange = srcRange.FindNext(After:=myRange) i = i + 1 Dim LastRowIndex As Long Dim LastColumnIndex As Long ・・・・・・など未完成です。。。
お礼
まずお礼申し上げます。こんなにスラスラ書けたら(努力のたまものでしょうが・・・)うらやましく思います。これを参考にしマクロを勉強したいと思います。まず、いただいたアイディアを実行してみます。またお返事いたします。見知らぬ方にこうして頂き心強く思います。ありがとうございます。