Skip Navigation Links.
Expand VBAVBA
엑셀프로그래밍이 필요한 이유
Expand ExcelExcel
Expand External LibraryExternal Library
Expand SolutionSolution
Expand EssayEssay

WorkBook_7|WorkBook_BeforeClose|WorkBook_Open|FollowHyperlink|

다른 이름으로 통합문서를 저장못하게 제어하고 싶다

통합문서를 사용자가 다른 이름으로 저장하는것을 못하게 통제하고
싶을때는 어떻게 하면 좋겠냐는 일반적으로 자주 하는 질문이다
이것도 역시 이벤트프로시져를 활용하면 된다
저장하려는 순간..그 순간(이벤트의 발생)을 포착하면 되는것이다
Workbook오브젝트는 바로 이순간을 활용하라는
Workbook_BeforeSave 이벤트프로시져를 제공한다

그런데 통합문서는 저장에 두가지가 있다



그림과 같이 두가지 저장이 있는데
어떤 저장명령(Save혹은 SaveAS)을 했는지
Workbook_BeforeSave이벤트프로시져에서 이것을 어떻게 알아낼수 있을까

Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

첫번째 매개변수가 True일때는 SaveAs메소드를 호출한것이고
False일때는 그냥 Save메소드를 호출한것이다
그래서 다른 이름으로 저장하는것을 방지하고 싶다면

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  If SaveAsUI Then Cancel = True
End Sub

라고 하던가..메시지 박스를 친절하게 띄우고 싶다면

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean , Cancel As Boolean)
If SaveAsUI Then
  MsgBox "다른 이름으로 저장할수 없습니다"
  Cancel = True
End If
End Sub

라고 하면 된다
그러나 통합문서를 새문서를 열고 처음 Save메소드를 사용할때는
SaveAs메소드를 호출하는 것과 같이 취급된다는 점을 유의하셔야 한다

통합문서가 열리면서 관련된 문서를 같이 열리게 하고 싶다


엑셀은 시트와 시트등이 상호 참조하고
범위와 범위가 서로 참조하고 통합문서가 통합문서를 참조하기도 한다
Book1.xls라는 통합문서를 열때 항상 어떤 문서가 같이 열리게 하고 싶을때가
있을것이다
아래와 같이 Workbook_Open이벤트프로시져를 작성하면 편리하다

Private Sub Workbook_Open()
ThisWorkbook.FollowHyperlink ThisWorkbook.Path & "\Book2.xls"
ThisWorkbook.Activate
End Sub

통합문서의 FollowHyperlink메소드는 셀에 Hyperlink를 한것을 크릭한것이나
마찬가지 효과를 낸다

만약 Book1.xls라는 통합문서를 엑셀내에서 다른 이름으로 저장하지 않고
파일폴더내에서 복사하여 사본을 만들고 이름을 다른 이름으로 한다면
엑셀내에서 아무리 통제해도 헛일되지 않겠냐??
고 할수도 있겠다
엑셀밖의 일은 엑셀이 통제할수없다

그러나 방법은 있다

Private Sub Workbook_Open()
If ThisWorkbook.Name <> "Book1.xls" Then
   ThisWorkbook.Close
End If
End Sub

와 같이 하면 아무리 복사하여 다른 이름으로 하여도
열다가 지쳐버릴것이다

Shift키를 누르고 열면 열릴동안 코드가 실행되지 않는다

위와 같이 해도
도사앞에서는 헛일이 된다
Shift키를 누른 상태에서 화일을 열면 코드가 열리는 동안
실행되지 않기때문에 통제불가..활짝 열려 버린다
오래전에는 매크로 바이러스가 성행하여 쩔쩔매었는데
실은 그 당시에도 Shift키를 누른 상태에서 열면 통합문서를
열때 작동하게 만들어 놓은 코드가 무력화되어 바이러스에
먹히지 않았었다
아무튼 수상한 화일이다 싶을때는 Shift키를 누른 상태에서 열고
코드를 살펴본후 별 수작이 없어 보이면
안심하고 사용하면 되는것이다
아래의 구문을 붙여넣고 한번은 그냥 열어보시고
또 한번은 Shift키를 누르고 열어보시기 바란다

Private Sub Workbook_Open()
Worksheets.Add
Range(Cells(1, 1), Cells(10, 10)) = "x"
End Sub

물론 열고 난후에 다른 코드의 실행에는 영향이 없다
단지 열릴때만 영향을 줄수있는것이다