VBAを使用してファイルが存在するかどうかを確認します


82
Sub test()

thesentence = InputBox("Type the filename with full extension", "Raw Data File")

Range("A1").Value = thesentence

If Dir("thesentence") <> "" Then
    MsgBox "File exists."
Else
    MsgBox "File doesn't exist."
End If

End Sub

これで、入力ボックスからテキスト値を取得すると、機能しません。ただし、If"the sentence"から削除Dir()してコード内の実際の名前に置き換えると、機能します。誰か助けてもらえますか?

回答:


142

コードに含まれDir("thesentence")ている必要があることに注意してくださいDir(thesentence)

コードをこれに変更します

Sub test()

thesentence = InputBox("Type the filename with full extension", "Raw Data File")

Range("A1").Value = thesentence

If Dir(thesentence) <> "" Then
    MsgBox "File exists."
Else
    MsgBox "File doesn't exist."
End If

End Sub

1
このコードを使用すると、コンパイラは「thesentence」をディレクトリと見なさないので、前にもう1行のコードを使用したと思います。<code> Dim Path as String Dim Directory as String Path = InitialPath& "\"&Date $ Directory = Dir(Path、vbDirectory)</ code> If Dir(Directory)<> ""の下で** Directory **変数文字列を使用した場合、うまく機能しました
muhammad tayyab 2017年

19

OfficeFileDialogオブジェクトを使用して、ユーザーにファイルシステムからファイルを選択させます。VBプロジェクトまたはVBAエディターに参照を追加Microsoft Office Libraryして、ヘルプを参照してください。これは、人々にフルパスを入力させるよりもはるかに優れています。

これは、msoFileDialogFilePickerユーザーが複数のファイルを選択できるようにするために使用する例です。を使用することもできますmsoFileDialogOpen

'Note: this is Excel VBA code
Public Sub LogReader()
    Dim Pos As Long
    Dim Dialog As Office.FileDialog
    Set Dialog = Application.FileDialog(msoFileDialogFilePicker)

    With Dialog
        .AllowMultiSelect = True
        .ButtonName = "C&onvert"
        .Filters.Clear
        .Filters.Add "Log Files", "*.log", 1
        .Title = "Convert Logs to Excel Files"
        .InitialFileName = "C:\InitialPath\"
        .InitialView = msoFileDialogViewList

        If .Show Then
            For Pos = 1 To .SelectedItems.Count
                LogRead .SelectedItems.Item(Pos) ' process each file
            Next
        End If
    End With
End Sub

たくさんのオプションがあるので、可能なことすべてを理解するには、完全なヘルプファイルを見る必要があります。Office 2007 FileDialogオブジェクトから始めることができます(もちろん、使用しているバージョンの正しいヘルプを見つける必要があります)。


1
+1これは優れているため、はるかに優れていますApplication.FileDialog(msoFileDialogOpen)
Alex K.

18

@UberNubIsTrueからのfileExistsの修正:

