電子書籍の厳選無料作品が豊富!

困っているというわけではないのですが、ヘルプなどを見ても特に詳しいことに触れてないのでお世話になりたいと思います。
つい数日前までブックAにある文字列でブックBにある内容は同じだけれど簡略化して記入した文字列に対してFindメソッドをもちいてブックBの任意の行番号を取得する動作をさせていました。
動作自体を作るのは問題なかったのですが、まったく期待する文字列を検索してくれずに困っていました。
例えばブックAに山田太郎(abc商事)とありブックBは山田太郎だったとすると山田太郎が一致しているからxlPart条件でいけると思っていたのです。しかし、結果はブックBにも山田太郎(abc商事)と入っていなければ検索が成功しなかったのです???
当初はそのようなことを疑っていなかったので、動かない状態が1週間続きこちらで困りに困って質問させていただきましたが結局コード自体には問題がないことになり回答してくださった方には大変申し訳なく思っております。
結局、xlPartとはどうった動作なのでしょうか?わけがわかりません。

A 回答 (5件)

ご質問の趣旨を取り違えていましたらすみません。



>ブックAにある文字列でブックBにある内容は同じだけれど簡略化して記入した文字列に対して
>FindメソッドをもちいてブックBの任意の行番号を取得する

>例えばブックAに山田太郎(abc商事)とありブックBは山田太郎だったとすると

もしかして、
 ブックAにある文字列(ex."山田太郎(abc商事)")を検索キーとして、
 ブックBについて部分一致検索で検索し、
 ブックBにある文字列(ex."山田太郎")を探したい
ということでしょうか?

であれば「部分一致検索」という処理について誤解があるように思います。

FindメソッドのxlPartという指定は、#1さんのおっしゃるとおり「部分一致検索」の指定ですが、
この場合の(そしておそらく一般に)「部分一致検索」というのは、
検索対象の文字列群のうち、検索キー【を含む】文字列を探すという意味です。
したがって、検索キー【に含まれる】文字列はヒットしません。

"山田太郎"をキーとして部分一致検索すれば、"山田太郎(abc商事)"はヒットしますが、
"山田太郎(abc商事)"をキーとして部分一致検索しても、"山田太郎"はヒットしません。
-----------------------------------------------------------------------------
というわけで、もし上述のような動作を期待しておられるのであれば、
部分一致検索では実現できません。

・"山田太郎(abc商事)"から文字列操作で"("の直前まで"山田太郎"を切り出して、それをキーに検索する。

あるいは、

・ブックBのセル全体を回して、InStr関数等で個別に評価する

といったアプローチが必要になるのではないかと思います。

以上ご参考まで。
    • good
    • 0
この回答へのお礼

ご指摘どおりの解釈をしておりました。
細かい設定は文字列操作などをしてやらないと、山田太郎(abc商事)をひとつのくくりにしてしまうわけですね。
楽をしようと考えて、プログラムを使う側の感覚でいた自分を反省します。今私は組む側でした。

お礼日時:2008/10/25 11:33

多分これで。

。(まだ動揺中)

レスの無駄消費申し訳ない。

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
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。
確かに、前回の質問内容へのリンクを張らなかったのはマナー不足だったかもしれません。個人的には、コードを書き直すことよりもxlPart自体の動きを把握したく思っていたもので(^^;)
提示していただいたコードをリンク先にあった内容に合うよう書き直してはめ込んでみましたがやはり現象としては同じで、キーワードを探すことができていないようです。恐らく今回の私の動作に対する認識の肝はNo5さんの指摘にあるような気がします。
しかしながら、For Eachを組み込むことで動作が速くなりました。コードの長さがそんなないものでもコレクション化するとだいぶ違うものですね。勉強になりました。

お礼日時:2008/10/25 10:08

わお!また間違えた。



すみません。出直してきます。少し動揺気味。
    • good
    • 0

#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
    • good
    • 0

こんにちは。



前スレへのリンクもなく、ソースも掲載なしでは不親切では?
回答者は前スレを探すとこから始めることになってしまいますよ。

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
    • good
    • 0

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