• ベストアンサー

【ExcelVBA】指定したファイル名をAドライブで検索

エクセルVBAで、指定したファイル名のファイルをAドライブ直下で検索した場合、ワイルドカードを使ってないにも関わらず、ワイルドカード検索みたいな感じで結果がとれてしまいます。 ■Aドライブ直下 aaaPROFILE.xls testPROFILE.xls ■コード With Application.FileSearch .NewSearch .LookIn = "A:\" .SearchSubFolders = True .Filename = "PROFILE.xls" If .Execute() > 0 Then MsgBox Application.FileSearch.FoundFiles(1) & "あった" Else MsgBox "Aドライブに[PROFILE.xls]を保存してね" End If End With これを実行すると、「Aドライブに[PROFILE.xls]を保存してね」というメッセージが出てほしいのですが、「aaaPROFILE.xlsあった」とでてきてしまい、aaaPROFILE.xlsが検索結果にひっかかってしまいます。 これは何故でしょうか?どうしたら指定した文字列をビタで検索できるでしょうか? ご回答よろしくお願いいたします。

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

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.5

Application.FileSearch はインデックスサービスが有効の場合 正しい結果が得られない事が有ります。 あるのに見つけてこなかったり・・・無いのにカウントされたり・・・ リンクは参考URLの文字制限に引っかかって張れなかったので Application FileSearch インデックスサービス でGoogleって見て下さい http://www.google.com/search?hl=ja&lr=lang_ja&ie=SJIS&oe=SJIS&num=100&q=Application+FileSearch+%83C%83%93%83f%83b%83N%83X%83T%81%5B%83r%83X (↑は見えるかな)なので WindowAPIやFileSystemObjectなどを使ったほうが無難です。 下記のようなのを標準モジュールに置いといて Dim i As Long i = MyFileSearch("c:\","*.xls") If i > 0 Then MsgBox i & "あった" としてみては? Option Explicit Option Compare Text '大文字小文字を区別しない '使い方 MyFileSearch("c:\","*.xls") Function MyFileSearch( _       strTrgDir As String, strTrgFile As String, _       Optional FilesCount As Long = 0) As Long   On Error GoTo errHnd   Dim objFs As Object   Dim objDir As Object   Dim objTmpFile As Object   Dim i As Long      Set objFs = CreateObject("Scripting.FileSystemObject")   Set objDir = objFs.Getfolder(strTrgDir)   Set objTmpFile = objDir.Files      For Each objTmpFile In objDir.Files     If objTmpFile.Name Like strTrgFile Then       FilesCount = FilesCount + 1       Debug.Print "FileName = ", objTmpFile.Name, objTmpFile.Path     End If   Next      For Each objDir In objDir.SubFolders     'Debug.Print "folder = ", objDir.Name, objDir.Attributes     If objDir.Attributes <> 22 Then       Call MyFileSearch(objDir.Path, strTrgFile, FilesCount)     End If   Next   MyFileSearch = FilesCount   Set objFs = Nothing   Exit Function errHnd:   MyFileSearch = -1   Set objFs = Nothing End Function

mocmocc
質問者

お礼

あーなるほど!ご提示いただいた内容でしたら使いまわしもできますしね…!本当参考になります。 FileSearchはあまり好ましくないようですね…改修を検討します。 ご丁寧にどうもありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

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

こんばんは。#3です。 別に、FileSearch にこだわらなければ、Dir() でよいのです。 FileSearch は、昔から、バグっぽかったし、未だに調子が良くないです。 もともと、FileSearch  のファイル名のプロパティは、*FILENAME* というワイルドカードがくっついていることと同じだから、片方に、明示的に入れて上げれば、片方は取れます。しかし、そうでないのでしたら、以下のようなものにすればよいです。おそらく、こちらのほうが数段速いはずです。 '-------------------------------------------------- Sub FileSeachPrc()  Dim Fso As Object  Dim objFolder As Object  Dim buf() As Variant  Dim f As Variant  Dim i As Long  Dim j As Integer  Dim flg As Boolean    Const MYFILE As String = "PROFILE.xls"  Const MYDRIVE As String = "A:\" '必ず、末尾に'\'を入れてください。    'ドライブのReady チェック  Set Fso = CreateObject("Scripting.FilesystemObject")  '以下は変数が利かないので、リテラル値 "A"  If Fso.Drives("A").IsReady = False Then   MsgBox "ドライブ" & MYDRIVE & "は、準備されていません。", vbInformation   Set Fso = Nothing   Exit Sub  End If    Set objFolder = Fso.GetFolder(MYDRIVE)  ReDim buf(0)  buf(0) = MYDRIVE  'サブフォルダを格納  For Each f In objFolder.SubFolders   i = i + 1   ReDim Preserve buf(i)   buf(i) = f  Next f    For Each f In buf   If Dir(f & "\" & MYFILE) <> "" Then    MsgBox "Aドライブの[" & f & "\" & MYFILE & "]をあった", vbInformation    flg = True     'あまりに、同名ファイルが多すぎるときの保護    If j > 5 Then Exit For    j = j + 1   End If  Next f    If flg = False Then   MsgBox "Aドライブに[" & MYFILE & "]を保存してね", vbInformation  End If    Set Fso = Nothing  Set objFolder = Nothing End Sub

