dポイントプレゼントキャンペーン実施中!

お世話になっております

Excel2003でFindメソッドを使って結合したセルの中身を検索したところ、Nothingが返ってきます

結合を解くと検索できるので、コードが悪いわけではないと思います

以前教えていただいた、VBAマイグレーションには引数SearchOrderにxlByColumnsを指定すると結合セルの中身を検索できないとありますが、SearchOrderにはxlByRowsを指定しています

結合したセルの中身ってFindで検索できないんでしょうか?

A 回答 (3件)

こんにちは。

KenKen_SP です。

Set Rng = WS.Columns(ColNo).Find(what:=Data, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext)

このコードと補足いただいた状況を試しましたが、Excel2002でも Nothing に
なりますね。

どうもA列とB列の結合セルが ColNo 1 にあるのか 2 なのかうまく VBA が判断
できてないみたいです。これが規定の動作かもしれません。

回避策としては、Find での検索範囲を Cells に広げて、見つかった rng を
Intersect(rng, Columns(ColNo)) で Nothing とならなければ良し、とする方法
を考えてみました。

サンプルをアップしますが、動作するコードということで余計な部分を付け足し
てありますが、ご参考下さい。

それから蛇足ですが、Find メソッドは LookIn も明示的に指定した方が良いで
しょう。詳しくはヘルプをみて下さい。

Sub Sample()

  Dim rng   As Range
  Dim WS    As Worksheet
  Dim ColNo  As Long
  Dim DATA   As String
  Dim strFIRST As String
  Dim flag   As Boolean
  
  Set WS = Sheet1
  ColNo = 1
  DATA = "検索文字列"
  
  
  'ここから---------------------------------
  
  '一度セル全体で検索する
  Set rng = WS.Cells.Find( _
    What:=DATA, _
    LookIn:=xlValues, _
    LookAt:=xlPart, _
    SearchOrder:=xlByRows, _
    SearchDirection:=xlNext)
  
  '見つかったらそれが Intersect で ColNo の列と交差するか調べ
  '交差するばOK、、しなければ見つからなくなるまで再検索
  If Not rng Is Nothing Then
    strFIRST = rng.Address
    Do
      If Not Intersect(rng, Columns(ColNo)) Is Nothing Then
        flag = True
        Exit Do
      Else
        Set rng = WS.Cells.FindNext(rng)
      End If
    Loop While Not rng Is Nothing And rng.Address <> strFIRST
    If flag Then
      MsgBox "Found Row Number:=" & rng.Row
    End If
  End If

End Sub
    • good
    • 0
この回答へのお礼

こんばんは、blue_001です

ご教授いただいた方法で無事行番号を取得することができました

LookInも前回の設定をそのまま引き継ぐとは知らず省略していましたが、指定しておいたほうがよさそうですね

本当に助かりました
ありがとうございました

お礼日時:2006/01/06 17:43

こんにちは。

Wendy02です。
昨日から、様子を見ていました。

Set Rng = WS.Columns(ColNo).Find(what:=Data, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext)

基本的な疑問なのですが、結合セルを探すのに、なぜ、ColNo を1つの列にしなければならないのでしょうか?二列にすれば、ヒットしますね。

それと、それ以前の問題ですが、結合セルとそうでないセルの混在のデータ領域を検索すること自体に、設計的な問題があるような気がします。ここの板では、あまり指摘しないようですが、一般的には、VBAでは、結合セルを含んだ処理は専用のオプションコードが必要とされるので、避けられますね。

一応、1列だけの検索でしたら、こういうものでもよいかと思うのですが。

 On Error Resume Next
 RowNo = 0
 RowNo = WorksheetFunction.Match(Data & "*", Columns(ColNo), 0)
 'LookAt:=xlPartの代わりにワイルドカードを使いました。
 On Error GoTo 0
 If RowNo > 0 Then
 Set rng = Cells(RowNo, ColNo)
 End If

この回答への補足

こんばんは、blue_001です
先日はお世話になりました

前まで使っていたシートを変更することができないので(見た目の変更が絶対禁止なんです…)、結合セルとそうでないセルが混在している領域を検索する必要があるんです

検索のコードも記述していただき、前回同様色々と勉強になります

本当にありがとうございます

補足日時:2006/01/06 17:43
    • good
    • 0

こんにちは、KenKen_SP です。



VBAマイグレーション について記された PDF の技術資料をみてみましたが、
確かに SearchOrder について、

> SearchOrder に 列方向を表す xlByColumns を指定した場合、対象の文字列
> が結合セルにあると、Excel 2003 では無視されます。
> この現象を回避するには、SearchOrder に 行方向を表す xlByRows を指定し、
> 次のように記述します。

とありますね、、でも逆に言えば、これさえ設定すればちゃんと動作するはず
なのでは?

原因はどこか他にある気がします。コードの主要部分を前後を含めて提示し、
どのような状況、例えば、どのセルを選択した状態でコードを実行しているの
かを補足してみてはどうですか?

この回答への補足

KenKen_SPさん、回答ありがとうございます

質問した後にコード記述忘れに気づいたんですが、補足だけの投稿ができず、ありゃ~と思っておりました…

言われたとおり、コードだけでなく状況も説明させていただいたほうがよさそうなので、以下に記述させていただきます


例えば、ワークシート名がシート1で、A・B列を結合したセルの中身に"検索文字列"を含んだものがあり、それを検索し、行番号を返そうと思っています

下にコードを記述させていただきます

Set Rng = WS.Columns(ColNo).Find(what:=Data, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext)

WSがワークシート名(例でいうとシート1)、ColNoが列番号(例でいうと1(A列))、Dataが検索文字列(例でいうと"検索文字列")となっております


以上、宜しくお願いいたします

補足日時:2006/01/06 09:29
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています