[[20100729173059]] 『複数シート間の検索』(samikou2003) ページの最後に飛ぶ

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

 

『複数シート間の検索』(samikou2003)

 VBAの知識はあまりなく、ネットで検索しながら次のマクロを記述しました。
 ただし、内容はほとんど理解できていません。

 Sub 検索()
 '
 ' 検索 Macro
 ' マクロ記録日 : 2010/7/29  ユーザー名 :
 '

 '
 Dim C As Range
 Dim MOJI As String
 Dim RESPONSE As VbMsgBoxResult
 With Worksheets("第2")
    MOJI = InputBox("検索文字入力")
    If MOJI <> "" Then
        Set C = .Cells.Find(MOJI, , LookIn:=xlValues, lookat:=xlPart, MatchCase:=False)
        If Not C Is Nothing Then
            C.Font.ColorIndex = 3
            Application.Goto C, scroll:=False
            RESPONSE = MsgBox("次を検索しますか?", vbYesNo + vbQuestion, "検索続行")
            Do While RESPONSE = vbYes
                C.Font.ColorIndex = xlAutomatic
                Set C = .Cells.FindNext(C)
               C.Font.ColorIndex = 3
                Application.Goto C, scroll:=False
                RESPONSE = MsgBox("次を検索しますか?", vbYesNo + vbQuestion, "検索続行")
            Loop
            MsgBox ("検索を終了しました")
            C.Font.ColorIndex = xlAutomatic
        Else
            MsgBox MOJI & "は、ありません。。"
        End If
    End If
