2013년 1월 28일 월요일

Excel에서 HTS DDE 활용하기 2 - 단순 스케줄링

※ Elliott Pattern Helper Add In
  • Download Add In for Excel 2007 
  • Download Add In for Excel 2003 

  지난 글에 이어 'Excel에서 HTS DDE 활용하기'의 두 번째 주제로 쉽게 구현할 수 있는 스케줄링(scheduling) 기능을 하나 구현해 보도록 하겠습니다. 

  현재가나 거래량 또는 체결량 등 DDE Item의 값을 수신하는 셀(cell)을 DDE client cell(DDE 셀)이라고 정의했습니다. 지난 시간에는 이들 DDE 셀의 change 이벤트 처리 매크로를 'Start' 버튼과 'Stop' 버튼으로 제어하게끔 했었는데, 이를 조금 수정하여 사용자가 '사용자 정의 폼(UserForm)'을 통해 지정한 시간에 실행 또는 중지되도록 하겠습니다.

   시나리오는 단순합니다.
  1. 사용자가 'Schedule' 버튼을 클릭합니다.
  2. 시작 시간과 종료 시간을 지정할 수 있도록 '사용자 정의 폼'(이하 'Form')이 팝업되면, 사용자는 시작 및 종료 시간을 각각 지정한 후 Form을 닫습니다.
  3. 지정된 시간에 매크로가 시작되어 DDE 셀 change 이벤트를 처리합니다. 정해진 시간이 되면 매크로의 실행은 중지됩니다.
  지난 글을 통해 만들어진 파일을 그대로 사용하도록 하겠습니다. 우선 Form을 팝업시키기 위한 'Schedule' 버튼을 시트 위에 만듭니다. 그림 1과 같이 '개발 도구' → '삽입' → '단추'를 클릭한 후 Stop 버튼 밑의 적절한 위치에 버튼을 위치시킵니다.

그림 1. 스케줄링 버튼 추가

  생성된 버튼의 매크로 지정 창에서 매크로 이름을 'Scheduling_Click'으로 한 후 '새로만들기' 버튼을 눌러 VBA 편집창이 뜨면 아래 그림과 같이 입력합니다.

그림 2. 버튼 이벤트 처리 매크로

  ※ (소스)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Scheduling_Click()
    Call showSchedulingForm()
End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''  

  ☞ 소스에서 알 수 있듯이 'Scheduling_Click' 매크로는 Form을 호출하는 기능만 합니다. 

  이제 간단하게 '사용자 정의 폼'을  만들어 보겠습니다. 아래 그림과 같이 VBAProject 트리 목록에서 현재 작업 중인 파일의 Context 메뉴 → '삽입' → '사용자 정의 폼'를 선택하여 폼을 생성합니다.

그림 3-1. 사용자 정의 폼 만들기 1

  그림 3-2와 같이 Form의 이름을 'FSchedule'로 지정합니다. Caption은 원하는 대로 변경하시면 됩니다.

그림 3-2. 사용자 정의 폼 만들기 2

  도구상자의 '다중 페이지'를 선택(그림 3-3의 1)하고,  Form 위에 적당히 위치시킵니다(그림 3-3의 2). ☞ 이번 글을 위해 굳이 다중 페이지를 사용할 필요는 없지만, 다음 글을 염두에 두고 있기 때문입니다.

그림 3-3. 사용자 정의 폼 만들기 3

 도구상자의 레이블 버튼(그림 3-4의 1)을 선택하고 Form 위에 레이블을 만든 후 텍스트를 적절하게 수정합니다(그림 3-4의 2).

그림 3-4. 사용자 정의 폼 만들기 4

  도구상자의 콤보 상자를 선택(그림 3-5의 1)하고, Form 위에 적절한 크기로 만든 다음(그림 3-5의 2) 콤보 상자의 이름을 'ComboBoxTS'로 수정합니다(그림 3-5의 3).

그림 3-5. 사용자 정의 폼 만들기 5

  동일한 방법으로 콤보 상자 'ComboBoxTE'를 만듭니다. 

그림 3-6. 사용자 정의 폼 만들기 6

  이제는 'OK' 및 'Cancel' 버튼을 만들 차례입니다. 그림 3-7의 1~4 과정을 통해 명령 단추 'ButtonOK'를 만들고 Caption은 적절히 수정합니다.

그림 3-7. 사용자 정의 폼 만들기 7

  마찬가지 방법으로 'ButtonCancel'을 추가합니다.

그림 3-8. 사용자 정의 폼 만들기 8

  다음 그림 3-9와 같이 Form 위 다중 페이지의  Caption을 적절히 수정합니다.

그림 3-9. 사용자 정의 폼 만들기 9

  Form 위의 'Cancel' 버튼을 더블클릭하면 VBA 편집창은 아래 그림과 같이 버튼 이벤트 처리 매크로를 입력할 수 있도록 소스 수정 모드로 바뀝니다. 'ButtonCancel_Click' sub모듈을 하단의 소스를 복사하여 그림과 같이 입력합니다.