mocmocc
質問者

お礼

fileSearchに特にこだわりはありませんです。 (使ったことがなかったので色々調べてみたら書いてあったので使ったという安易な理由です…) DIRでもこのように使えば全然OKなんですね、確かに早いです! ご丁寧にありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.4

少し書き込んでみました。 ●問題点1 FileSearchでは、*PROFILE.xls も見つかってしまう。(仕様だと思うが。。。) ●問題点2 FileSearchでは、複数のファイルが見つかることを想定している。(質問は都合で、最初のファイルのみを表示されているのかもしれません) ●問題点3 サブフォルダも検索する指定なので、見つかったファイル名を直接照合するとおかしな結果になる。 下では、 ●問題点1:複数のファイルの完全一致を調べている。 ●問題点2:完全一致を調べるためにフォルダ名を除いている。 ●問題点3:サブフォルダも調べるはずですが、ここにあったとして、どのような処理にするかは分からないので、何もしていません。 Sub Test_1()   Dim i As Integer '// カウンタ   Dim checkFileExist As Boolean '// ファイルがあったか      With Application.FileSearch     .NewSearch     .LookIn = "A:\"     .SearchSubFolders = True     .Filename = "PROFILE.xls"          '// 見つけたファイルをすべて照合     checkFileExist = False     If .Execute() > 0 Then       For i = 1 To .FoundFiles.Count         '// ドライブ、フォルダ名を削除して照合         '// *PROFILE.xls も見つかるので再チェック         checkFileExist = FileExist(.Filename, .FoundFiles(i))         If checkFileExist Then           MsgBox Application.FileSearch.FoundFiles(i) & "あった"           Exit For         End If       Next     End If          If Not checkFileExist Then       MsgBox "Aドライブに[PROFILE.xls]を保存してね"     End If   End With End Sub Function FileExist(ByVal schFN As String, ByVal FN As String)   Dim p As Integer, pot As Integer      '// 一番右の『\』を探す   pot = 0   For p = Len(FN) To 1 Step -1     If Mid(FN, p, 1) = "\" Then       pot = p: Exit For     End If   Next      '// ファイル名だけで比較   FileExist = False   If schFN = Right(FN, Len(FN) - pot) Then     FileExist = True   End If End Function

mocmocc
質問者

お礼

ご提示いただいた例でも実現することができました。ご丁寧にご回答ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 今試してみました。あまり軽率に言うのはいけないのですが、FileSearch は、どうやら、バグに近いですね。他のメソッドで言う、"LookAt" プロパティがないからですね。 やむをえないのですが、FileSearch のまま使うのでしたら、以下のように、ファイル名の後ろをワイルドカードにして、FileType をOffice 用にしてみてください。  .Filename = "PROFILE.xls*"  .FileType = msoFileTypeOfficeFiles なお、.MatchTextExactly = True では、バージョンによって違うのかもしれませんが、うまくいかないように思います。

mocmocc
質問者

お礼

ご回答ありがとうございました! 事情により検索するファイルがCSVになるかもしれないのですが、拡張子の後にワイルドカードをつけたら、.csvでも.xlsでもできました! でもなぜ「*」をつけるだけでいとも簡単に成功したのでしょうか??

全文を見る
すると、全ての回答が全文表示されます。
  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.2

ヘルプで MatchTextExactly プロパティ を調べてみるといいと思います。

mocmocc
質問者

お礼

