[[20020514143945]] 『検索KEYに該当するデータがない場合の対処方法』(T2) ページの最後に飛ぶ

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

 

『検索KEYに該当するデータがない場合の対処方法』(T2)

検索KEYに該当するデータがなかった場合に、そのKEYは飛ばして、

次のKEYに移行しつつ、なかったKEYの数を数えて、

コメントで表示する方法を教えてください。

よろしくお願い致します。

Sub 検索()

    Dim i As Integer

    Dim j As Integer

    Dim k As Integer

    Dim name As String

    'シート名の置換え

    Set ws1 = Worksheets("KEY")

    Set ws2 = Worksheets("DB")

    Set ws3 = Worksheets("抜粋")

    Sheets("KEY").Select

    Range("B:B").Select

    rw = 0

    For Each rng In Selection

    If rng.Value = "" Then

    ret = rw

    Exit For

    End If

    rw = rw + 1

    Next

    For i = 2 To rw '「KEY」の数だけループ

        'シート「KEY」を選択

        Sheets("KEY").Select

        '「KEY」になるセルを選択

        Rows(i & ":2").Select

        '「KEY」になるセルの値を代入

        name = (ws1.Cells(i, 2))

        '選択したセルをコピー

        Selection.Copy

        'シート「DB」を選択

        Sheets("DB").Select

        '検索する対象列を選択

        Columns("H:H").Select

※ここで該当データがないとエラーになってしまいます!

 After:=ActiveCellのところでひっかかるようです。

 この時、次のKEYに飛びつつ、エラーKEYの数を数えて、

 一番最後にコメントで「10件該当なし」とかいう感じで

 表示したいのです。

    'KEYに該当するセルを検索

        Selection.Find(What:=name, After:=ActiveCell, LookIn:=xlFormulas, _

            LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _

            MatchCase:=False).Activate

        '該当するセル

        j = ActiveCell.Column '列

        k = ActiveCell.Row '行

        '該当するセルを含む行を選択する

        Rows(k & ":" & k).Select

        '選択した行をコピー

        Application.CutCopyMode = False

        Selection.Copy

         'シート「抜粋」を選択

        Sheets("抜粋").Select

        'データをコピーしたい行を選択

        Rows(i & ":" & i).Select

        '選択した行にデータをペースト

        ActiveSheet.Paste

    Next

End Sub


 After:=ActiveCellでエラーではなくて、.Activateだと思います。

 検索の値が存在しないわけだから、そのセルをアクティブにはできませんよね。

 そこをこう置き換えればいいかな。

       'KEYに該当するセルを検索

        Set adr = Selection.Find(What:=name, After:=ActiveCell, LookIn:=xlFormulas, _

            LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _

            MatchCase:=False)

        If Not adr Is Nothing Then  '検索出来たとき

            Range(adr.Address).Select

        ElseIf vbYes = MsgBox("KEY " & name & " はありません", vbOKOnly) Then

        End If

 一番最後にコメントで「10件該当なし」〜 というところは、自分で対応できますよね?

 (ramrun)


『検索該当データが複数ある場合の対処方法』(T2)

昨日は「検索KEYに該当するデータがない場合の対処方法」に対するご回答、

ありがとうございました。早速ご教示に従い、作成してみましたら、

通るようになりました。

ここでまた質問なのですが、検索結果が複数ある場合、

全ての結果に対して同じ処理を行いたいのですが、どのようにしたらよいでしょう?

ご教示よろしくお願い致します。

Sub 検索()

    Dim i As Integer

    Dim j As Integer

    Dim k As Integer

    Dim l As Integer

    Dim m As Integer

    Dim n As Integer

    Dim name As String

    Dim name2 As String

    Dim name3 As String

    Dim name4 As String

    Dim name5 As String

    'シート名の置換え

    Set ws1 = Worksheets("KEY")

    Set ws2 = Worksheets("DB")

    Set ws3 = Worksheets("抜粋")

    Set ws4 = Worksheets("該当無")

    '全検索数をカウント

    Sheets("KEY").Select

    Range("B:B").Select

    rw = 0

    For Each rng In Selection

    If rng.Value = "" Then

    ret = rw

    Exit For

    End If

    rw = rw + 1

    Next

    l = 0

    n = 0

    For i = 2 To rw '「KEY」の数だけループ

        'シート「KEY」を選択

        Sheets("KEY").Select

        '「KEY」になるセルを選択

        Rows(i & ":2").Select

        '「KEY」になるセルの値を代入

        name = (ws1.Cells(i, 2))

        '選択したセルをコピー

        Selection.Copy

        'シート「DB」を選択

        Sheets("DB").Select

        '検索する対象列を選択

        Columns("H:H").Select

        'KEYに該当するセルを検索

        Set adr = Selection.Find(what:=name, After:=ActiveCell, LookIn:=xlFormulas, _

            LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _

            MatchCase:=False)

        '検索出来た時

    ※該当データが複数あった場合、ここから下の☆までの処理を全てに対して行いたいのですが・・・。

        If Not adr Is Nothing Then

            Range(adr.Address).Select

            '該当するセル

            j = ActiveCell.Column '列

            k = ActiveCell.Row '行

            '該当するセルの値

            name2 = (ws2.Cells(k, 8))

            '該当するセルを含む行を選択する

            Rows(k & ":" & k).Select

            '選択した行をコピー

            Application.CutCopyMode = False

            Selection.Copy

             'シート「抜粋」を選択

            Sheets("抜粋").Select

            'データをコピーしたい行を選択

            m = i - l

            Rows(m & ":" & m).Select

            '選択した行にデータをペースト

            ActiveSheet.Paste

    ☆ここまでの処理を繰り返したい。

        '検索出来なかった時

        Else

            '検索できなかった局数をカウント

            l = l + 1

            '検索できなかった局の局番を表示

            name3 = "Key 「" & name & "」 はありません"

            MsgBox name3

             'シート「KEY」を選択

            Sheets("KEY").Select

            '該当するセルを含む行を選択する

            Rows(i & ":" & i).Select

            '選択した行をコピー

            Application.CutCopyMode = False

            Selection.Copy

            'シート「該当無」を選択

            Sheets("該当無").Select

            Rows(l & ":" & l).Select

            '選択した行にデータをペースト

            ActiveSheet.Paste

        End If

    Next

    '検索できなかった局数を表示

    name4 = "検索できなかった局は「" & l & "」局です"

    MsgBox name4

