プロが教えるわが家の防犯対策術!

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

A 回答 (2件)

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文で聞くことはどうでしょうか。

この回答への補足

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

補足日時:2005/11/23 22:12
    • good
    • 0

こんばんは。



昨日、作ってあったのですが、「スマートさ」という言葉が、引っかかってしまって、アップロードできませんでした。あまり深く考える必要がないのですが、こういう言葉は、どうしても、掲示板内でのトラウマがあります。感性や感覚的なものを持ち出されると、まったくキリがないのです。それと、今回、パスワードロックしたブックを検索するために、バイナリ検索の方法も作ってみたものの、確実性が欠くので、それもブレーキになってしまいました。

以下は、私の考える中では、もっとも速い検索の部類に入るはずです。ブックのオープンをしていません。だいたい、ブック約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

この回答への補足

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

補足日時:2005/11/25 01:37
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/26 13:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!