• ベストアンサー

閉じたエクセルファイルに特定シートの有無を調べるには?

閉じたままの状態のエクセルファイルについて、 ある名前のシートがあるかどうかを調べることはできますか? VBA使用の有無は問いませんが、なるべくスマートな方法がベターです。 ご存知の方、是非ともご教授よろしくお願いいたします。

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

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

こんばんは。 昨日、作ってあったのですが、「スマートさ」という言葉が、引っかかってしまって、アップロードできませんでした。あまり深く考える必要がないのですが、こういう言葉は、どうしても、掲示板内でのトラウマがあります。感性や感覚的なものを持ち出されると、まったくキリがないのです。それと、今回、パスワードロックしたブックを検索するために、バイナリ検索の方法も作ってみたものの、確実性が欠くので、それもブレーキになってしまいました。 以下は、私の考える中では、もっとも速い検索の部類に入るはずです。ブックのオープンをしていません。だいたい、ブック約500個でも、10秒以内で検索できます。ただし、ブックに共通するようなシート名(例:Sheet1)などは可能ですが、あまり賢明な検索ではありません。限界数は設けてありませんが、60個ぐらいまでで止めてください。あまり多いと、Msgbox (メッセージボックス)が、画面の高さを越えて、右上の「×」が利かなくなります。(終了できないわけではありません。) ・シート名のワイルドカードは使えません。 ・CSVファイルなど、シート名のないものには検索できません。 ・このマクロは、パスワード付きにブックは、パスワードを入力しないと検索できません。 ・グラフシートなど、ワークシート以外のものは検索できません。 '------------------------------------------------------------ '<標準モジュール推奨> Option Explicit Sub SheetNameSearchInFiles()   Dim ShellFolder As Object   Dim ShellPath As String   Dim FileName As String   Dim FileNo As Integer   Dim Dummy As String   Dim BookNames As String   Dim OpenFlg As Boolean   Dim SearchSheetName As String   Dim i As Integer     Const XL_EXTENTION = "*.xls"     SearchSheetName = Application.InputBox("探すシート名を入力してください", Type:=2)   If SearchSheetName = "" Or SearchSheetName = "False" Then Exit Sub   Set ShellFolder = CreateObject("Shell.Application"). _   BrowseForFolder(0, "探すフォルダを選択してください", &H1, "c:\")   If Not ShellFolder Is Nothing Then    ShellPath = ShellFolder.Items.Item.Path    Else    Exit Sub   End If   Set ShellFolder = Nothing   FileName = Dir(ShellPath & "\" & XL_EXTENTION)   Do While FileName <> ""    FileNo = FreeFile()    On Error Resume Next    Open ShellPath & "\" & FileName For Binary Lock Read Write As #FileNo    Close #FileNo    If Err.Number = 0 Then      OpenFlg = True    End If    On Error GoTo 0    If OpenFlg Then      Dummy = ""      On Error Resume Next      Dummy = Application.ExecuteExcel4Macro("'" & ShellPath & "\[" & FileName & "]" & SearchSheetName & "'!R1C1")      If Err.Number = 0 Then       BookNames = BookNames & vbCrLf & FileName       i = i + 1      End If      On Error GoTo 0    End If    If i Mod 30 = 0 And i > 0 Then     If MsgBox("ヒット数が" & i & "個を越えましたが、継続しますか?", vbOKCancel) = vbCancel Then      Exit Do     End If    End If    FileName = Dir()   Loop   If Len(BookNames) > 1 Then   MsgBox SearchSheetName & "シートのあるブックは、以下のとおり" & vbCrLf & BookNames   Else   MsgBox SearchSheetName & "シートを含むブックは、見つかりませんでした。", vbInformation   End If End Sub .

secky_martha
質問者

お礼

本日、プログラムの動作を確認させていただきました。 正しく、私の希望する内容そのものでした。 その他、フォルダを選択させるダイアログの出し方も判明し、大変勉強になりました。 今回は貴重なお時間を割いて対応して頂き、感謝しております。 またどうぞよろしくお願い申し上げます。

secky_martha
質問者

補足

ご回答ありがとうございます。 最初の投稿で「スマート」という単語を使いましたが、深い意味はありません。 色々とお気を遣わせてしまったのであれば申し訳ないと思っております。 さて、ご回答いただきました内容ですが、これから検証をさせて頂きたいと思っております。とても期待の持てるご説明ですね。中には私の知らない表現も見受けられるので、勉強もさせて頂きたいと思います。 当方、多忙が続き、少し検証にお時間頂ければと思います。 貴重なお時間、ありがとうございます。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

VBAを記述する、別のエクセルファイルは開いていて良いのでしょうか。VBからですか。 エクセルファイルを(エクセルを通さず)メモリに読み込んだとき、どこかに、シート名が記録されていることは間違いないが、アプリであるエクセルを介さず、シート名を取り出すのは、エクセルInside情報をご存知とか、もしあれば(ないと思いますが)シート名取得のAPIを知っている人しかわからないことではないでしょうか。 VBAを記述する、別のエクセルファイルは開いていて、対象エクセルファイルをVisible=Falseで開いて、For Each で探すのはダメでしょうか。 Sub test02() fnm = "Book5" Dim sh As Worksheet Set exl = CreateObject("Excel.Application") exl.Application.Visible = False exl.Application.Workbooks.Open Filename:=fnm For Each sh In exl.Worksheets MsgBox sh.Name Next exl.Application.Quit End Sub 上例ではBook5の全シート名が順次表示されますので、If文で聞くことはどうでしょうか。

secky_martha
質問者

補足

早速のご回答、ありがとうございます。 > VBAを記述する、別のエクセルファイルは開いていて良いのでしょうか。 はい。 検査を実行するコードを記述したエクセルファイルは開いた状態、 一方で検査対象となるエクセルファイルは閉じたままの状態で、 ある名前のシートがそのファイルに存在するかどうかを知りたいのです。 実はその検査するファイルがかなりあるので、検査時間を短縮すべく、 なるべくファイルを開かずに検査をしたいという訳です。 よろしくお願いいたします。