[[20180222154444]] 『2重検索を行いたい』(seira) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『2重検索を行いたい』(seira)

いつも拝見させていただいております
大変お手数と思いますが
ご教示頂けたら幸いです

2つの異なる条件から値を検索したいと思っています

検索される側 16桁の数字文字列
検索する側 
第一条件 Range("A1").Value  文字列2桁数字
第二条件 Cells(2, 1).Value  文字列2桁数字

この時下記の条件合うように変更したいのですが
どの様にすれば良いのでしょうか
第一条件は 検索される側の下8,7桁目
第二条件は 検索される側の下2,1桁目

Sub 二重条件検索()

Dim FindCel As Range '検索結果を記録'
Dim FirstCel As Range '検索にヒットした最初のセルを記録
Dim i As Long
Set FindCel = Sheets("RA_RA").Range("R:R").Find(what:=Range("A1").Value) '一つ目の検索ワードを検索'

If FindCel Is Nothing Then

Else

    Set FirstCel = FindCel
    If InStr(FindCel.Value, Cells(2, 1).Value) <> 0 Then 'セルに二つ目の検索ワードが含まれている場合'
        MsgBox FindCel.Row & "行目の" & FindCel.Column & "列目です。"
    Else
        Do
            Set FindCel = Cells.FindNext(FindCel)   '目的のセルが見つかるまで検索を繰り返す’

            If FindCel.Address = FirstCel.Address Then  '検索対象の終端に達した'
                MsgBox "検索ワードにヒットしませんでした。"
                Exit Do '検索終了'
            End If

            If InStr(FindCel.Value, Cells(2, 1).Value) <> 0 Then 'セルに二つ目の検索ワードが含まれている場合'
                MsgBox FindCel.Row & "行目の" & FindCel.Column & "列目です。"
                Exit Do
            End If
        Loop
    End If
End If

End Sub

お手数お掛けしますが
宜しくお願いいたします

< 使用 Excel:Excel2010、使用 OS:Windows7 >


ちょっとやりたいことが解らないんですが、

(1)「Sheets("RA_RA").Range("R:R")」を検索範囲として 「Range("A1")」の値と同じものを”含んでいる”セルを探す
(2)(1)でセルが見つかれば、そのセルに「Range("A2")」の値と同じものが”含まれるか”判定して、
(3)(2)の判定が真ならセル番地をメッセージボックスで見つかるごとに表示したい
(4)(1)〜(3)を繰り返し
ってことでいいですか?
 
(もこな2) 2018/02/22(木) 16:15


もこな2様
ご質問有難う御座います

>(1)「Sheets("RA_RA").Range("R:R")」を検索範囲として 「Range("A1")」の値と同じものを”含んでいる”セルを探す

検索される値 例 2018021705010701  このような16桁構成になっています
検索値 Range("A1") 例05

この時 下8〜7桁 05を探す 例 20180217  05  010701 

>(2)(1)でセルが見つかれば、そのセルに「Range("A2")」の値と同じものが”含まれるか”判定して、
検索値 Cells(2, 1).Value 例01

検索される側の下2桁 01

例 20180217050107   01 

この二つの条件を含んだ値のセル値を探したいのです

何卒宜しくお願いいたします

(seira) 2018/02/22(木) 16:37


 これって、二重にしなくても桁数が決まっているので
 Findメソッド使うなら、ワイルドカード使って1回で済むんじゃないですかね?

 Sub 二重条件検索()
    Dim FindCel As Range '検索結果を記録'
    Dim FirstCel As Range '検索にヒットした最初のセルを記録
    Set FindCel = Sheets("RA_RA").Range("R:R").Find(What:="*" & Range("A1").Value & "????" & Range("A2").Value, LookAt:=xlWhole) '一つ目の検索ワードと二つ目を同時検索'
    If Not FindCel Is Nothing Then
        Set FirstCel = FindCel
        Do
            Set FindCel = Cells.FindNext(FindCel)   '目的のセルが見つかるまで検索を繰り返す’
            MsgBox FindCel.Row & "行目の" & FindCel.Column & "列目です。"
            If FindCel.Address = FirstCel.Address Then  '検索対象の終端に達した'
                MsgBox "検索終了"
                Exit Do '検索終了'
            End If
        Loop
    End If
 End Sub