ご回答ありがとうございました。 このようなプロパティがあるとは知りませんでした。

全文を見る
すると、全ての回答が全文表示されます。
  • mojonbo
  • ベストアンサー率57% (4/7)
回答No.1

>.Filename = "PROFILE.xls" この箇所を .Filename = "\PROFILE.xls" ではどうでしょうか? 動作未確認ですが・・・

mocmocc
質問者

お礼

素早いご回答ありがとうございます! 早速試してみました。 aaaPROFILE.xlsはひっかからなくなりましたが、肝心のPROFILE.xlsもひっかかりませんでした…。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 【ファイルサーチ】指定のフォルダーではなく自分で選択したフォルダー内のファイルの総数をカウントしたい

    お世話になります。指定のフォルダーではなく自分で選択したフォルダー内の"csvファイル"の総数をカウントしたいのですがうまくいきません。アドバイスお願いいたします。 With Application.FileSearch .LookIn = Application.GetOpenFilename .Filename = "*.csv" If .Execute > 0 Then MsgBox .FoundFiles.Count & "個" End If For i = 1 To .FoundFiles.Count MsgBox .FoundFiles(i) Next i End With

  • 改善コードを教えてください。

    EXCEL2003で作成したマクロが2010で下記のコードが動作しません。 どう修正したらいいか教えてください 。 できれば、具体的なコードを書いていただけると、助かります。 ' With Application.FileSearch ' .NewSearch ' .LookIn = TXP_hozon_saki ' .Filename = ".TXP" ' .SearchSubFolders = True ' ' If .Execute() = 0 Then ' MsgBox "TXPファイルなし", vbOKOnly, "参照ファイルエラー" ' Exit Sub ' End If ' For KensakuSuu = 1 To .FoundFiles.Count ' TXP_hozon_name(1, KensakuSuu) = .FoundFiles(KensakuSuu) ' Next KensakuSuu ' End With 上記コードは、拡張子.TXPというファイルを検索して、動作させるものです。

  • VBAのFileSearchでFoundFiles(i)の作成日時を取得したい

    タイトルどおりですが、Fileオブジェクトには DateCreatedプロパティーがあるようですが、 どこでこれを使用していいのかわかりません。 したのはHELPのサンプルですが、どうしたらいい ものでしょうか? With Application.FileSearch If .Execute() > 0 Then MsgBox .FoundFiles.Count & _" 個のファイルが見つかりました。" For i = 1 To .FoundFiles.Count Debug.Print .FoundFiles(i) Next i Else MsgBox "検索条件を満たすファイルはありません。" End If End With

  • EXCEL2000 フォルダ内のファイルを検索

    EXCEL2000 フォルダ内のファイルを検索 お分かりになる方がいましたらお力添えの程よろしくお願いします。 任意のフォルダ内で任意のファイルサーチが出来るマクロを実行したいのですが、ファイルサーチの値を全角、半角、大文字、小文字区別なく行いたいのです。 例えば,セル2,2に、topと入力したら、topもtopもTOPもTOPも検索対象に引っかかり、セルに書き出して欲しいのです。 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ Sub ファイル一覧2() Dim vntF As Variant Dim objFS As FileSearch Dim objFSO As FileSystemObject Dim GYO As Long Dim cntFound As Long Set objFS = Application.FileSearch ' FileSearch Set objFSO = New FileSystemObject ' FSO Rows("5:65536").ClearContents Application.ScreenUpdating = False GYO = 4 With objFS .NewSearch .LookIn = Trim(Cells(1, 2).Value) ' Search開始フォルダ .Filename = Trim(Cells(2, 2).Value) ' 探索ファイル式 .SearchSubFolders = True ' サブフォルダも探索 ' 処理開始 If .Execute() <> 0 Then For Each vntF In .FoundFiles With objFSO.GetFile(vntF) GYO = GYO + 1 Cells(GYO, 1).Value = .Name Cells(GYO, 2).Value = .DateLastModified Cells(GYO, 3).Value = _ Left(.Path, Len(.Path) - Len(.Name) - 1) cntFound = cntFound + 1 End With Next vntF End If End With Set objFS = Nothing Set objFSO = Nothing ' 処理結果の表示 If cntFound = 0 Then MsgBox "見つかりません" Else MsgBox cntFound & "個見つかりました" End If End Sub

  • Excel2007で、ディレクトリ付きファイル一覧をシート出力するマクロ

    Excel2003で、以下のソースを使い、シート上にディレクトリ付きファイル一覧を作成していたのですが、Excel2007では使えなくなりました。代替方法はありませんか? Sheets("Sheet10").Range("A1:Z6000").Clear With Application.FileSearch .newSearch .LookIn = "C:\works" .filename = "*.html" .SearchSubFolders = True Sheets("Sheet10").Select CSVMAX = .FoundFiles.Count For result = 1 To CSVMAX Sheets("Sheet10").Cells(result, 1) = .FoundFiles(result) Next End With

  • 複数検索方法

    マクロ(Excel)にて検索できるものを作成しています。 例えばネットワークドライブにて割り当てたH22(Zドライブ)~H1(Gドライブ)というフォルダがあり、UserForm1にてH22~H1のチェックボックスを作成しています。ここでH22とH21のチェックボックスにチェックを入れキーワードを入力し検索すると、H22とH21のフォルダ内になるキーワードと同じファイル名をフォルダ名と同じのシートに検索結果を表示したいです。 しかし、下記のようにすると、1つずつの検索は可能なのですが、複数チェック(H22とH21)入れると H22を検索し終わった後、もう一度キーワードを入力しないとH21を検索してくれません。 複数チェックし1回のキーワード入力で検索するにはどうすれば良いですか? 説明が下手ですが、よろしくお願いします。 Private Sub CommandButton1_Click() If CheckBox1 = True Then Sheets("H22").Visible = True Sheets("H22").Select With Application.FileSearch .NewSearch .LookIn = "Z:\" buf = InputBox("検索したいファイル名を入力してください" & vbCrLf & "ただし、複数キーワード検索はできません" & vbCrLf & "キーワード入力後、「OK」ボタンを選択", "キーワード入力") If buf = "" Or buf = "False" Then Exit Sub .Filename = buf .SearchSubFolders = True If .Execute() > -5 Then MsgBox .FoundFiles.Count - 5 & " 個のファイルが見つかりました", vbOKOnly, "検索結果" For 検索結果 = 6 To .FoundFiles.Count Cells(検索結果, 3) = .FoundFiles(検索結果) Next 検索結果 Else MsgBox "見つかりませんでした" End If End With Set FSO = Nothing For i = 6 To 検索結果 Step 1 Cells(i, 3).Select With ActiveSheet .Hyperlinks.Add Anchor:=Selection, Address:=Cells(i, 3).Value End With Next i ElseIf CheckBox2 = True Then Sheets("H21").Visible = True Sheets("H21").Select With Application.FileSearch .NewSearch .LookIn = "Y:\" buf = InputBox("検索したいファイル名を入力してください" & vbCrLf & "ただし、複数キーワード検索はできません" & vbCrLf & "キーワード入力後、「OK」ボタンを選択", "キーワード入力") If buf = "" Or buf = "False" Then Exit Sub .Filename = buf .SearchSubFolders = True If .Execute() > -5 Then MsgBox .FoundFiles.Count - 5 & " 個のファイルが見つかりました", vbOKOnly, "検索結果" For 検索結果 = 6 To .FoundFiles.Count Cells(検索結果, 3) = .FoundFiles(検索結果) Next 検索結果 Else MsgBox "見つかりませんでした" End If End With Set FSO = Nothing For i = 6 To 検索結果 Step 1 Cells(i, 3).Select With ActiveSheet .Hyperlinks.Add Anchor:=Selection, Address:=Cells(i, 3).Value End With Next i  ・  ・  ・ End If End Sub

  • FileSearchがエクセル2007で使えなくなって困っています。

    2003では普通に使えたのですが、2007で使うためにはどのように変えればいいのでしょうか?途方にくれているのでVBAに詳しい方ご教授ください。処理文で回答頂けるとうれしいです。 Public Sub p_更新() For i = 1 To 100: gwKillFL(i) = "": Next i With Application.FileSearch .LookIn = gAAFLD .SearchSubFolders = True .Filename = "*T" & Format(gBB, "00") & ".txt" .FileType = msoFileTypeAllFiles If .Execute(SortBy:=msoSortByFileName, _ SortOrder:=msoSortOrderAscending) > 0 Then For i = 1 To .FoundFiles.Count gwKillFL(i) = .FoundFiles(i) Call p_ReadData(.FoundFiles(i)) Next i For i = 1 To .FoundFiles.Count If gwKillFL(i) <> "" Then Kill gwKillFL(i) End If Next i If gMenu1 > 0 Then Range("A2").Select MsgBox "更新", vbOKOnly, "確認" End If Else If gMenu1 > 0 Then MsgBox "更新ファイルなし。", vbOKOnly, "確認" End If End If End With End Sub

  • エクセルVBA:取得したファイル情報を別シートに貼るには・・・

    いつもお世話になっています。 今エクセルVBAで指定したフォルダ内のファイル情報を取得し、sheet2に貼り付けるものを作っています。 指定したフォルダ内のファイル情報を取得するまでは分かったのですが、作ったVBAを実行するとsheet1のA2セルから自動的に貼り付けられてしまいます。 sheet2のA1セルから貼り付けるにはどうすれば良いのでしょうか?? 作ったVBAはこんな感じです。 まず、フォルダのパスを取得しA2セルへ表示します。 Sub test2()  With Application.FileDialog(msoFileDialogFolderPicker) If .Show = 0 Then Exit Sub Range("A2").Value = .SelectedItems(1) End With End Sub 次に、A2セルの値を使ってファイル名を取得しました。 Sub Test() Dim i As Long Dim pass As String pass = Range("A2").Value With Application.FileSearch .NewSearch .LookIn = pass .FileType = msoFileTypeAllFiles .SearchSubFolders = True If .Execute() > 0 Then For i = 1 To .FoundFiles.Count Cells(i + 1, 1) = .FoundFiles(i) Cells(i + 1, 3) = FileDateTime(.FoundFiles(i)) Next i End If End With End Sub です。 長くて申し訳ありません。よろしくお願いします。

  • Visual Basic Editorの実行時エラーのことについて教えてください。 

    Visual Basic超初心者ですがよろしくお願いします。 標準モジュールで入力したものを実行すると、必ず「実行時エラー "53": ファイルが見つかりません。」と表示してしまいます。 入力したものはミスはないと思うのですが、何回やってもエラーが出てしまいます。 わかる方いましたら教えてください。 入力したものを一応載せときます↓ Sub list_file() Dim numfile As Long Dim i As Long With Application.FileSearch .NewSearch .LookIn = Range("b1").Value .Filename = Range("b2").Value .SearchSubFolders = Range("b3").Value If .Execute() > 0 Then file_count = .FoundFiles.Count MsgBox file_count & "files exis" Worksheets.Add after:=Worksheets("sheet1") Range("a1").Value = "filename" Range("b1").Value = "date" Range("c1").Value = "size" For i = 1 To file_count Cells(i + 1, 1).Value = .FoundFiles(i) Cells(i + 1, 2).Value = FileDateTime(.FoundFiles(i)) Cells(i + 1, 3).Value = FileLen(.FoundFiles(i)) Cells(i + 1, 2).Value = Hex(Cells(i + 1, 3).Value) Next Columns("a:c").AutoFit Else MsgBox "no file exists" End If End With End Sub

  • Excel VBAのFileSearch機能

    初めて投稿します。助けてください。 以下のVBAを使用して業務を行っているのですが このマクロが動かなくなってしまいました。 ネット等で調べてわかったのですが XP問題で社内PCがすべて変わりExcelも2013になってしまい 2013では、下記に記載されているFileSearch機能が使用できないようです。 出来れば下記の分をExcel2013でも 動くようにどの部分を変更すればいいいか教えていただけないでしょうか? ---------------------<VBA文>------------------------- Sub 作成() Dim i, j, no As Integer Dim Mpath, Mname, Mfull As String Mpath = ActiveWorkbook.Path Mname = ActiveWorkbook.Name Mfull = Mpath & "\" & Mname Worksheets("一覧").Select Range("A2:A200").Clear With Application.FileSearch .NewSearch .LookIn = Mpath .Filename = "*.xls" .FileType = msoFileTypeExcelWorkbooks If .Execute > 0 Then For i = 1 To .Execute If .FoundFiles(i) <> Mfull Then Cells(i + 1, 1).Value = .FoundFiles(i) j = Len(Cells(i + 1, 1)) If j > 218 Then MsgBox ("218文字を超えてます。") Exit Sub End If End If Next i Else MsgBox ("見つかりませんでした。") End If End With   Range("A2").Select Range("A2:A1000").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal End Sub

専門家に質問してみよう