MS Access VBA 파일 열기 – 파일이 열려있는지 확인하기

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 
Categories VBA

Leave a Comment