(ろっくん) 2018/02/22(木) 16:44

ろっくん様
有難う御座います

お手数かけて申し訳御座いません

下記の部分で NO91 変数エラーが 下記の部分で出てしまいます

MsgBox FindCel.Row & "行目の" & FindCel.Column & "列目です。"

Range だとダメなのでしょうか?

(seira) 2018/02/22(木) 17:00


私もろっくんさんの仰るようにワイルドカード使って1回の処理すればいいとおもいますけど、変数エラーってなんですか? 
Option Explicit 付けて無くて
どこかタイプミスしてるの気づいてないとか?
(もこな2) 2018/02/22(木) 17:08

連投すみません。追加で。
条件に合致するものが複数あった場合、その都度メッセージ出てきてうざったいような気がするんですけど、そこは問題ないんですか?

コードを見る限り
「目的のセルが見つかるまで検索を繰り返す」じゃなくて「FindNextで見つかるものがFindでみつかったものと同じになるまで繰り返す」になってるから、R列全部みることになるとおもうんですが・・・
※ループを抜ける処理が見当たらないし(私の見落としであればすみません)
※絶対に2個以上該当するものが無いのであればFindNextいらないですよね?
(もこな2) 2018/02/22(木) 17:18


もこな2様
有難う御座います
NO91
オブジェクト変数または With ブロック変数が設定されていません。
上記が出ています

ただ色々調べてると ノーヒットの可能性が大きいみたいですね

データーは存在しております

文字列に対すエラーなのか  と思っていますが

回避策は見つからない状態です

>※絶対に2個以上該当するものが無いのであればFindNextいらないですよね?

仰るとおりです とりあえず セル番地もとめてから 次の作業に入ろうかと考えています
ただこの番地が求められないと 次のステップに移行できないものでして

教えていただけるなら 御教示頂きたいです
(seira) 2018/02/22(木) 17:35


 あ、すみません。
 検索条件のシートとデータの入っているシートが違うんですね。
 ついでに見つからなかった時の処理書き忘れたので入れました。

  Sub 二重条件検索()
    Dim FindCel As Range '検索結果を記録'
    Dim FirstCel As Range '検索にヒットした最初のセルを記録
    Set FindCel = Sheets("RA_RA").Range("R:R").Find(What:="*" & Range("A1").Value & "????" & Range("A2").Value, LookAt:=xlWhole) '一つ目の検索ワードを検索'
    If Not FindCel Is Nothing Then
        Set FirstCel = FindCel
        Do
            Set FindCel = Sheets("RA_RA").Cells.FindNext(FindCel)   '目的のセルが見つかるまで検索を繰り返す’
            MsgBox FindCel.Row & "行目の" & FindCel.Column & "列目です。"
            If FindCel.Address = FirstCel.Address Then  '検索対象の終端に達した'
                MsgBox "検索終了"
                Exit Do '検索終了'
            End If
        Loop
    Else
        MsgBox "検索ワードにヒットしませんでした。"
    End If
 End Sub
(ろっくん) 2018/02/22(木) 17:37

編集かぶったけど、とりあえず投稿します。

FindNextいらないですよね?
↑ごめんなさい。ここ理解しました。

最初のは2重で処理しようとしていて、FindNextつかってて、2つめの条件に一致したら、そこで Exit Do してるんですね。
そうなると、二重処理がいらないから、Findメソッドだけで対応すればokっぽいですね。

ちなみに、Findメソッドの省略可能な引数のうち、いくつかの引数は前回値を承継するので、意図して省略してないのであれば、手動も含めて、前回実施した検索によっては今まで動いていたマクロが突然動かなくなることもあるって覚えておいた方がいいとおもいます。

また、Findメソッド以外にも、単一の列(行)のどこに検索値と合致するものがあるのか調べるには、ワークシート関数のMATCH関数を使うって方法もあるので、興味があったら研究してみるのも良いかもしれません。
(もこな2) 2018/02/22(木) 17:42


ろっくん様

有難う御座いました
助かりました

もこな2様

色々有難う御座います

(seira) 2018/02/22(木) 17:46


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.