- ベストアンサー
エクセルVBA 検索時に除外を設定したい
エクセルVBAにて、個人情報が含まれていないか検索するマクロを作成しています。 複数の文字列のなかから、 「佐藤さん」 などと記入されているセルを検索したいのですが、部分一致で「さん」で検索すると 当然、「さん」を含むすべてのセルが検出されます。 その際に、「たくさん」「社長さん」など除外ワードを検索時に設定することは可能でしょうか。 除外ワードを設定するのが難しいのであれば、「さん」の検索をしたあとに 除外ワードの検索をするようにしようかと考え中です。 別々で検索する方法しかないかどうか、ご教授いただきたいです。 よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんな質問はVBAの問題というより、日本人なのだろうから、文章や語句の洞察力の問題でしょう。 どういうロジックにすれば満足するものが出来るのか、まず文章にでも表現してご覧。それが出来ないならプログラムは組めない。ただし、文章化ができてもプログラムでは難しいことも多かろう。 例えば「さん」を見つける。その前に個人名があれば削除するとする。しかし個人名は沢山あって、個人の力では列挙できないのは常識だろう。質問者は、人名辞書まで当たるコードをつくる力は無いだろう。 だから不可能と思う。普通の人では、「おもちゃ」しか出来ないでしょう。 「さん」がついてない場合も在ろうし、「さま」もあろうし、社長さんもあろう。 こういうのはある程度プログラムにロジックとして組み込んで、あとは、人間が読んで判断するしかないだろう。 エクセルVBAごときが多少出来ても、こういう文章の内容や、文脈まで立ちいったことは出来ないし、エクセルは(VBAは)その道具として適当でない。 文章をセルに入れるのさえ、表計算ソフトの沿革から、当初予想された機能ではないとおもう。 大学院ででも情報処理の研究分野にするならともかく、難しい課題だ。 正規表現などという、概念・ツールがあるが、まだそういうことに近いことを目指しているように思うが(ぴったりというものではなく)、VBAの主流ではないし直ぐには学習が難しい。。 エクセルVBAでは、文章から名詞を抜き出すのさえ難しかろう。 >別々で検索する方法しかないかどうか、ご教授いただきたいです プログラムのチェックルーチンを書き重ねることで、見かけ上一度にやれる手はありそう。 エクセルの操作を前提にして、囚われているから、「別々」とか言う発想(疑問に)なるのだ。
お礼
ご回答ありがとうございます。 私の語彙力が足りず申し訳ありませんでした。 現在、セルの中に「さん」を見つけたら、隣の列に「さん」を書き出すという プログラムを作成しています。 「さん」を含むセルを特定できたあとは、人の目で判断することを想定しています。 人の目で判断する際に、あきらかに人名ではないワードを設定して除外し、判断の 手間を減らせないかと考えていたのです。 「さん」を見つけたときに、「たくさん」だったら、隣の列に「さん」を書き出さない処理が できるかということを質問させていただきました。 >プログラムのチェックルーチンを書き重ねることで、見かけ上一度にやれる手はありそう。 ご助言、ありがとうございました。 見かけ上一度にできるよう検討してみます。
補足
現在、作成途中のものです。 Dim C As Range '検索する列 Dim R As Long '検索ワード最終行 Dim i As Long '検索ワード数 Dim W As String '検索ワード Dim FoundCell As Range '検索結果格納 Dim FirstCell As Range Dim Target As Range Dim TargetB As String Set C = Application.InputBox(Prompt:="チェックしたい列の任意のセルをクリックしてください", Type:=8) Range(C.End(xlUp), C.End(xlDown)).Select '検索する列を選択 '検索ワードの最終行特定 R = Sheets(2).Cells(Rows.Count, 2).End(xlUp).Row '検索ワードの数だけ、検索 For i = 2 To R W = Sheets(2).Cells(i, 2).Value Set FoundCell = Selection.Find(What:=W, After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, MatchByte:=False, SearchFormat:=False) If FoundCell Is Nothing Then '検索ワードがない場合は、0と入力 Sheets(2).Cells(i, 3).Value = 0 Else Set FirstCell = FoundCell FoundCell.Offset(0, 1).Value = Sheets(2).Cells(i, 2) End If Do Set FoundCell = Cells.FindNext(FoundCell) If FoundCell.Address = FirstCell.Address Then Exit Do Else FoundCell.Offset(0, 1).Value = Sheets(2).Cells(i, 2) End If Loop Next i Dim cnt As Long 'フラグの数 Dim F As Long F = ActiveCell.Offset(0, 1).Column If Sheets(2).Cells(3, 3) = 0 Then Else cnt = WorksheetFunction.CountIf(ActiveSheet.Range(Cells(1, F), Cells(65536, F)), Sheets(2).Cells(3, 1)) Sheets(2).Cells(i, 3).Value = Cut End If MsgBox " 完了しました。 ", vbOKOnly + vbInformation, "" End Sub