- ベストアンサー
xlPartってほんとに一部分なんでしょうか?
困っているというわけではないのですが、ヘルプなどを見ても特に詳しいことに触れてないのでお世話になりたいと思います。 つい数日前までブックAにある文字列でブックBにある内容は同じだけれど簡略化して記入した文字列に対してFindメソッドをもちいてブックBの任意の行番号を取得する動作をさせていました。 動作自体を作るのは問題なかったのですが、まったく期待する文字列を検索してくれずに困っていました。 例えばブックAに山田太郎(abc商事)とありブックBは山田太郎だったとすると山田太郎が一致しているからxlPart条件でいけると思っていたのです。しかし、結果はブックBにも山田太郎(abc商事)と入っていなければ検索が成功しなかったのです??? 当初はそのようなことを疑っていなかったので、動かない状態が1週間続きこちらで困りに困って質問させていただきましたが結局コード自体には問題がないことになり回答してくださった方には大変申し訳なく思っております。 結局、xlPartとはどうった動作なのでしょうか?わけがわかりません。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
ご質問の趣旨を取り違えていましたらすみません。 >ブックAにある文字列でブックBにある内容は同じだけれど簡略化して記入した文字列に対して >FindメソッドをもちいてブックBの任意の行番号を取得する >例えばブックAに山田太郎(abc商事)とありブックBは山田太郎だったとすると もしかして、 ブックAにある文字列(ex."山田太郎(abc商事)")を検索キーとして、 ブックBについて部分一致検索で検索し、 ブックBにある文字列(ex."山田太郎")を探したい ということでしょうか? であれば「部分一致検索」という処理について誤解があるように思います。 FindメソッドのxlPartという指定は、#1さんのおっしゃるとおり「部分一致検索」の指定ですが、 この場合の(そしておそらく一般に)「部分一致検索」というのは、 検索対象の文字列群のうち、検索キー【を含む】文字列を探すという意味です。 したがって、検索キー【に含まれる】文字列はヒットしません。 "山田太郎"をキーとして部分一致検索すれば、"山田太郎(abc商事)"はヒットしますが、 "山田太郎(abc商事)"をキーとして部分一致検索しても、"山田太郎"はヒットしません。 ----------------------------------------------------------------------------- というわけで、もし上述のような動作を期待しておられるのであれば、 部分一致検索では実現できません。 ・"山田太郎(abc商事)"から文字列操作で"("の直前まで"山田太郎"を切り出して、それをキーに検索する。 あるいは、 ・ブックBのセル全体を回して、InStr関数等で個別に評価する といったアプローチが必要になるのではないかと思います。 以上ご参考まで。
その他の回答 (4)
- KenKen_SP
- ベストアンサー率62% (785/1258)
多分これで。。(まだ動揺中) レスの無駄消費申し訳ない。 Sub sample() Dim wb As Workbook Dim sh As Worksheet Dim rSearch As Range Dim r As Range Dim sKeyword As String Dim sFirst As String sKeyword = "山田太郎" For Each wb In Workbooks For Each sh In wb.Worksheets Set rSearch = sh.Cells Set r = rSearch.Find(What:=sKeyword, _ LookIn:=xlValues, _ LookAt:=xlPart) If Not r Is Nothing Then sFirst = r.Address Do Debug.Print wb.Name & vbTab; Debug.Print sh.Name & vbTab; Debug.Print r.Address & vbTab; Debug.Print r.Value Debug.Print "---------------------------------" Set r = rSearch.FindNext(r) Loop While Not r Is Nothing And r.Address <> sFirst End If Next sh Next wb Set rSearch = Nothing Set rFirst = Nothing End Sub
お礼
ご返答ありがとうございます。 確かに、前回の質問内容へのリンクを張らなかったのはマナー不足だったかもしれません。個人的には、コードを書き直すことよりもxlPart自体の動きを把握したく思っていたもので(^^;) 提示していただいたコードをリンク先にあった内容に合うよう書き直してはめ込んでみましたがやはり現象としては同じで、キーワードを探すことができていないようです。恐らく今回の私の動作に対する認識の肝はNo5さんの指摘にあるような気がします。 しかしながら、For Eachを組み込むことで動作が速くなりました。コードの長さがそんなないものでもコレクション化するとだいぶ違うものですね。勉強になりました。
- KenKen_SP
- ベストアンサー率62% (785/1258)
わお!また間違えた。。 すみません。出直してきます。少し動揺気味。
- KenKen_SP
- ベストアンサー率62% (785/1258)
#1 です。ごめんなさい。寝ぼけて適当なことを書いてしまいました。 参照先がころころ変わるのにオブジェクトの比較じゃ、ダメですよねー。。 ということで、下記に訂正いたします。 Sub sample() Dim wb As Workbook Dim sh As Worksheet Dim rSearch As Range Dim r As Range Dim sKeyword As String Dim rFirst As Range sKeyword = "山田太郎" For Each wb In Workbooks For Each sh In wb.Worksheets Set rSearch = sh.Range("A1:E1000") Set r = rSearch.Find(What:=sKeyword, _ LookIn:=xlValues, _ LookAt:=xlWhole) If Not r Is Nothing Then sFirst = r.Address Do Debug.Print wb.Name & vbTab; Debug.Print sh.Name & vbTab; Debug.Print r.Address & vbTab; Debug.Print r.Value Debug.Print "---------------------------------" Set r = rSearch.FindNext(r) Loop Until Not r Is Nothing And r.Address <> s End If Next sh Next wb Set rSearch = Nothing Set rFirst = Nothing End Sub
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。 前スレへのリンクもなく、ソースも掲載なしでは不親切では? 回答者は前スレを探すとこから始めることになってしまいますよ。 http://oshiete1.goo.ne.jp/qa4416154.html > xlPartとはどうった動作なのでしょうか? Find メソッドの検索パラメータ LookAt に指定する定数 xlPart の ことでしたら、部分一致検索を指定していることになります。 全てのブック・シートで検索するなら、下記を試してみて下さい。 結果は、イミディエイトウインドウに表示します。VBE 画面で Ctrl + G キーで表示します。 小規模テストしかしてませんが、問題なく全て部分一致検索できて ます。 Sub sample() Dim wb As Workbook Dim sh As Worksheet Dim rSearch As Range Dim r As Range Dim sKeyword As String Dim rFirst As Range sKeyword = "山田太郎" For Each wb In Workbooks For Each sh In wb.Worksheets Set rSearch = sh.Cells Set r = rSearch.Find(What:=sKeyword, _ LookIn:=xlValues, _ LookAt:=xlPart, _ MatchByte:=True) If Not r Is Nothing Then Set rFirst = r Do Debug.Print wb.Name & vbTab; Debug.Print sh.Name & vbTab; Debug.Print r.Address & vbTab; Debug.Print r.Value Debug.Print "---------------------------------" Set r = rSearch.FindNext(r) Loop Until Not r Is Nothing Or r Is rFirst End If Next sh Next wb Set rSearch = Nothing Set rFirst = Nothing End Sub
お礼
ご指摘どおりの解釈をしておりました。 細かい設定は文字列操作などをしてやらないと、山田太郎(abc商事)をひとつのくくりにしてしまうわけですね。 楽をしようと考えて、プログラムを使う側の感覚でいた自分を反省します。今私は組む側でした。