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"를 디렉토리로 간주하지 않으므로 If : <code> Dim Path as String Dim Directory as String Path = InitialPath & 내가 사용하는 경우 "\"& 날짜는 $ 디렉토리 DIR = (경로, vbDirectory는) </ 코드> ** 디렉토리 ** 만약 디렉터리 (디렉토리) <> ""아래 변수 문자열 그것은 잘 작동
무하마드 tayyab

19

Office FileDialog개체를 사용하여 사용자가 파일 시스템에서 파일을 선택하도록합니다. 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)와 같이
알렉스 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의 모든 파일에 대해 한 번)? 이 테스트를 반복 할 필요가 없습니다. 루프 변수 (obj_file)는 루프 코드에서 사용되지 않습니다.
grantnz

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

4
좋은 관찰 ... +1 @ErikE 여기 사진
whytheq

1
분명히 "음성 기호"는 "따옴표"의 비공식 버전입니다.
ErikE

@ErikE ... 내가 알고 있거나 오히려 나는 "나는 알고있다"고 말했다
whytheq

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

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

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

@Chloe 나는 당신이 파일 이름과 함께 파일 확장자를 지정한다고 가정하고 있으므로 디렉토리라는 모호성이 실제로 적용되지 않습니다. 그러나 확실히 더 강력 할 수 있습니다. 필요한 솔루션의 깊이에 따라 다릅니다. 그러나 그것은 확실히 OP에 지정된 경우에 작동합니다
Dan

1

아주 오래된 게시물이지만 약간의 수정을 한 후에 도움이 되었기 때문에 공유 할 것이라고 생각했습니다. 디렉터리가 있는지 확인하는 경우 Dir 함수에 vbDirectory 인수를 추가하고, 그렇지 않으면 0매번 반환 합니다. (편집 : 이것은 Roy의 답변에 대한 응답이지만 실수로 일반 답변으로 만들었습니다.)

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

1

여기에 다른 답변을 기반으로 dirs 및 파일에서 작동 해야하는 한 줄짜리 줄을 공유하고 싶습니다 .

  • 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.