• ベストアンサー

ブック全体の検索の次へは?

ブック全体を検索するマクロ作ったのですが、 ブックの最初にあるものしか見つけられません。 見つかった時に、次の検索を行うにはどのようなVBAになるのでしょうか? よろしくお願いもうしあげます。 Sub KensakuAll() 'ブック内の全シートを検索   Dim myWb As Workbook   Dim mySht As Worksheet   Dim myRng As Range   Dim Key1 As String   Key1 = InputBox("検索キーを入力しなさい")   If Key1 = "" Then Exit Sub   For Each mySht In Sheets     Set myRng = mySht.Cells.Find(what:=Key1)     If Not myRng Is Nothing Then       mySht.Activate       myRng.Activate       Set mySht = Nothing       Set myRng = Nothing       Exit Sub     End If   Next   MsgBox "該当するセルは見つかりませんでした"   Set mySht = Nothing   Set myRng = Nothing End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 気に入るかどうかは分かりませんが、 一旦、InputBox で立ち上げて検索して発見した後は、マクロは一旦、とまってしまいます。 ですから、ショートカットを設けました。 SetKey を実行してください。 KensakuAll [Ctrl + Shift + F ] FindActivate [Ctrl + Shift + H ] で、続行してください。 '標準モジュールです。 Dim Ar1() As Variant 'モジュールの一番上に書き出す Dim Ar2() As Variant Dim cnt As Integer Sub KensakuAll() Dim Key1 As String Dim c As Range Dim FirstAdd As String Dim ShName As String Dim i As Long Dim j As Long Erase Ar1() Erase Ar2() cnt = 0 Key1 = InputBox("検索キーを入力しなさい") If Key1 = "" Then Exit Sub For i = 1 To ActiveWorkbook.Worksheets.Count   Set c = Worksheets(i).Cells.Find( _    What:=Key1, _    LookIn:=xlValues, _    LookAt:=xlWhole, _    SearchOrder:=xlByRows)      If Not c Is Nothing Then      FirstAdd = c.Address      ReDim Preserve Ar1(j)      ReDim Preserve Ar2(j)      Ar1(j) = c.Address      Ar2(j) = Worksheets(i).Name      j = j + 1              Do       Set c = Worksheets(i).Cells.FindNext(c)       If c.Address = FirstAdd Then Exit Do       If Not c Is Nothing Then         ReDim Preserve Ar1(j)         ReDim Preserve Ar2(j)         Ar1(j) = c.Address         Ar2(j) = Worksheets(i).Name         j = j + 1       End If      Loop Until c Is Nothing      End If      FirstAdd = ""     Next   Call FindsActivate End Sub Sub FindsActivate() Dim a As String On Error Resume Next a = Ar1(0) If Err.Number > 0 Then  MsgBox "検索値はありません。", vbInformation  Exit Sub End If On Error GoTo 0 Application.Goto Worksheets(Ar2(cnt)).Range(Ar1(cnt)) cnt = cnt + 1 If cnt > UBound(Ar1) Then   cnt = 0 End If End Sub '-------------------------------------- Sub SetKey()  'KensakuAll.. ショートカット [Ctrl + Shift + F ]  Application.OnKey "+^F", "KensakuAll" 'Ctrl + Shift + F  'FindActivate..ショートカット [Ctrl + Shift + H ]  Application.OnKey "+^H", "FindsActivate" 'Ctrl + Shift + H End Sub '--------------------------------------

believe_me
質問者

お礼

回答ありがとうございます。 最初にすべて検索してしまう方法、コロンブスの卵のような方法があったんですね。 それとモジュールの一番上にDIMを書き出すのができるのも知りませんでした。 PrivateかPublicをつけなければいけないと思っていました。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

補足ですが、 Excel2000~2003 なら、二つボタンが必要になりますが、ツールバーにツールボタンやコマンドボタンを置いてもよいです。 ショートカットを付けたのは、やはり、バージョンの問題があったので考えました。もちろん、2007 でも可能ですが、若干、ボタンのデザインや操作性が落ちます。 >最初にすべて検索してしまう方法、 それは、ご質問のコードのスタイルから考えたのです。 それと、Dim をモジュールレベルにした理由は、「標準モジュール」とは書いたものの、開発の最初には、コントロールツールのボタンに置いていたからです。言い換えると、シートモジュールでも可能ですが、シートをまたいでいくので、その後が続きません。正式には、たいした理由ではないのですが、Dimは、Private にするべきかと思います。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

