MS Access에서 폼을 만들 때 dialog를 이용해서 파일을 여는 일이 자주 있습니다. 저는 Access와 Excel을 병행하여 쓰기 때문에 Access 안에서 VBA를 이용하여 Excel 파일을 여는 일이 자주 있는데요. 엑셀 파일을 열 때 기존에 동일한 파일이 열려있다면 읽기 전용으로 읽어 작업 내용이 별도의 파일에 덮어 씌워지는 일이 발생하게 됩니다. 그래서 이번 글에서는 내가 열고자 하는 파일이 열려있는지 확인하고 이에 대처하는 방법에 대해서 알아보겠습니다.
Table of Contents
관련글
파일이 열려있는지 확인하기
예시코드는 한 개의 Sub와 한 개의 Function으로 구성되어 있습니다. 먼저 IsWorkBookOpen 이라는 함수는 전달받은 경로의 파일을 연 뒤 해당 파일을 강제로 잠그면서 발생하는 에러코드를 통해서 파일이 열려있는지를 판단하는 로직입니다.
이미 파일이 열려있는 상태에서 MyXL.Workbooks.Open 함수를 사용하게 되면 읽기 전용으로 열리게 되고 매크로 작업이 모두 끝난 후 파일을 저장하려 할 시에 다른 이름으로 저장해야 하는 상황이 발생합니다. 이 때문에 기존에 동일한 파일이 열려있는 경우 이를 판단하고 기존 파일을 종료하는 것이 필요하는데 이 때 IsWorkBookOpen이라는 함수를 유용하게 사용할 수 있습니다.
Source Code
Private Sub btn_exportExcel_Click() Dim fd As Office.FileDialog Dim sFile As String Set fd = Application.FileDialog(msoFileDialogFilePicker) With fd .Filters.Clear .Title = "파일을 선택하세요." .Filters.Add "Excel Files", "*.xlsm", 1 .AllowMultiSelect = False .InitialFileName = CurrentProject.Path & "\" If .Show = True Then sFile = .SelectedItems(1) End If If sFile <> "" Then Set MyXL = CreateObject("Excel.Application") Ret = IsWorkBookOpen(sFile) If Ret = True Then MsgBox "파일이 열려있습니다. 파일을 닫고 재실행 해주세요." Exit Sub Else Set wb = MyXL.Workbooks.Open(sFile) End If End If End Sub
Function IsWorkBookOpen(FileName As String) Dim ff As Long, ErrNo As Long On Error Resume Next ff = FreeFile() 'Get a free file number ' Attempt to open the file and lock it Open FileName For Input Lock Read As #ff Close ff ErrNo = Err ' Save the error number that occurred On Error GoTo 0 Select Case ErrNo Case 0: IsWorkBookOpen = False 'File is NOT opened by another user. Case 70: IsWorkBookOpen = True 'File is already opened by another user. Case Else : Error ErrNo End Select End Function