Keeping Datas Alive
어디엔가 정보를 보관하고 싶은데..
- Application Object
- VBA.SaveSetting
- VBA.GetSetting
- VBA.DeleteSetting
소루션을 만들때 아주 중요한 것 중의 하나는
사용자가 설정한 어떤 정보를 어딘가에 저장하여
사용자가 화일을 열때마다 자기가 정해놓은 방법으로
화일이 행동하기를 바랄수 있을 것이다
대개의 경우 적절한 시트를 한장 그런 정보를 담아 놓는
장소로 사용할수 있을것이다
모듈시트의 코드상의 변수는 임시적 정보보관소이므로
화일을 닫았다가 열면 모두 달아난다
아래와 같이 사용자가 사용자옵션을 설정해 놓게 했다고 치면..
새로운 시트를 삽입할때 마다
통합문서의 NewSheet 이벤트프로시져를 활용하여
Private Sub Workbook_NewSheet(ByVal Sh As Object)
...하고 싶은 일을 이곳에서 시킨다
End Sub
그리드라인을 없에거나
회사로고를 그려 넣거나 하게 할수 있을 것이다
그런데 그리드라인을 없앨것인지
회사로고를 그릴것인지 어디엔가 표시를 해두어야
읽어오던가 말던가 할수 있을텐데..어디에서 표시를 해두냐는 이야기다
모듈시트에 전역변수로 한다고 해도 화일닫았다 열면 모두
날아가고..
숨겨진 시트를 하나 만들어서 셀에 표시를 해두고
이시트를 읽어서 처리하면 될텐데..
이것도 불안하다..
사용자는 워낙 하지 말라는 짓만 골라서 한다고 생각을 하는 것이 좋다
그러니 "이건 뭔 시트야..필요없잖아..삭제!!!"해버리면
말짱 헛일이다..
그럼 어디에 저장을 해두면 안전할까..
아래와 같이 [별도의 화일]에 저장해 보자
아래와 같이 순서대로 만들어 보시기 바란다
모듈시트를 한장 삽입하고 이름을 basMain이라고 짓고 아래와 같이 작성하자
Public Const HIDDEN_FILE As String = "hidden.qqq"
Public Const HIDDEN_SHT As String = "HiddenSheet"
Public Const GRIDLINE_C As String = "gridLine"
Public Const LOGO_C As String = "logo"
Sub showForm()
UserForm1.Show
End Sub
UserForm은 위의 그림과 같이 만들어 넣고
UserForm의 초기화이벤트프로시져에 아래와 같이 작성한다
Private Sub UserForm_Initialize()
Dim oHiddenBook As Workbook
Dim sFile As String
Application.ScreenUpdating = False
sFile = ThisWorkbook.Path & "\" & HIDDEN_FILE
If Dir(ThisWorkbook.Path & "\" & HIDDEN_FILE) = "" Then
Set oHiddenBook = Workbooks.Add
With oHiddenBook.ActiveSheet
.Name = "HiddenSheet"
.Range("A1").Value = basMain.GRIDLINE_C
.Range("A2").Value = basMain.LOGO_C
With .Range("B1")
.Name = basMain.GRIDLINE_C
.Value = False
End With
With .Range("B2")
.Name = basMain.LOGO_C
.Value = False
End With
.Visible = xlVeryHidden
End With
Else
Set oHiddenBook = Workbooks.Open(sFile)
With oHiddenBook.Worksheets("HiddenSheet")
Me.chkGridLine = .Range(basMain.GRIDLINE_C)
Me.chkLogo = .Range(basMain.LOGO_C)
End With
End If
oHiddenBook.Close savechanges:=True, Filename:=sFile
Application.ScreenUpdating = True
End Sub
그리고 시트에 버튼을 하나 달고 basMain모듈시트의
showForm을 실행시키도록 하여
실행하면 나타나는 UserForm에서 그리드라인을 없애고 싶은지
로고를 삽입하고 싶은지를 체크하고 확인 버튼을
크릭하면 [별도의 화일]이 만들어질것이다
사용자정의 폼을 여는 버튼은 크릭한다
사용자정의 폼이 열린다
열리면서 폼의 초기화이벤트에서 별도의 숨겨진 화일이
존재하는지 확인한다
없으면 엑셀화일을 하나만든다
이때 화일명을 XLS확장자 대신에 적당한 아무이름의 확장자를
붙인다..위에서는 hidden.ggg 라는 이름 ggg라는 확장자를 붙였다
대개가 이렇게 하여 화일을 열지 못하게 한다
뭔가 대단한 Binary화일정도 되는지 알고 열어보려고 하지 않는다
하나의 꼼수다
그런데 엑셀을 좀 아는 사람은 다 열어 볼수 있다
아무튼 별것도 아니다
그렇게 하여 별도의 시트에 두개의 체크박스의 값을 담을
셀을 지정하고 이름을 붙이고 그곳에 체크박스의 값을 저장한다
그러면 폼을 열때마다 이 별도의 화일을 확인하고 그곳에 기록된
체크박스값을 폼상의 체크박스에 표시하게 되는 것이다
아무튼 어디엔가 값을 저장하는 수단으로 별도의 화일을 만들어서
활용한다는 이야기다
그러면 이 별도의 화일의 값을 어디에서 또 읽냐하면
통합문서의 Workbook_NewSheet 이벤트프로시져(새로운 시트를 삽입할때
마다 발생하는 이벤트)에 아래와 같이 작성한다
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Dim bLogo As Boolean
Dim bGridLine As Boolean
Dim oBook As Workbook
Application.ScreenUpdating = False
Set oBook = Workbooks.Open(ThisWorkbook.Path & _
"\" & basMain.HIDDEN_FILE)
With oBook.Worksheets(basMain.HIDDEN_SHT)
bLogo = .Range("logo")
bGridLine = .Range("gridLine")
End With
oBook.Close
If bLogo Then
With Sh.Range("A1")
.Value = "MY COMPANY LOGO HERE!"
.Font.Name = "Tahoma"
.Font.Size = 24
End With
End If
ActiveWindow.DisplayGridlines = Not bGridLine
Application.ScreenUpdating = True
End Sub
위의 내용은 역시 마찬가지로 숨겨진 화일을 열고
두개의 체크박스값을 기록한 값을 읽어서
시트가 삽입될때 그리드라인을 없애거나
시트가 삽입될때 회사로고를 그리거나 한다는 소리다
지금 진행하는 것은 별것도 아닌것인데 다양한 기능을 포함하고 있으니
예를 들어 어떤 정보를 여러곳에서 참조하여야 하니
일반모듈시트에 상수값으로 표현하기도 하고
이벤트프로시져..사용자정의폼..별도의 화일생성..저장..열고..읽고..닫고..
읽은 내용을 또 실행..
꼭..직접 입력하고 실행해보시기 바란다
157_1.
위의 방법은 유치한 방법이니 다음 방법을 또 생각해 보자
이번에는 아래의 프로시져를 실행해보시기 바란다
Sub saveDataOnID()
Worksheets.Add.Range("A1").ID = "YNYNNNNNNNNYYNNNYNY"
MsgBox Range("A1").ID
End Sub
시트가 삽입되고 A1셀에 정보가 저장되기는 되었는데
A1셀상에는 아무것도 없다..
그냥 메모리상에 숨어있고..
ID라는 속성값에 정보를 숨겨놓은 것이니..아무도 모른다
아하..이것을 활용하면 좋겠네..
아니다..화일을 닫았다가 다시 열면 이 정보는 사라진다
그러니 ID속성은 프로그래밍할때 임시 저장장치로 사용하면
좋다..
앞전에서 하였던 Tetris에서 잘 써먹지 않았는가??
여기에서는 다른 방법을 찾아보아야 한다
에이..이렇게 한번 해볼까??!!
아래를 실행시켜보시면..
Sub hideDateInShapeName()
Dim shpX As Shape
Dim shtX As Worksheet
Set shtX = ActiveSheet
Set shpX = shtX.Shapes.AddShape(msoShapeRectangle, 0, 0, 0, 0)
shpX.Name = "shpX"
shpX.TextFrame.Characters.Text = "YNYNYNYNYN"
MsgBox shpX.TextFrame.Characters.Text
End Sub
다시 실행하면 에러가 나겠지??
같은 이름의 도형을 또만들면 에러가 당연히 난다..
이미 만들어진 도형을 찾아서 읽어야지!!
프로그래밍에서 가장 중요한 개념이다..
정보를 읽어 오기 위하여 정보를 만들기 위하여
항상 사전 점검!!!필수적인데 초보님들은 이것이 자동적으로
생각나지 않는다
사전점검..사전 준비작업!!
먹어도 될지..먹지 말아야 할지..확인후 처리가 필수다
그러니 프로그래밍을 잘하면 인생도 평화로와진다
물론 생각과 철학을 갖고 한다면..
도형을 만들어 넣고 도형에 필요한 정보를 저장하는 장치로 사용하고
숨기고..
또한 중요한 것은 이 도형이 들어있는 시트를 삭제를
못하게 하고..어떤 이벤트프로시져를 활용하면 좋을까??
이 시트는 삭제하면..안되요!!!
뭐 그런 장치를 어딘가에 하면 그래도 안전하게 도형을 보관하고
존재하고 있을 것이다
157_2.
다음 시간에는 또 다른 비교적 안전한곳에 저장해 보도록 하자
윈도우 시스템의 데이타베이스를 활용해 보도록 한다
RegEdit.exe를 실행하면 열리는 리지스터리DB의 한 구석을
사용하면 될것이다
위에서 한 두가지의 번거로운 짓은 정말 유치한 짓임을
알수 있게 될 것이다
VBA.SaveSetting
VBA.GetSetting
VBA.DeleteSetting
등을 사용하여 아래와 같은 별도의 창고를 하나 사용할줄 알면 된다
157_3.