End Sub


 どうしようか非常に迷ったんですが、なるべくT2さんのプログラムを生かす形で

 修整してみました。

 とくに説明しませんので確認してみてください。

 あと処理上必要ない行はコメントアウトしました。

 (ramrun)

Sub 検索()

    Dim i As Integer

    Dim j As Integer

    Dim k As Integer

    Dim l As Integer

    Dim m As Integer

    Dim n As Integer

    Dim name As String

    Dim name2 As String

    Dim name3 As String

    Dim name4 As String

    Dim name5 As String

    Dim firstaddress As String

    'シート名の置換え

    Set ws1 = Worksheets("KEY")

    Set ws2 = Worksheets("DB")

    Set ws3 = Worksheets("抜粋")

    Set ws4 = Worksheets("該当無")

    '全検索数をカウント

    ws1.Select

    Columns("B").Select

    rw = 0

    For Each rng In Selection

        If rng.Value = "" Then

            ret = rw

            Exit For

        End If

        rw = rw + 1

    Next

    l = 0

    n = 0

    m = 2

    For i = 2 To rw '「KEY」の数だけループ

        'シート「KEY」を選択

        ws1.Select

        '「KEY」になるセルを選択

        'Rows(i & ":2").Select

        '「KEY」になるセルの値を代入

        name = (ws1.Cells(i, 2))

        '選択したセルをコピー

        'Selection.Copy

        'シート「DB」を選択

        ws2.Select

        '検索する対象列を選択

        Columns("H").Select

        'KEYに該当するセルを検索

        Set adr = Selection.Find(what:=name, After:=ActiveCell, LookIn:=xlFormulas, _

            LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _

            MatchCase:=False)

        If Not adr Is Nothing Then firstaddress = adr.Address

        '検索出来た時

        Do While (1)

            If Not adr Is Nothing Then

                'Range(adr.Address).Select

                '該当するセル

                'j = adr.Column '列

                k = adr.Row '行

                '該当するセルの値

                name2 = (ws2.Cells(k, 8))

                '該当するセルを含む行を選択する

                Rows(k).Select

                '選択した行をコピー

                Application.CutCopyMode = False

                Selection.Copy

                'シート「抜粋」を選択

                ws3.Select

                'データをコピーしたい行を選択

                Rows(m).Select

                '選択した行にデータをペースト

                ActiveSheet.Paste

            '検索出来なかった時

            Else

                '検索できなかった局数をカウント

                l = l + 1

                '検索できなかった局の局番を表示

                name3 = "Key 「" & name & "」 はありません"

                MsgBox name3

                'シート「KEY」を選択

                ws1.Select

                '該当するセルを含む行を選択する

                Rows(i).Select

                '選択した行をコピー

                Application.CutCopyMode = False

                Selection.Copy

                'シート「該当無」を選択

                ws4.Select

                Rows(l).Select

                '選択した行にデータをペースト

                ActiveSheet.Paste

                Exit Do

            End If

            ws2.Select

            Set adr = ws2.Columns("H").FindNext(adr)

            m = m + 1

            If firstaddress = adr.Address Then Exit Do

        Loop

    Next

    '検索できなかった局数を表示

    name4 = "検索できなかった局は「" & l & "」局です"

    MsgBox name4

End Sub


『検索該当データが複数ある場合の対処方法の完成版』(T2)

昨日は『検索該当データが複数ある場合の対処方法』へのご返答、ありがとうございました。

早速ご教示頂いた内容を使用して、プラスまた機能を加えた形で作成してみました。

お陰様で、考えていた動作が可能となりました。

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

一応、こんな形になったということで、完成版を記述しておきます。

