HOWTO · VBA

VBA에서 파일을 삭제하는 방법

VBA로 파일 하나, 확장자별 파일 또는 빈 폴더를 삭제하는 방법을 알아보세요.

이 페이지의 내용

VBA의 Kill 문을 사용하여 파일 또는 일치하는 파일을 삭제합니다. 파일 하나에 대해서는 FileSystemObject가 DeleteFile 메서드와 먼저 경로를 확인할 수 있는 FileExists 메서드를 제공합니다. 빈 폴더를 제거하려면 RmDir를 사용합니다. 작업에 맞는 섹션을 선택하고 삭제 코드를 실행하기 전에 경로와 대상 파일을 확인하세요. 이러한 작업은 파일이나 폴더를 제거합니다.

VBA에서 파일 삭제

올바른 접근 방식은 제거해야 할 대상에 따라 다릅니다. Kill은 파일 경로나 와일드카드 패턴을 받는 VBA 문입니다. FileSystemObject는 파일과 폴더 작업을 위한 별도의 개체 모델로, 그 DeleteFile 및 FileExists 멤버가 삭제와 경로 확인을 지원합니다. RmDir는 빈 폴더를 제거합니다. 이들은 서로 다른 선택이므로 Kill은 FileSystemObject 함수가 아닙니다.

예제를 적용하기 전에 그 샘플 경로를 사용하려는 전체 경로로 바꾸세요. 폴더와 파일 이름을 주의 깊게 확인하세요. 와일드카드는 해당 폴더의 여러 파일을 대상으로 할 수 있으므로 대량 삭제 코드를 실행하기 전에 의도한 일치를 검사하세요. 아래 VBA 스니펫은 구문 예제이며 Windows/VBA 런타임 테스트가 아닙니다. 제공된 실행 증거는 PowerShell 파일 시스템 예시만 다루며 VBA 호스트에서 관찰된 결과는 포함하지 않습니다.

VBA에서 단일 파일 삭제

Kill 문은 알려진 파일에 대한 짧은 선택입니다. 이 완전한 프로시저는 VBA 호스트에서 실행될 때 지정된 경로의 통합 문서를 삭제합니다.

Sub DeleteFileWithKill(): Kill "D:\Test\testFile.xlsx": End Sub

샘플 경로를 제거하려는 정확한 파일로 바꾸세요. Kill은 확인을 요청하지 않으므로 실행하기 전에 경로를 확인하세요. 이 예제는 파일이 존재한다고 가정합니다. 존재하지 않으면 Kill은 VBA 런타임 오류를 발생시킵니다. 프로시저가 파일 없음 상태를 정상적인 결과로 취급해야 한다면 의도적인 오류 처리를 추가하세요.

FileSystemObject를 통해서도 파일 하나를 삭제할 수 있습니다. 개체를 만들고 경로를 설정한 뒤 그 DeleteFile 메서드를 호출하세요.

Sub DeleteFileWithFSO(): Dim FileSysObj As Object: Dim FileToDel As String: Set FileSysObj = CreateObject("Scripting.FileSystemObject"): FileToDel = "D:\Test\testFile.xlsx": FileSysObj.DeleteFile FileToDel, True: End Sub

두 번째 인수 True는 읽기 전용 파일의 삭제를 허용합니다. 읽기 전용 파일을 보존하려면 False로 변경하세요. 이 후기 바인딩 예제는 CreateObject를 사용하므로 Scripting Runtime에 대한 프로젝트 참조를 추가할 필요가 없습니다.

파일이 없을 수 있는 경우 DeleteFile를 호출하기 전에 FileExists로 확인하세요. 다음 프로시저는 두 결과 모두에 대해 메시지를 표시하고 경로를 찾을 수 없으면 삭제를 건너뜁니다.

Sub DeleteFileAfterChecking()
Dim FileSysObj As Object
Dim FileToDelete As String
Set FileSysObj = CreateObject("Scripting.FileSystemObject")
FileToDelete = "D:\Test\testFile.xlsx"
If FileSysObj.FileExists(FileToDelete) Then
FileSysObj.DeleteFile FileToDelete, True
MsgBox "File Deleted"
Else
MsgBox "There is no file with the name you provided!"
End If
End Sub

