2016-12-16 1 views
1

Dir()을 사용하여 현재 디렉터리 (즉, 내가 사용중인 통합 문서와 같은 디렉터리)에 파일이 있는지 여부를 확인하는 작업을하고 있습니다. 코드는 주어진 - 그리고 분명히 비디오 예에서 작업 -입니다 같이 :이 코드를 실행하면Excel VBA 디렉터리() 기본 경로?

IsThere = (Dir("SomeFile.xlsx") <> "") 

는 IsThere는 False를 반환합니다. 내가 사용하여 해결할 수 있습니다

IsThere = (Dir(ActiveWorkbook.Path & "\SomeFile.xlsx") <> "") 

하지만 예상대로 디렉터리는 현재 디렉토리에 기본적으로보고되지 않는 이유를 알고 싶어요.

나는 관련 조언을 찾기 위해 애 쓰고 있습니다. 내가 Dir()을 사용하는 방법에서 발견 한 대부분의 예제는 지정된 파일 경로와 함께 있으므로 내 문제에 대해 실제로 밝히지 않았습니다. 내가 찾은 가장 가까운 것을 말한다 this (obsolete) MSDN reference입니다 :

가 제대로 실행하려면 Dir 함수는 FileIOPermission에의 읽기 및 PathDiscovery 플래그를 실행 코드에 부여해야합니다.

문제가 정말 1에 StackOverflow에 관해서는

에 PathDiscovery를 설정하는 방법에 거기에 링크 된 조언을 이해하지 못하는입니다, this 아마 내 문제에 가장 가까운 -이 지정된 사용하지만 경로이며 네트워크 위치를 참조하는 이 아니며이 아닙니다. 대답은에서 this question까지 Dir()이 예상되는 방식으로 작동해야한다고 가정합니다. 즉, 파일 이름이 완전히 지정되어 있고 경로가 완전히 지정되어 있지 않은 것으로 가정합니다.

+0

여기에 대한 답은 특정 위치의 파일을 테스트 한 다음'Dir()'호출에 경로를 포함시키는 경우입니다 - 예를 들어'Dir ("test.xlsx")'를 사용하지 말고 –

답변

1

이것은 호스트 응용 프로그램이 디렉토리라고 생각하는 것이 무엇이든 상관이 없습니다. 당신은 항상 디렉토리 DirCurDir 함수를 호출하여 기본 설정됩니다 무엇인지 찾을 수 있습니다 : 당신이 그것을 변경해야하는 경우

Debug.Print CurDir$ 

ChDir 전화 : 그것의

Debug.Print CurDir$ 
Debug.Print Dir$("*.*") 
ChDir "C:\" 
Debug.Print CurDir$ 
Debug.Print Dir$("*.*") 

생각해 명령 프롬프트에 앉아처럼 dir 또는 cd을 입력하는 것과 똑같은 일을합니다. 현재 디렉토리는 매크로 실행 사이에 상태를 유지하므로 일부 기본 위치에 의존 할 수 없습니다.

열려있는 통합 문서에 상대적인 경로가 필요한 경우 Application.Path을 사용하여 기본 경로와 관련된 경로가 필요한 경우 Workbook.Path을 사용하십시오. 파일의 존재 여부를 테스트해야한다면 Dir을 전혀 사용하지 마십시오. 대신 Scripting.FileSystemObject를 사용하십시오. 레거시 파일 기능이 더 이상 사용되지 않는 것으로 생각하면 큰 호응을 얻습니다.

+1

FSO에 관하여 - 코드가 Mac에서 실행될 필요가없는 한 괜찮습니다.하지만 실제로'Dir()'에는 아무런 문제가 없습니다 : it ("C : \ Folder \ Folder2 \ test.xlsx" 확실히 "유산"이 아닙니다 ... –

+0

@TimWilliams - 일단 특질에 익숙해지면'Dir'에 본질적으로 * 틀린 것은 없지만 FSO는 훨씬 강력합니다. 어쩌면 "유산"이 최고의 용어는 아닐지도 모른다. 나는 훨씬 더 나은 선택이 가능 해지 기 오래 전부터 존재 해왔다는 의미로 사용한다. – Comintern

+0

정말 명확하고 포괄적 인 답변 - 매력처럼 작동합니다. - 감사합니다! –

0

기본 설정을 확인하려면 Excel 옵션 -> 저장 -> 기본 파일 위치를 확인하십시오. 파일이있는 곳은 기본적으로 사용되지 않습니다.