VBA의 파일 시스템 개체
예제와 함께 VBA의 파일 시스템 개체
를 소개합니다.
VBA의 파일 시스템 개체
FileSystemObject
(FSO)는 랩톱의 파일 시스템에 액세스하기 위한 다양한 작업을 제공합니다. 이 개체를 사용하면 파일, 디렉터리 및 드라이브에 빠르게 액세스하고 읽고 쓸 수 있습니다.
FSO는 전세계 표준 및 시스템 설정에 따라 작동합니다. Excel 응용 프로그램을 국제적으로 공유하는 경우 FSO는 코드가 처리하기 어려울 수 있는 국가 간의 설정 변화를 처리합니다.
FSO를 사용하면 Windows 파일 탐색기에서 VBA 코드로 수행할 수 있는 거의 모든 작업을 수행할 수 있습니다. 실제로 Windows 파일 시스템을 완벽하게 제어할 수 있습니다.
VBA에서 FileSystemObject
생성
Excel VBA에는 FileSystemObject
가 포함되지 않습니다. 아마도 후기 바인딩 개체를 구성하여 VBA에서 FSO를 사용할 수 있습니다.
암호:
# vba
Sub CreateFileSysObj()
Set MyFileSysObj = CreateFileSysObj("Scripting.FileSystemObject")
End Sub
VBA에 FSO 라이브러리에 대한 참조를 포함할 수도 있습니다. 코드가 실행될 때 개체를 생성할 필요가 없기 때문에 초기 바인딩이 후기 바인딩보다 빠릅니다.
링크를 추가하려면 Alt-F11을 눌러 VBE(Visual Basic Editor)를 연 다음 VBE 메뉴에서 'Tools|References'
를 선택합니다. 그러면 적절한 참조를 선택할 수 있는 팝업 창이 나타날 수 있습니다.
액세스 가능한 참조 열 내에서 “‘Microsoft Scripting Runtime’“을 찾을 때까지 맨 아래로 스크롤합니다. 상자를 선택하고 확인을 클릭하여 응용 프로그램에 라이브러리를 포함합니다.
DLL 라이브러리 파일은 C:Windows\SysWOW64\scrrun.dll
에 있습니다.
다른 동료나 장소에 프로그램을 보내는 경우 이 파일이 PC의 올바른 위치에 있는지 확인하십시오. 그렇지 않으면 코드가 실패합니다. Dir
명령을 사용하여 WorkbookOpen
이벤트의 오류 트랩에 파일이 있는지 확인하는 것이 좋습니다.
누락된 경우 메시지를 표시하고 Excel 파일을 종료합니다. 참조를 삽입한 후 다음 코드를 사용하여 FSO를 생성할 수 있습니다.
암호:
# vba
Sub TestFileSysObj()
Dim MyFileSysObj As New FileSystemObject
End Sub
다음 코드는 'Test'
라는 폴더가 (특정 위치에) 존재하는지 여부를 결정합니다. 폴더가 있으면 IF 조건이 True
이고 메시지 상자에 '폴더가 존재합니다.'
가 표시됩니다. 폴더가 없으면 '폴더가 존재하지 않습니다'
라는 텍스트가 나타납니다.
암호:
# vba
Sub FolderExistCheck()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
If MyFileSysObj.FolderExists("D:\Test") Then
MsgBox"This Folder Exists"
Else
MsgBox"This Folder Doest Not Exists"
End If
End Sub
출력:
마찬가지로 파일이 존재하는지 여부를 확인할 수 있습니다. 아래 코드는 제공된 폴더에 Test.xlsx
라는 파일이 있는지 여부를 결정합니다.
암호:
# VBA
Sub CheckFileExist()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
If MyFileSysObj.FileExists("D:\Test\Test.xlsx") Then
MsgBox "This File Exists In Folder"
Else
MsgBox "This File Does Not Exist In Folder"
End If
End Sub
출력:
아래 코드는 시스템의 C 디스크에 'Test'
라는 폴더를 생성합니다(폴더를 생성하려는 컴퓨터의 경로를 제공해야 함).
암호:
# vba
Sub CreateNewFolder()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
MyFileSysObj.CreateFolder("D:\Test")
End Sub
출력:
이 코드는 제대로 작동하지만 폴더가 이미 있으면 예외가 발생합니다. 아래 코드는 폴더가 이미 존재하는지 확인하고 존재하지 않는 경우 폴더를 생성합니다.
폴더가 이미 있는 경우 알림을 표시합니다. FSO의 Folder Exists 방법을 사용하여 폴더가 있는지 확인했습니다.
암호:
# vba
Sub CreateNewFolder()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
If MyFileSysObj.CreateFolder("D:\Test") Then
MsgBox "This Folder Exists Already"
Else
MyFileSysObj.CreateNewFolder("D:\Test")
End If
End Sub
출력:
다음 코드는 루트 폴더의 모든 파일을 지정된 폴더로 복사합니다.
암호:
# vba
Sub FetchFileName()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
Dim FileInFolder
Dim SysFolder
Set SysFolder = MyFileSysObj.GetFolder("D:\Test")
For Each FileInFolder In SysFolder.Files
Debug.Print FileInFolder.Name
Next FileInFolder
End Sub
출력:
이 예는 이전에 논의한 것보다 더 복잡합니다. Microsoft Scripting Runtime Library
를 참조할 때 FileSystemObject
및 기타 모든 파일 및 폴더 개체를 사용할 수 있습니다.
위의 예에서 언급한 것처럼 우리는 FileSystemObject
, File 및 Folder
의 세 가지 개체를 사용했습니다. 이를 통해 필요한 폴더의 각 파일을 살펴볼 수 있으며 name 속성을 사용하여 모든 파일 이름 목록을 가져올 수 있습니다.
우리는 Debug.Print
를 사용하여 모든 파일의 이름을 가져옵니다. 필요한 폴더에 있는 모든 하위 폴더의 이름을 지정하는 또 다른 예를 살펴보겠습니다.
아이디어는 위의 예에서 논의된 것과 동일합니다. 이 예에서는 파일 대신 하위 폴더를 사용합니다.
암호:
# vba
Sub FetchSubFolder()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
Dim FileInFolder
Dim SysFolder
Dim SysSubFolder
Set SysFolder = MyFileSysObj.GetFolder("D:\Test")
For Each SysSubFolder In SysFolder.SubFolders
Debug.Print SysSubFolder.Name
Next SysSubFolder
End Sub
출력:
아래와 같이 파일을 덮어쓰는 또 다른 예를 살펴보겠습니다.
암호:
# vba
Sub CopyFiles()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
Dim SysFile
Dim SrcFolder
Dim FinalFolder
Dim SysFolder
Dim SysSubFolder
SrcFolder = "D:\Test\Src"
FinalFolder = "D:\Test\Dst"
Set SysFolder = MyFileSysObj.GetFolder(SrcFolder)
For Each SysFile In SysFolder.Files
MyFileSysObj.CopyFile Source:=MyFileSysObj.GetFile(SysFile), _
Destination:=FinalFolder & "\" & SysFile.Name, Overwritefiles:=False
Next SysFile
End Sub
출력:
소스 폴더
:
DST 폴더
:
MyFileSysObj.CopyFile
함수에서 Overwritefiles
속성을 False
로 설정했습니다(기본적으로 true임). 이렇게 하면 파일이 폴더에 이미 존재하는 경우 파일이 복제되지 않습니다(오류가 관찰됨).
아마도 이것을 True로 설정하거나 Overwritefiles
를 삭제하면 정확한 이름을 가진 최종 폴더의 모든 파일이 다시 작성됩니다. 파일을 전송할 때 항상 덮어쓸 위험이 있습니다.
이 시나리오에서는 이름 옆에 타임스탬프를 제공하는 것이 좋습니다. 이렇게 하면 파일 이름이 항상 고유하고 어떤 파일이 언제 복사되었는지 추적할 수 있습니다.
특정 확장자를 가진 파일만 복제하려는 경우 IF and Then
문을 사용하여 확장자가 Microsoft 스프레드시트 엑셀 파일인지 여부를 테스트합니다.
암호:
# vba
Sub CopyXlFiles()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
Dim SysFile
Dim SrcFolder
Dim FinalFolder
Dim SysFolder
Dim SysSubFolder
SrcFolder = "D:\Src"
FinalFolder = "D:\Dst"
Set SysFolder = MyFileSysObj.GetFolder(SRCFolder)
For Each SysFile In SysFolder.Files
If MyFileSysObj.GetExtensionName(SysFile) = "xlsx" Then
MyFileSysObj.CopyFile Source:=MyFileSysObj.GetFile(SysFile), _
Destination:=FinalFolder & "\" & SysFile.Name, Overwritefiles:=False
End If
Next SysFile
End Sub