728x90

VBA로 작성한 파일을 사용하다보면 파일이름과 시트가 충돌해서 에러가 나는 경우가 있습니다.

파일이름과 시트를 제약하고 배포했을 때는 오히려 사용자가 불편할 수도 있습니다.

지금 엑셀에서 이런문제를 해결하는 법을 알아보겠습니다.

 

객체를 못찾으면 런타임 오류가 발생합니다

 

 

1. 엑셀 파일의 정보를 읽는 ThisWorkbook

 

ThisWorkbook : 실행되고 있는 파일에 있는 다양한 정보를 저장하고 있습니다.

  • .Name : 파일의 이름을 반영합니다. 확장자까지 같이 반영합니다.(예 : 파일이름.xlsx)
  • .Path : 파일의 경로를 반영합니다.(예 : C:\Users\user\Desktop)
  • .FullName : 경로를 포함한 파일의 총이름입니다. (예 : C:\Users\user\Desktop\파일이름.xlsx )
  • FullName 속성은  ThisWorkbook.path & "\" & ThisWorkbook.name 과 같습니다.

Thisworkbook은 지금 코드를 실행하고 있는 함수입니다.

VBA가 활성화 시킨 있는 엑셀 파일의 정보를 가지고 오려면 ActiveWorkbook를 사용해야 합니다.

속성은 동일하게 작동합니다.

 

 

2. 시트 이름 변경했을때 대응 방법

 

시트를 사용하는 상황은 다양해서 쉽게 해결하기 어렵습니다.

시트의 이름을 바꾸거나 내용을 변경할 수도 있습니다.

이번에는 "결과"시트가 없어졌을 때 다시 만드는 상황에 대해서 가정해 보겠습니다.

 

 

' 결과 시트 확인합니다.
    On Error Resume Next
    Set targetWorksheet = ThisWorkbook.Sheets("결과")
    On Error GoTo 0

    If targetWorksheet Is Nothing Then
        ' "결과" 시트가 없을 때 생성합니다.
        Set targetWorksheet = ThisWorkbook.Sheets.Add
        targetWorksheet.Name = "결과"
    End If

 

 

On Error로 시트를 확인하고 없으면 만들어서 작성하도록 합니다.

새로 만든 시트에 결과등을 저장하면 에러가 날 일은 없습니다.

 

320x100

 

 

3. 시트 보호하기

 

가장 확실한 방법 중 하나는 시트를 보호해서 사용자가 이름을 변경하지 못하게 할 수도 있습니다.

 

시트를 보호하거나 해제하는 코드는 아래와 같습니다.

VBA가 실행되었을때만 보호를 해제하고 작업후 다시 보호하는 방식입니다.

 

 

Sub Protectsheet()
    Dim ws As Worksheet
    Dim password As String
    
    ' 보호를 해제할 시트와 해당 시트의 비밀번호를 설정
    Set sheet_name = ThisWorkbook.Sheets("Sheet1")
    password = "Password" ' 시트의 보호 비밀번호

    ' 시트 보호 해제
    On Error Resume Next
    sheet_name.Unprotect password:=password
    On Error GoTo 0

    ' 보호되었는지 확인
    If sheet_name.ProtectContents = False Then
        ' 다시 보호하기
        sheet_name.Protect password:=password
    Else
        ' 보호가 이미 해제되어 있거나 비밀번호가 틀린 경우 메시지 표시
        MsgBox "틀린 비밀번호 입니다."
    End If
End Sub

 

 

 

 

반응형

+ Recent posts