FileExists는 프로시저가 DeleteFile를 호출하기 전에 경로를 확인합니다. 그러나 다른 프로세스가 그 사이에 파일을 변경하는 것을 막지는 않습니다. 액세스 또는 삭제 실패를 처리해야 한다면 확인이 삭제를 보장한다고 가정하지 말고 통합 문서에 적합한 오류 처리를 추가하세요.

이 독립형 PowerShell 픽스처는 임시 파일을 만들고 제거하는 것을 보여줍니다. 이것은 파일 시스템 예시이며 VBA 코드도 아니고 Office 호스트에서의 동작 증거도 아닙니다.

$path = Join-Path ([System.IO.Path]::GetTempPath()) ("vba-delete-demo-" + [guid]::NewGuid().ToString() + ".txt")
Set-Content -LiteralPath $path -Value "sample"
Remove-Item -LiteralPath $path

VBA의 모든 텍스트 파일 삭제

한 폴더에서 텍스트 파일을 제거하려면 와일드카드 경로를 사용하세요. D:\Test\Dst\*.txt는 해당 폴더 바로 아래의 .txt 파일과 일치하며 하위 폴더는 검색하지 않습니다. 이 완전한 프로시저는 그 패턴을 Kill에 전달합니다.

Sub DeleteTxtFile(): Kill "D:\Test\Dst\*.txt": End Sub

프로시저를 실행하기 전에 폴더와 그 일치하는 파일 이름을 검토하세요. 일치하는 모든 텍스트 파일이 대상입니다. 이 패턴은 하위 폴더를 검색하지 않습니다. 폴더에 일치하는 .txt 파일이 없으면 Kill은 VBA 런타임 오류를 발생시키므로, 그러한 상태가 가능하다면 일치 집합을 확인하거나 오류 처리를 추가하세요. 의도한 집합을 확인한 후에만 디렉터리를 좁히거나 확장자를 변경하고, 가능하면 관련 없는 파일은 선택한 폴더 밖에 두세요. 이러한 결과는 VBA의 문서화된 동작 의미 체계를 따릅니다. 이 예제에 대해 Windows/VBA 실행 결과는 관찰되지 않았습니다.

VBA에서 모든 Excel 파일 삭제

한 폴더의 .xlsx 통합 문서를 대상으로 하려면 대응하는 와일드카드 경로를 사용하세요. 이 완전한 프로시저는 디렉터리 트리의 모든 통합 문서가 아니라 해당 폴더 바로 아래의 일치하는 통합 문서를 대상으로 합니다.

Sub DeleteXlFile(): Kill "D:\Test\Dst\*.xlsx": End Sub

이 대량 삭제를 실행하기 전에 폴더와 일치하는 통합 문서 이름을 확인하세요. .xlsx 패턴에는 .xls나 .xlsm 같은 다른 Excel 형식이 포함되지 않습니다. 그 형식들도 의도한다면 별도의 의도적인 패턴을 사용하세요. 와일드카드가 제거하려는 파일만 선택하도록 디렉터리를 좁게 유지하세요. 텍스트 파일 패턴과 마찬가지로 일치하는 통합 문서가 없으면 Kill은 VBA 런타임 오류를 발생시킵니다. 이 동작은 VBA 의미 체계에서 설명된 것이며 제공된 런타임 증거에서는 실행되지 않았습니다.

VBA에서 폴더 삭제

비어 있는 폴더를 제거하려면 RmDir를 사용합니다. 이 완전한 프로시저는 샘플 디렉터리를 지정합니다.

Sub DeleteFolder(): RmDir "D:\Test\Dst": End Sub

RmDir는 비어 있지 않은 폴더 안의 파일이나 하위 폴더를 재귀적으로 제거하지 않습니다. 빈 폴더가 필요하며, 파일이나 하위 폴더가 남아 있는 상태에서 호출하면 VBA 런타임 오류가 발생합니다. 그 내용을 별도로 이동하거나 삭제한 뒤 폴더 자체에 대해 RmDir를 호출하세요. 프로시저를 실행하기 전에 경로가 의도한 디렉터리를 지정하는지 확인하세요. 이것은 문서화된 VBA 동작이지만, 빈 폴더 또는 비어 있지 않은 폴더 호출에 대해 Windows/VBA 런타임 결과는 관찰되지 않았습니다.