関連するQ&A

  • 異なるBookからの検索

    VBA初心者です。 集計.exl 野菜.exl 果物.exlとファイルがあり、野菜と果物にはシートが3枚づつあります。 集計ファイルのセルを野菜と果物ファイルから検索したいのです。 本等を見て調べたのですが、異なるBookからの検索方法が見つかりません。 Private Sub kensaku() Dim i As Integer Dim myFLd As Range, myRng As Range ' i = Cells("3,2").Select Workbooks.Open ("C:\果物.xls") Worksheets.Select Set myRng = myFLd.Find(what:=i, lookat:=xlWhole) If myRng Is Nothing Then Workbooks.Open ("野菜.xls") Worksheets.Select Set myRng = myFLd.Find(what:=i, lookat:=xlWhole) Exit Sub End If If myRng Is Nothing Then MsgBox "ありません" Exit Sub End If MsgBox "対象" & myRng.Address End Sub としたのですが、 Set myRng = myFLd.Find(what:=i, lookat:=xlWhole) 部分のエラー(whitがありません)とでて、直りません。 あと、このやり方であっているのでしょうか? アドバイスお願いします。

  • VBAを始めたばかりです。

    VBAを始めたばかりです。 下記でエラー「オブジェクトが必要です」が出ます。 何故ですか。 Sub A_Sample048() Dim mySht1 As Object Dim mySht2 As Worksheet '準備ここまで Set mySht1 = ActiveSheet If mySht1.Type = xlWorksheet Then Set mySht2 = mySht1 MsgBox mySht2.Name Else MsgBox "最前面のシートはワークシートではありません" End If Set mySht1 = Nothing 'オブジェクトの解放 Set mySht2 = Nothing End Sub よろしくお願いします。

  • VBAでオートフィルを使って指定する文字列を含むものを表示させたい

    VBAを使って、セルD1に入力した文字列を検索するマクロを作りたいと思っています。 私は初心者で前に似たようなものを作ってもらって それを加工しようとしたのですが、うまくいきませんでした。 以前は完全に一致するもので表示でしたが、 今回は含むものを表示させたいです。 ワイルドカードは*をつけるのはわかるのですが、 いろいろやってみましたがダメでした。(単純なことかもしれないですけど) Private Sub Worksheet_Change(ByVal Target As Range) Dim myRng1 As Range Dim myRng2 As Range Set myRng1 = Target.Cells(1) If Application.Intersect(myRng1, Range("D1")) Is Nothing Then Exit Sub Set myRng2 = Range("D1").CurrentRegion With myRng2 If myRng1 = "" Then ActiveSheet.ShowAllData Else .AutoFilter Field:=4, Criteria1:=myRng1.Value End If End With End Sub

  • マクロFind検索で見つからなかった時の対処

    エクセル2013です 以下のコードを作成しましたが .Rowが色で塗られ 「型が違います」でERRになります。 .Columnの方はERRでなく なぜ.Rowの方がERRなのでしょうか? よろしくお願いします。 Dim 検索行番号 As Range Dim 判定列番号 As Range Dim 検索列番号1 As Range Dim 検索列番号2 As Range Set 検索行番号 = Rows(1).Find("みかん").Column If 検索行番号 Is Nothing Then MsgBox "みかんが有りません。" End If Exit Sub Set 判定列番号 = Rows(1).Find("りんご").Column If 判定列番号 Is Nothing Then MsgBox "りんごが有りません。" End If Exit Sub Set 検索列番号1 = Range("B:B").Find("大箱").Row If 検索列番号1 Is Nothing Then MsgBox "大箱が有りません。" End If Exit Sub Set 検索列番号2 = Range("B:B").Find("小箱").Row If 検索列番号2 Is Nothing Then MsgBox "小箱が有りません。" End If Exit Sub

  • VBA オートフィルタで抽出したものを連続貼り付け

    下記のように情報が100近くまで存在した場合に、オートフィルターで一つずつ抽出したものをコピーし、新規シートに貼り付けたいのですが、どうすれば良いのでしょうか? 1 1 1 2 2 2 3 3 3 たとえばシート1に 1 1 1     シート2に 2 2 2 といったように処理したいので、教えて下さい。 vbaの参考書とサンプルを見て下記のように作成したのですが上手くいきません。 どんな本を読めば作成出来るようになるのかわからず、質問させていただきました。 ub オートフィルター() Dim myRng As Range Dim mySht As Worksheet Set myRng = _ Worksheets(1).Range("A1").CurrentRegion With Worksheets Set mySht = .Add(after:=.Item(.Count)) End With With myRng .AutoFilter field:=1, Criteria1:=8 On Error Resume Next .Resize(.Rows.Count - 1).Offset(1).Copy mySht.Range("A1") .SpecialCells(xlCellTypeVisible).Copy mySht.Range("A1").AutoFilter mySht.Range("A1").AutoFilter If Err.Number <> 0 Then Application.DisplayAlerts = False mySht.Delete Application.DisplayAlerts = True End If On Error GoTo 0 End With Set myRng = Nothing Set mySht = Nothing End Sub

  • 検索マクロ

    下記のマクロは、検索文字でシートを検索し、そのセルアドレス情報を シートを追加して表示する機能ですが、BOOK全体に検索し、シート名を含めて表示するには、xxxxのところをどのように変更すればいいか。よろしくお願いします。 Sub kennsaku_Macro1() Dim ret Dim r As Range Dim adr As String Dim cnt As Long Dim psw As Boolean Dim mySht, adSht, ws As Worksheet Set mySht = ActiveSheet ret = Application.InputBox("検索文字列を入力してください") If TypeName(ret) <> "Boolean" Then With mySht.Cells Set r = .Find(ret, LookIn:=xlValues, lookat:=xlPart) If Not r Is Nothing Then adr = r.Address cnt = 2 '2行目から表示 xxxxxxxxxxxxx For Each ws In Worksheets If ws.Name = "検索結果" & ret Then psw = True Exit For End If Next ws If psw Then Set adSht = ws adSht.Cells.ClearContents Else Set adSht = Worksheets.Add adSht.Name = "検索結果" & ret End If adSht.Cells(cnt, 1).Value = r.Value adSht.Cells(cnt, 2).Value = xxxx 'シート名 adSht.Cells(cnt, 3).Value = adr Do Set r = .FindNext(r) If r.Address = adr Then Exit Do Else cnt = cnt + 1 adSht.Cells(cnt, 1).Value = r.Value adSht.Cells(cnt, 2).Value = xxxx 'シート名 adSht.Cells(cnt, 3).Value = r.Address End If Loop End If End With End If adSht.Cells(1, 1).Value = "項目" adSht.Cells(1, 2).Value = "シート名" adSht.Cells(1, 3).Value = "セルアドレス" mySht.Activate End Sub

  • Findステートメントで別なブックの検索

    Findステートメントで検索した内容のある行のA列にある値をキーワードとして別なブックのA列に検索をかけてヒットしたセルの内容を元のブックの指定したセルに移すという動作をさせたいので次ののように書いてみました。 Private Sub CommandButton2_Click() Dim Yline As Long Dim No As Variant Dim c As Range Dim sh As Worksheet Dim sh_no As Integer Dim findcell As Range Dim add As String Set sh = Worksheets("ブックAの1") No = TextBox1.Text sh_no = 1 'テキストボックスに値が入っていた場合 If No <> "" Then 'Find メソッドの最低のプロパティは入れる。SearchOrder は特にいらない Set c = sh.Range("B:B").Find( _ What:=No, _ LookIn:=xlValues, _ LookAt:=xlPart, _ Searchorder:=xlByRows) '見つかった場合にのみ、値を入れる If Not c Is Nothing Then Yline = c.Row '見つかった行のA列の文字列でブックBに検索をかける add = sh.Cells(Yline, 1).Value Workbooks("B").Activate Set findcell = Workbooks("B").Worksheet(sh_no).Range("A:A").Find( _ What:=add, _ LookIn:=xlValues, _ LookAt:=xlPart, _ Searchorder:=xlByRows) '前Setステートメントからのループ検索開始 If findcell Is Nothing Then Do sh_no = sh_no + 1 If sh_no > ThisWorkbook.Worksheets.Count Then Exit Sub End If Set findcell = Workbooks("B").Worksheets.(sh_no).Range("A:A").Find( _ What:=add, _ LookIn:=xlValues, _ LookAt:=xlPart, _ Searchorder:=xlByRows) Loop While findcell Is Nothing End If End If Workbooks("A").Activate With Worksheets("Aの2")   .Cells(21, 4).Value = sh.Cells(Yline, 14).Value .Cells(20, 4).Value = sh.Cells(Yline, 15).Value .Cells(36, 4).Value = findcell End With Unload Me Else MsgBox No & " は見つかりません。", 48 End If Set sh = Nothing End Sub するとwhat:=addとしてaddが見つかるまでシート番号を増やしていくループのところでエラーがでてキーワードが見つからないと出ます。恐らくブックBを検索してくれているとは思うのです。A列に空白があるためかと思い埋めてみましたが関係ないようです。 構文エラー的なものは無いと思いますが、宜しくお願いします。

  • Textboxに入力してBookを開く

    VBAを勉強して仕事に活かしたいと思っています。 ユーザーフォームを有効に使いたいと・・ TextboxにBook名を入力してBook(同一フォルダー内にある)を開けるようにしたいと思い次のコードを書きましたが全てのBookが開いてしまいました。 Dim MyP As String Dim MyF As String Dim NewBK As Workbook Dim flg As Boolean MyP = ThisWorkbook.Path & Application.PathSeparator MyF = Dir(MyP & "*.xls") Application.ScreenUpdating = False Do While MyF <> "" If MyF <> ThisWorkbook.Name Then On Error Resume Next Set NewBK = Workbooks(MyF) On Error GoTo 0 If NewBK Is Nothing Then flg = True Set NewBK = Workbooks.Open(MyP & MyF) End If 検索_1 NewBK If flg Then NewBK.Close False flg = False End If Set NewBK = Nothing End If MyF = Dir() Loop Application.ScreenUpdating = True ThisWorkbook.Activate End Sub '*** Form呼び出し時の処理 *** Private Sub 検索_1() Dim findText As String '探す文字列(Text1に入力) Dim rg As Object '探し出したブック findText = Text1.Text Set rg = Workbooks.Find(What:=findText, LookAt:=xlWhole) If Not rg Is Nothing Then Workbooks.Open End If End Sub このコードは本やネットの過去ログをみて参考にして書いたものです。 どなたかわかる方 アドバイスお願いします。

  • Excel VBAで検索(Win2000 Excel2000)

    現在、下記のようなコードを書いています。データテーブルの縦と横の検索値を探してその列数と行数を返したいのですが、下記の Sub検索1 と Sub検索2 を1つのSubで実行させるにはどうしたらよいのでしょうか?よろしくお願い致します。 ----------------------------------------- Sub 検索1() Worksheets("Data").Activate Dim x As Integer For x = 3 To 22 If Cells(2, x).Value >= 12 Then MsgBox x Exit Sub End If Next MsgBox "見つかりません" End Sub --------------------------------------------- Sub 検索2() Worksheets("Data").Activate Dim i As Integer For i = 4 To 42 If Cells(i, 2).Value = "A" Then MsgBox i Exit Sub End If Next MsgBox "見つかりません" End Sub

  • VBAのファインドメソッドで検索すると対象外のデータが選択されることがある

    CDのリスト表(12列で、現在2269行 範囲名"収録表")Sheets("データ")から,キーワードで該当ディスクを検索し、 結果をSheets("検索")に転記する、プログラムを作りましたが、 仮に、該当データが10件、転記されたとして そのデータを見ると、中に1件、対象外のデータがはいっている事が たまにあります、いろんな原因を考えてみましたがわかりません。 もともと、VBAのファインドメソッドが、こんなエラーを起こしやすいのか、、、(そんな事、ないよね) どなたか、教えてください。 下が、プログラムです Sub 新規検索() Application.ScreenUpdating = False Dim myData, myRng As Range Dim myWord As String myWord = InputBox("キーワードを入力してください") データ処理中F.Show vbModeless データ処理中F.Repaint Set myData = Range("収録表") Set myRng = myData.Find(What:=myWord, LookIn:=xlValues, _ Lookat:=xlPart, MatchCase:=False, MatchByte:=False) If myWord = "" Then MsgBox ("キーワードを入力してください") Exit Sub End If If Not myRng Is Nothing Then Application.Goto Cells(myRng.Row, 1), True Else: Unload データ処理中F MsgBox ("該当データはありません") Exit Sub End If Sheets("検索").Range("K1") = myRng.Row '一番最初の検索値のRow Call コピー1 Do Until Range("K1") = Range("L1")   Call 次を検索 Loop Call 検索終了 Unload データ処理中F Application.ScreenUpdating = True End Sub Sub 次を検索() Dim myData, myRng As Range Sheets("データ").Select Set myData = Range("収録表") Set myRng = Cells.FindNext(after:=ActiveCell.Offset(1)) If myRng <> "" Then Application.Goto Cells(myRng.Row, 1), True End If Sheets("検索").Range("L1") = myRng.Row '2番目以降の検索値のRow   Call コピー2 End Sub Sub コピー1() Sheets("検索").Range("A3:L5000,L1").ClearContents Dim myData As Range Set myData = Range("収録表") Set motorng = Application.Intersect(myData, ActiveCell.EntireRow) Set sakiRng = Sheets("検索").Range("A65535").End(xlUp).Offset(1) motorng.Copy sakiRng Sheets("検索").Visible = True Sheets("検索").Activate End Sub Sub コピー2() Dim myData As Range Set myData = Range("収録表") Set motorng = Application.Intersect(myData,   ActiveCell.EntireRow) Set sakiRng = Sheets("検索").Range("A65535").End(xlUp).Offset(1) motorng.Copy sakiRng Sheets("検索").Visible = True Sheets("検索").Activate End Sub Sub 検索終了() Dim r As Long r = Range("A65536").End(xlUp).Row Range("A" & r).Select ActiveCell.FormulaR1C1 = "=COUNTA(R3C:R[-1]C)" MsgBox "全部で" & Range("A" & r).Value & "件ありました" Range("A65535").End(xlUp).EntireRow.ClearContents Call 行頭表示 End Sub

専門家に質問してみよう