VBA의 파일 시스템 개체

Iqra Hasnain 2024년2월15일
  1. VBA의 파일 시스템 개체
  2. VBA에서 FileSystemObject 생성
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

출력:

파일 시스템 개체를 사용하여 VBA에 폴더 존재 여부 확인

마찬가지로 파일이 존재하는지 여부를 확인할 수 있습니다. 아래 코드는 제공된 폴더에 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

출력:

파일 시스템 개체를 사용하여 VBA의 폴더 내부 파일 확인

아래 코드는 시스템의 C 디스크에 'Test'라는 폴더를 생성합니다(폴더를 생성하려는 컴퓨터의 경로를 제공해야 함).

암호:

# vba
Sub CreateNewFolder()
Set MyFileSysObj = CreateObject("Scripting.FileSystemObject")
MyFileSysObj.CreateFolder("D:\Test")
End Sub

출력:

파일 시스템 개체를 사용하여 VBA에서 새 폴더 만들기

이 코드는 제대로 작동하지만 폴더가 이미 있으면 예외가 발생합니다. 아래 코드는 폴더가 이미 존재하는지 확인하고 존재하지 않는 경우 폴더를 생성합니다.

폴더가 이미 있는 경우 알림을 표시합니다. 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에서 새 폴더 만들기

다음 코드는 루트 폴더의 모든 파일을 지정된 폴더로 복사합니다.

암호:

# 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

출력:

VBA에서 파일 시스템 개체를 사용하여 폴더에서 파일 이름 확인

이 예는 이전에 논의한 것보다 더 복잡합니다. 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에서 파일 시스템 개체를 사용하여 폴더에서 하위 폴더 이름 확인

아래와 같이 파일을 덮어쓰는 또 다른 예를 살펴보겠습니다.

암호:

# 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

출력:

소스 폴더:

VBA에서 파일 시스템 객체를 사용하여 src에서 dst로 파일을 전송하기 위한 src 폴더

DST 폴더:

VBA에서 파일 시스템 개체를 사용하여 src에서 dst로 파일을 전송한 후 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