Function fileExists(s_directory As String, s_fileName As String) As Boolean

  Dim obj_fso As Object, obj_dir As Object, obj_file As Object
  Dim ret As Boolean
   Set obj_fso = CreateObject("Scripting.FileSystemObject")
   Set obj_dir = obj_fso.GetFolder(s_directory)
   ret = False
   For Each obj_file In obj_dir.Files
     If obj_fso.fileExists(s_directory & "\" & s_fileName) = True Then
        ret = True
        Exit For
      End If
   Next

   Set obj_fso = Nothing
   Set obj_dir = Nothing
   fileExists = ret

 End Function

編集:短縮版

' Check if a file exists
Function fileExists(s_directory As String, s_fileName As String) As Boolean

    Dim obj_fso As Object

    Set obj_fso = CreateObject("Scripting.FileSystemObject")
    fileExists = obj_fso.fileExists(s_directory & "\" & s_fileName)

End Function

2
コードが同じファイル名を複数回(s_directory内のすべてのファイルに対して1回)テストするのはなぜですか?このテストを繰り返しても意味がありません。ループ変数(obj_file)がループコードで使用されていないことに気付くでしょう。
grantnz 2013年

1
@grantnz確かに!私は怠惰なコピー/貼り付けを行い、それが機能するまで微調整しました。短縮版は上記です。ありがとう。
amackay11 2013年

このテストで誤検知が報告されることがあることに気付いた人はいますか。つまり、ファイルシステムにファイルが存在しない場合でも「True」が返されます。私のアプリケーションでは、ネットワーク上のサーバーにファイルが存在するかどうかを確認します。
pablete 2014年

6

それらのスピーチマークを取り除くだけです

Sub test()

Dim thesentence As String

thesentence = InputBox("Type the filename with full extension", "Raw Data File")

Range("A1").Value = thesentence

If Dir(thesentence) <> "" Then
    MsgBox "File exists."
Else
    MsgBox "File doesn't exist."
End If

End Sub

これは私が好きなものです:

Option Explicit

Enum IsFileOpenStatus
    ExistsAndClosedOrReadOnly = 0
    ExistsAndOpenSoBlocked = 1
    NotExists = 2
End Enum


Function IsFileReadOnlyOpen(FileName As String) As IsFileOpenStatus

With New FileSystemObject
    If Not .FileExists(FileName) Then
        IsFileReadOnlyOpen = 2  '  NotExists = 2
        Exit Function 'Or not - I don't know if you want to create the file or exit in that case.
    End If
End With

Dim iFilenum As Long
Dim iErr As Long
On Error Resume Next
    iFilenum = FreeFile()
    Open FileName For Input Lock Read As #iFilenum
    Close iFilenum
    iErr = Err
On Error GoTo 0

Select Case iErr
    Case 0: IsFileReadOnlyOpen = 0 'ExistsAndClosedOrReadOnly = 0
    Case 70: IsFileReadOnlyOpen = 1 'ExistsAndOpenSoBlocked = 1
    Case Else: IsFileReadOnlyOpen = 1 'Error iErr
End Select

End Function    'IsFileReadOnlyOpen

3
「スピーチマーク」については今まで聞いたことがありません。奇妙な。私の意見では一種の誤称です。多くのものは引用を必要としますが、スピーチではありません。
ErikE 2012

4
@ErikE +1 for niceobservation ...写真はこちら
whytheq 2012

1
どうやら「スピーチマーク」は「引用符」の非公式バージョンです。
ErikE 2012

@ErikE ...私は知っている、というか「私は知っている」と言った
whytheq 2012

6
Function FileExists(fullFileName As String) As Boolean
    FileExists = VBA.Len(VBA.Dir(fullFileName)) > 0
End Function

私のサイトでは、ほとんど、非常にうまく機能します。空の文字列を ""で呼び出すと、Dirは " connection.odc "を返します!! あなたたちがあなたの結果を共有することができれば素晴らしいでしょう。

とにかく、私はこれが好きです:

Function FileExists(fullFileName As String) As Boolean
  If fullFileName = "" Then
    FileExists = False
  Else
    FileExists = VBA.Len(VBA.Dir(fullFileName)) > 0
  End If
End Function

1
古い投稿dir("")ですが、現在のディレクトリの最初のファイルの名前が表示されているようです。あなたの場合、それはと呼ばれるファイルでしたconnection.odc
Corey


3

特にコードの何が問題になっているのかはわかりませんが、オンラインで見つけたこの関数(コメントのURL)を使用して、ファイルが存在するかどうかを確認します。

Private Function File_Exists(ByVal sPathName As String, Optional Directory As Boolean) As Boolean
    'Code from internet: http://vbadud.blogspot.com/2007/04/vba-function-to-check-file-existence.html
    'Returns True if the passed sPathName exist
    'Otherwise returns False
    On Error Resume Next
    If sPathName <> "" Then

        If IsMissing(Directory) Or Directory = False Then

            File_Exists = (Dir$(sPathName) <> "")
        Else

            File_Exists = (Dir$(sPathName, vbDirectory) <> "")
        End If

    End If
End Function

1
これにより、パスを指定し、それがディレクトリであるかどうかがわからない場合にtrueが返されます。パスがファイルのみであるかどうかをテストする場合、これは100%機能しません。? dir$("C:\Users\Chloe\AppData\Local\Temp\")そのディレクトリの最初のファイルを指定しますが、これは ""と等しくないため、Directory引数をオフのままにするかfalseに設定してもtrueを返します。
クロエ

@Chloeファイル名とともにファイル拡張子を指定することを前提としているので、その場合、ディレクトリであるというあいまいさは実際には当てはまりません。しかし、確かに、それはより堅牢である可能性があります。それはあなたが必要とする解決策の深さに依存します。しかし、それは確かにOPによって指定されたケースで機能します
Dan

1

非常に古い投稿ですが、いくつか変更を加えた後、それが私を助けてくれたので、私は共有したいと思いました。ディレクトリが存在するかどうかを確認する場合は、vbDirectory引数をDir関数に追加する必要があります。追加しない場合は、0毎回戻ります。(編集:これはロイの回答に対する回答でしたが、誤って通常の回答にしました。)

Private Function FileExists(fullFileName As String) As Boolean
    FileExists = Len(Dir(fullFileName, vbDirectory)) > 0
End Function

1

ここでの他の回答に基づいて、dirsとfilesで機能するはずのワンライナーを共有したいと思います

  • Len(Dir(path)) > 0 or Or Len(Dir(path, vbDirectory)) > 0  'version 1 - ... <> "" should be more inefficient generally
    
    • Len(Dir(path))ディレクトリでは機能しませんでした(Excel 2010 / Win7))
  • CreateObject("Scripting.FileSystemObject").FileExists(path)  'version 2 - could be faster sometimes, but only works for files (tested on Excel 2010/Win7)
    

PathExists(path)関数として:

Public Function PathExists(path As String) As Boolean
    PathExists = Len(Dir(path)) > 0 Or Len(Dir(path, vbDirectory)) > 0
End Function
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.