- ベストアンサー
閉じたエクセルファイルに特定シートの有無を調べるには?
閉じたままの状態のエクセルファイルについて、 ある名前のシートがあるかどうかを調べることはできますか? VBA使用の有無は問いませんが、なるべくスマートな方法がベターです。 ご存知の方、是非ともご教授よろしくお願いいたします。
- みんなの回答 (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 .
その他の回答 (1)
- imogasi
- ベストアンサー率27% (4737/17069)
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を記述する、別のエクセルファイルは開いていて良いのでしょうか。 はい。 検査を実行するコードを記述したエクセルファイルは開いた状態、 一方で検査対象となるエクセルファイルは閉じたままの状態で、 ある名前のシートがそのファイルに存在するかどうかを知りたいのです。 実はその検査するファイルがかなりあるので、検査時間を短縮すべく、 なるべくファイルを開かずに検査をしたいという訳です。 よろしくお願いいたします。
お礼
本日、プログラムの動作を確認させていただきました。 正しく、私の希望する内容そのものでした。 その他、フォルダを選択させるダイアログの出し方も判明し、大変勉強になりました。 今回は貴重なお時間を割いて対応して頂き、感謝しております。 またどうぞよろしくお願い申し上げます。
補足
ご回答ありがとうございます。 最初の投稿で「スマート」という単語を使いましたが、深い意味はありません。 色々とお気を遣わせてしまったのであれば申し訳ないと思っております。 さて、ご回答いただきました内容ですが、これから検証をさせて頂きたいと思っております。とても期待の持てるご説明ですね。中には私の知らない表現も見受けられるので、勉強もさせて頂きたいと思います。 当方、多忙が続き、少し検証にお時間頂ければと思います。 貴重なお時間、ありがとうございます。