그림 3-10. 사용자 정의 폼 만들기 10

  ※ (소스)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub ButtonCancel_Click()
    Unload Me
End Sub


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  ☞ Cancel 버튼은 소스와 같이 단순히 Form을 닫는 역할만 합니다.

  'OK' 버튼 처리 매크로를 입력하기 전에 Form 초기화 매크로를 작성하겠습니다. 하단의 소스를 복사하여 그림과 같이 채워 넣습니다. 이 매크로는 스케줄 시작과 종료 시각을 지정하는  두 개의 콤보 상자(ComboBoxTS, ComboBoxTE)를 사용자가 선택할 수 있도록 몇 개의 시각으로 초기화 합니다.


그림 3-11. 사용자 정의 폼 만들기 11

  ※ (소스)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub UserForm_Initialize()
    ComboBoxTS.AddItem "09:00:00"
    ComboBoxTS.AddItem "10:00:00"
    ComboBoxTS.AddItem "11:00:00"
    ComboBoxTS.AddItem "12:00:00"
    ComboBoxTS.AddItem "13:00:00"
    ComboBoxTS.AddItem "14:00:00"
    ComboBoxTS.AddItem "15:00:00"
    ComboBoxTS.Text = "09:00:00"
  
    ComboBoxTE.AddItem "09:00:00"
    ComboBoxTE.AddItem "10:00:00"
    ComboBoxTE.AddItem "11:00:00"
    ComboBoxTE.AddItem "12:00:00"
    ComboBoxTE.AddItem "13:00:00"
    ComboBoxTE.AddItem "14:00:00"
    ComboBoxTE.AddItem "15:00:00"
    ComboBoxTE.Text = "15:00:00"
End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

  VBAProject 트리 목록을 통해 FScheduleContext 메뉴 → '개체 보기'를 선택합니다.

그림 3-12. 사용자 정의 폼 만들기 12

  폼 개체 편집 창에서 'OK' 버튼을 더블클릭하여 버튼 이벤트 처리 매크로를 입력할 수 있도록 합니다.

그림 3-13. 사용자 정의 폼 만들기 13

  하단의 소스를 복사하여 그림과 같이 입력합니다.

그림 3-14. 사용자 정의 폼 만들기 14

  ※ (소스)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub ButtonOK_Click()
    Call onSchedule(ComboBoxTS.Text, ComboBoxTE.Text)
    Me.Hide
End Sub


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''  
  ☞ 위 소스에서 알 수 있듯이 'OK' 버튼을 클릭하면 'onSchedule' sub모듈이 호출됩니다. 

  이로서 '사용자 정의 폼' FSchedule의 작성은 모두 완료되었습니다. 이제 남은 작업은 'Schedule' 버튼 이벤트가 호출하는 'showSchedulingForm' 모듈과 'FSchedule' 폼의 'OK' 버튼 이벤트가 호출하는 'onSchedule' 모듈을 작성하는 것입니다. 

  하단의 소스를 복사하여 그림과 같이 입력합니다.

그림 4. 'showSchedulingForm' sub모듈 작성

  ※ (소스)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub showSchedulingForm()
    Dim frm As FSchedule
   
    Set frm = New FSchedule
    Load frm
    frm.Show
End Sub


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''  

  마지막으로 그림 5와 같이 'onSchedule' 모듈을 완성합니다.

그림 5. 'onSchedule' sub모듈 작성

  ※ (소스)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub onSchedule(ts, te)
    If Time > TimeValue(ts) And Time < TimeValue(te) Then
        Application.OnTime Now, "Start_Click"
    Else
        Application.OnTime TimeValue(ts), "Start_Click"
    End If
    Application.OnTime TimeValue(te), "Stop_Click"
End Sub


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''  
  ☞ 위 'onSchedule' 모듈은 사용자가 지정한 시작 시각 'ts'와 종료 시각 'te'에 지난 글에서 작성한 'Start_Click' 매크로와 'Stop_Click' 매크로를 각각 호출하는 기능을 합니다.
 
  이 글의 시작 부분에서 생성한 버튼의 이름을 적절히 수정하여 모든 작업을 완료합니다. 

  이제 마지막으로 테스트를 해 볼까요? 그림 6-1처럼 스케줄 시각을 지정한 후, 그림 6-2와 6-3과 같이 지정된 시각에 계획된 작업이 실행되는 것을 확인할 수 있었습니다.  

그림 6-1. 테스트 1
그림 6-2. 테스트 2

그림 6-3. 테스트 3


댓글 1개:

  1. 요기까지 따라했습니다. 잘 배웠습니다. 감사합니다.

    답글삭제