こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルvba 検索対象をシートではなく、ブック全

このコードでシート内に検索文字があるかどうかを取得できるのですが
検索対象をシートではなく、ブック全体にするには
どうすればいいでしょうか?

Sub Sample()

If Not Cells.Find(What:="test", LookAt:=xlPart) Is Nothing Then
Debug.Print "あります"
Else
Debug.Print "ありません"
End If

End Sub

投稿日時 - 2016-06-20 22:50:08

QNo.9190428

暇なときに回答ください

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

こんにちは。

Excelの[検索]機能[検索場所:ブック]に相当する
VBAの機能は用意されていませんから、
基本的にはシートを総当たりでFindメソッドを実行することになります。

まず基本例として2例挙げますが、
オブジェクトの捉え方、と、判別方法が異なるだけで、
やってる内容は2例同じです。

尚、Findメソッド、Excelの[検索]機能に共通して、
オプション指定を省略した時は、
前回実行された時のオプション指定を踏襲する仕様になっていますので、
Findメソッドの引数(オプション)を省略する時は、この点に十分注意して、
出来れば、省略しない記述を心掛けておいた方が、
読む側には却って理解され易い(誤解され難い)記述になることも、
知っておいて下さい。
例外として、Excelの[検索]機能[検索場所:ブック]に相当する
Findメソッドの引数(オプション)はありませんので、
手動で[検索場所:ブック]を指定後にFindメソッドを実行した場合は、
[検索場所:シート]になります。

Sub ReW9190428a()
Dim i As Long
  For i = 1 To Worksheets.Count
    If Not Worksheets(i).Cells.Find(What:="test", LookAt:=xlPart) Is Nothing Then Exit For
  Next i
  If i <= Worksheets.Count Then
    Debug.Print "あります"
  Else
    Debug.Print "ありません"
  End If
End Sub

Sub ReW9190428c()
Dim sh As Worksheet
Dim c As Range
  For Each sh In Worksheets
    Set c = sh.Cells.Find(What:="test", LookAt:=xlPart)
    If Not c Is Nothing Then Exit For
  Next
  If Not c Is Nothing Then
    Debug.Print "あります"
  Else
    Debug.Print "ありません"
  End If
End Sub

シートをループする代わりに、
全シートの全セルを選択状態にして
Selectionに対してFindメソッドを実行するような方法もあります。
ただそれだけだと実行後に全シート全セル選択状態になるのは
煩わしいですから、実行前の選択状態に戻る仕組みを組み合わせます。

Sub ReW9190428j()
Dim rngPrevSelection As Object
  Set rngPrevSelection = Selection
  Worksheets.Select
  Cells.Select
  If Not Selection.Find("a") Is Nothing Then
    Debug.Print "あります"
  Else
    Debug.Print "ありません"
  End If
  Application.Goto rngPrevSelection
End Sub

他、
Excelの[検索]ダイアログそのものを操作するような方法もあるように思いますが、
実用性は無いだろうという判断で、こちらでは着手しません。

何かしら不明・不足があれば補足欄にでも書いてみて下さい。

投稿日時 - 2016-06-21 00:14:30

お礼

ありがとうございます。

投稿日時 - 2016-06-27 20:29:50

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問