Sub 検索()

    Dim i As Integer

    Dim j As Integer

    Dim k As Integer

    Dim l As Integer

    Dim m As Integer

    Dim n As Integer

    Dim o As Integer

    Dim p As Integer

    Dim q As Integer

    Dim name As String

    Dim name2 As String

    Dim name3 As String

    Dim name4 As String

    Dim name5 As String

    Dim name6 As String

    Dim name7 As String

    Dim firstaddress As String

    'シート名の置換え

    Set ws1 = Worksheets("KEY")

    Set ws2 = Worksheets("DB")

    Set ws3 = Worksheets("抜粋")

    Set ws4 = Worksheets("該当無")

    Set ws5 = Worksheets("複数データ")

    '全検索数をカウント

    ws1.Select

    Columns("B").Select

    rw = 0

    For Each rng In Selection

    If rng.Value = "" Then

    ret = rw

    Exit For

    End If

    rw = rw + 1

    Next

    l = 0

    n = 0

    m = 2

    o = 0

    q = 0

    For i = 2 To rw '「KEY」の数だけループ

        'シート「KEY」を選択

        'Sheets("KEY").Select

        ws1.Select

        '「KEY」になるセルを選択

        Rows(i & ":2").Select

        '「KEY」になるセルの値を代入

        name = (ws1.Cells(i, 2))

        '選択したセルをコピー

        Selection.Copy

        'シート「DB」を選択

        ws2.Select

        '検索する対象列を選択

        Columns("H").Select

        'KEYに該当するセルを検索

        Set adr = Selection.Find(what:=name, After:=ActiveCell, LookIn:=xlFormulas, _

            LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _

            MatchCase:=False)

        If Not adr Is Nothing Then firstaddress = adr.Address

        '検索出来た時

        Do While (1)

            'シート「DB」を選択

            ws2.Select

            If Not adr Is Nothing Then

                Range(adr.Address).Select

                '該当するセル

                j = adr.Column '列

                k = adr.Row '行

                '該当するセルの値

                name2 = (ws2.Cells(k, 8))

                '該当するセルを含む行を選択する

                Rows(k).Select

                '選択した行をコピー

                Application.CutCopyMode = False

                Selection.Copy

                 'シート「抜粋」を選択

                ws3.Select

                'データをコピーしたい行を選択

                Rows(m).Select

                '選択した行にデータをペースト

                ActiveSheet.Paste

            '検索出来なかった時

            Else

                '検索できなかった局数をカウント

                l = l + 1

                '検索できなかった局の局番を表示

                name3 = "Key 「" & name & "」 はありません"

                MsgBox name3

                 'シート「KEY」を選択

                ws1.Select

                '該当するセルを含む行を選択する

                Rows(i).Select

                '選択した行をコピー

                Application.CutCopyMode = False

                Selection.Copy

                'シート「該当無」を選択

                ws4.Select

                Rows(l).Select

                '選択した行にデータをペースト

                ActiveSheet.Paste

                Exit Do

            End If

            ws2.Select

            Set adr = ws2.Columns("H").FindNext(adr)

            m = m + 1

            '複数該当データがあるかチェック

            '複数無ければ次のKEYへ

            If firstaddress = adr.Address Then

                Exit Do

            '複数あればその局数をカウント

            Else

                p = 0

                If p = 0 Then

                    q = q + 1

                    o = o + 1

                    '複数データがある局の局番を表示

                    name7 = "Key 「" & name & "」 は複数データがあります"

                    MsgBox name7

                    Range(firstaddress).Select

                    '該当するセル

                    j = ActiveCell.Column '列

                    k = ActiveCell.Row '行

                    '該当するセルの値

                    name6 = (ws2.Cells(k, 8))

                    '該当するセルを含む行を選択する

                    Rows(k).Select

                    '選択した行をコピー

                    Application.CutCopyMode = False

                    Selection.Copy

                     'シート「複数データ」を選択

                    ws5.Select

                    'データをコピーしたい行を選択

                    Rows(o).Select

                    '選択した行にデータをペースト

                    ActiveSheet.Paste

                    p = 1

                End If

                o = o + 1

                ws2.Select

                Range(adr.Address).Select

                '該当するセル

                j = adr.Column '列

                k = adr.Row '行

                '該当するセルの値

                name5 = (ws2.Cells(k, 8))

                '該当するセルを含む行を選択する

                Rows(k).Select

                '選択した行をコピー

                Application.CutCopyMode = False

                Selection.Copy

                 'シート「複数データ」を選択

                ws5.Select

                'データをコピーしたい行を選択

                Rows(o).Select

                '選択した行にデータをペースト

                ActiveSheet.Paste

            End If

        Loop

        p = 0

    Next

    '検索できなかった局数を表示

    name4 = "複数データがあった局は「" & q & "」局、検索できなかった局は「" & l & "」局です"

    MsgBox name4

End Sub


 思いどおり動いてよかったですね。

 (ramrun)


 こちら事務局です。ご依頼のページを削除しました。

 (ramrun)さんいつもありがとう。今後ともよろしく!

 (kazu)

コメント返信:

[ 一覧(最新更新順) ]


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