End With
End Sub

 マクロ自体はきちんと動作し、とりあえず Worksheets("第2") 内の検索は
 うまくで きるのですが、これを複数のシートにまたがって検索できるように改造
 したいのです。
 シートは"第1"〜"第10"まであり、今後も増える可能性があります。
 検索範囲は、"第2"から最後(現在は第10)のシートまでとしたいのです。
 バージョンは、Excel2003,WindowsXP です。
 大変申し訳ありませんが、ご教示いただけたら助かります。
 よろしくお願いいたします。

 >"第1"〜"第10"まであり
 シートが左から順番にセットしてあるとして、、

 Dim C As Range
 Dim MOJI As String
 Dim RESPONSE As VbMsgBoxResult
 Dim i As Byte

 MOJI = InputBox("検索文字入力")
 For i = 2 To Sheets.Count
     Worksheets(i).Activate
     With Worksheets(i)
        If MOJI <> "" Then
            Set C = .Cells.Find(MOJI, , LookIn:=xlValues, lookat:=xlPart, MatchCase:=False)
            If Not C Is Nothing Then
                C.Font.ColorIndex = 3
                Application.Goto C, scroll:=False
                RESPONSE = MsgBox("次を検索しますか?", vbYesNo + vbQuestion, "検索続行")
                Do While RESPONSE = vbYes
                    C.Font.ColorIndex = xlAutomatic
                    Set C = .Cells.FindNext(C)
                    C.Font.ColorIndex = 3
                    Application.Goto C, scroll:=False
                    RESPONSE = MsgBox("次を検索しますか?", vbYesNo + vbQuestion, "検索続行")
                Loop
                MsgBox ("検索を終了しました")
                C.Font.ColorIndex = xlAutomatic
            Else
                MsgBox MOJI & "は、ありません。。"
            End If
        End If
    End With
 Next i
 End Sub
 こんなことで良いですか??
 (kei)

 kei様、ご親切にりがとうございました。
 早速、教えていただいた方法を試したところ、各シートで検索を終了("検索を終了
 しました")のメッセージボックスを閉じないと、次のシートに切り替わらないよう
 です。
 シートの最後にヒットした値から、次を検索すると次のシートに移るようには
 できないでしょうか?
 重ねてのお願いで申し訳ありませんが、どうぞよろしくお願いいたします。

(samikou2003)


 この種は、あまりやったことがないので、自信なし。^^;

 Dim C As Range
 Dim MOJI As String
 Dim RESPONSE As VbMsgBoxResult
 Dim i As Byte
 Dim j As Integer

 MOJI = InputBox("検索文字入力")
 If MOJI <> "" Then
     For i = 2 To Sheets.Count
         Worksheets(i).Activate
         With Worksheets(i)
         Set C = .Cells.Find(MOJI, , LookIn:=xlValues, lookat:=xlPart, MatchCase:=False)
            If Not C Is Nothing Then
                C.Font.ColorIndex = 3
                Application.Goto C, scroll:=False
                RESPONSE = MsgBox("次を検索しますか?", vbYesNo + vbQuestion, "検索続行")
                Do Until WorksheetFunction.CountIf(Cells, MOJI) - 1 = j
                    j = j + 1
                    C.Font.ColorIndex = xlAutomatic
                    Set C = .Cells.FindNext(C)
                    C.Font.ColorIndex = 3
                    Application.Goto C, scroll:=False
                    RESPONSE = MsgBox("次を検索しますか?", vbYesNo + vbQuestion, "検索続行")
                    If RESPONSE = vbNo Then Exit Do 'vbNo1で検索を終了させるときは、Then End
                Loop
                C.Font.ColorIndex = xlAutomatic
            Else
                MsgBox MOJI & "は、ありません。。"
            End If
         End With
         j = 0
     Next i
    MsgBox ("検索を終了しました")
  End If
 End Sub
 動きの変なとこがあるかも!!
 (kei)

 kei様、ご検討ありがとうございます。
 急な会議が入り返事がが遅くなり、申し訳ありませんでした。
 ご教示のマクロを試してみましたが、やはり、各シートの検索を終了させないと
 次のシートには移らないようです。
 どうしたら良いのでしょうか?
 質問ばかりで申し訳ありません。


 こちらでは、次のシートに移ります。。
 明日は仕事で、明後日の朝に出てきます。もう寝ます。。
 それまでに、どなたかの素敵なレスが付くかも ^^
 (kei)


kei様、おやすみなさい。
お忙しいところすみませんでした。
また、よろしくお願いします。


 samikou2003さん、おはよーございます。
 Do Until〜Loopを整理してみました。
 今度はきっとうまく動くと思います。。

 Sub test()
    Dim C As Range
    Dim MOJI As String
    Dim RESPONSE As VbMsgBoxResult
    Dim i As Byte
    Dim j As Integer
    Dim myCn As Integer

    MOJI = InputBox("検索文字入力")
    If MOJI <> "" Then
        For i = 2 To Sheets.Count
           Worksheets(i).Activate
           With Worksheets(i)
               Set C = .Cells.Find(MOJI, , LookIn:=xlValues, lookat:=xlPart, MatchCase:=False)
               If Not C Is Nothing Then
                   myCn = WorksheetFunction.CountIf(.Cells, MOJI & "*")
                   Do Until WorksheetFunction.CountIf(Cells, MOJI & "*") = j
                       j = j + 1
                       C.Font.ColorIndex = 3
                       Application.Goto C, scroll:=False
                       If myCn - j > 0 Then
                           RESPONSE = MsgBox("次を検索しますか?" & vbCrLf & _
                                       "あと" & myCn - j & "件あります。", vbYesNo + vbQuestion, "検索続行")
                       Else
                           RESPONSE = MsgBox("次のシートを検索しますか?", vbYesNo + vbQuestion, "検索続行")
                       End If
                       C.Font.ColorIndex = xlAutomatic
                       Set C = .Cells.FindNext(C)
                       If RESPONSE = vbNo Then Exit Do
                   Loop
                     C.Font.ColorIndex = xlAutomatic
               Else
                   MsgBox MOJI & "は、ありません。。"
               End If
           End With
           j = 0
        Next i
        MsgBox ("検索を終了しました")
    End If
 End Sub
 (kei)

 こんにちは。
先に全ての該当セルを配列に入れて、そこから順次表示してみました。

 ○【Module1】標準モジュール
Sub kota1()
Dim C As Range, r() As Range
Dim MOJI As String, s0 As String
Dim RESPONSE As VbMsgBoxResult
Dim i As Long, j As Long, n As Long

    MOJI = InputBox("検索文字入力")
    If MOJI = "" Then Exit Sub
    j = 0
    '該当セルをr()に格納
    For i = 2 To Worksheets.Count
        With Worksheets(i)
            Set C = .Cells.Find(MOJI, , LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False)
            If Not C Is Nothing Then
                s0 = C.Address
                Do
                    j = j + 1
                    ReDim Preserve r(1 To j)
                    Set r(j) = C
                    Set C = .Cells.FindNext(C)
                Loop Until C.Address = s0
            End If
        End With
    Next
    'r()内のセルを表示
    If Not C Is Nothing Then
        j = 0
        Do
            j = j Mod UBound(r) + 1
            Application.Goto r(j), scroll:=False
            r(j).Font.ColorIndex = 3
            RESPONSE = MsgBox("次を検索しますか?", vbYesNo + vbQuestion, "検索続行")
            r(j).Font.ColorIndex = xlAutomatic
        Loop Until RESPONSE = vbNo
        MsgBox ("検索を終了しました")
    Else
        MsgBox MOJI & "は、ありません。。"
    End If
End Sub

 (コタ)

 kei様、コタ様
 ご検討いただき、感謝しております。
 すぐに試して報告しないといけないのですが、月曜日まで職場のパソコンを使用できません。
 大変失礼ですが、結果は火曜日に報告させていただきます。
 また、よろしくお願いいたします。

 (samikou2003)


 kei様、コタ様、お世話になりました。
 確認がが終わりましたので、ご報告いたします。
 お二人から御教示いただいたいずれの方法でも全シート検索が可能となり、当方の希望どうおりの
 マクロが組めそうです。
 マクロの内容はよく理解できていませんが、お二人から御教示いただいたものを十分に勉強してみた
 いと思います。
 ご親切にありがとうございました。
 ところで、コタ様にもう1点だけ質問させてください。
 御教示いただいたマクロですと、最終シートに検索条件に該当する値が入力されていないと「該当な  
 し」 となってしまいます。
 つまり、シート第1に「りんご」との値があっても、シート第10(最終シート)に「りんご」の値が
 なければヒットしないのです。
 この点,何か参考となることあれば御教示いただけたら助かります。

 (samikou2003)


 >シート第10(最終シート)に「りんご」の値が なければヒットしないのです。
 あらら、これは失礼しました。

    'r()内のセルを表示
    If Not C Is Nothing Then

 この行で、検索結果があるかどうかを判断するつもりだったのですが、Cは最終シートの結果が
残るので、このような動作をなってしまいました。
以下のように修正してください。(1つでも検索値があれば、jは正値になるので)

    'r()内のセルを表示
    If j > 0 Then

 (コタ)

 コタ様、ご教示の点修正しましたところ、見事検索が出来るようになりました。
 ご親切にありがとうございました。

 (samikou2003)

コメント返信:

[ 一覧(最新更新順) ]


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