배움터  
  HOME > 배움터 > 무료강좌
무료강좌
 
엑셀, 곽승주님의 오튜공구함 제작으로 배워보는 VBA 이야기, Excel
  

11. 숫자를 한글/한자/영어로 변환 -Ⅱ

이제 핵심함수가 마련되었으니 사용자정의폼을 만들어 보겠습니다. 폼은 다음과 같습니다.

사용법은 간답합니다. 위의 그림에서 보듯이 Number텍스트상자에 숫자를 입력하고 Language에서 문자를 선택하면 Preview에서 변환된 것을 볼 수 있습니다. 그리고 확인버튼을 클릭하면 현재 셀에 변환된 내용이 들어 갑니다. 그리고 취소를 클릭하면 아무 일도 발생하지 않습니다. 그리고 현재 셀에서 이 기능을 불러내면 현재셀의 숫자가 Number텍스트상자에 들어가도록 해야 겠죠!

다음은 위의 사용자정의 폼의 각 이벤트를 만들어 놓은 코드입니다.

frmToString
Option Explicit

Private Sub btnCancel_Click()
     Unload Me
End Sub

Private Sub btnOK_Click()
     ActiveCell.Value = Preview.Caption
     Unload Me
End Sub

Private Sub opHangul_Click()

End Sub

Private Sub opHanja_Click()

End Sub

Private Sub opEnglish_Click()
     Preview.Caption = ConvertCurrencyToEnglish(txtNumber.Text)
End Sub

Private Sub txtNumber_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
     Select Case KeyAscii
     Case vbKey0 To vbKey9
     Case 46
     Case Else
          KeyAscii = 0
     End Select
End Sub

Private Sub UserForm_Activate()
     Application.EnableCancelKey = xlDisabled
     If Application.WorksheetFunction.IsNumber(ActiveCell.Value) Then txtNumber.Text =
      ActiveCell.Value
     txtNumber.SetFocus
End Sub

Private Sub btnCancel_Click()
     Unload Me
End Sub
[취소]버튼을 클릭하면 그저 현재의 폼을 없애버립니다. 즉 메모리에서 제거합니다. 만일 메모리에서 제거하지 않고 단지 숨기는 것이라면 Me.Hide를 하면 되겠죠. 그리고 이를 다시 보이려면 Me.Show를 하면 됩니다.

Private Sub btnOK_Click()
     ActiveCell.Value = Preview.Caption
     Unload Me
End Sub
[확인]버튼을 클릭하면 미리 보기(Preview)의 내용(Caption)을 현재 셀에 입력하고 폼을 없앱니다.

Private Sub opEnglish_Click()
     Preview.Caption = ConvertCurrencyToEnglish(txtNumber.Text)
End Sub
Language의 문자옵션중 [영어]를 선택하면 텍스트상자의 내용(txtNumber.Text)을 이미 구한 Function ConvertCurrencyToEnglish(ByVal MyNumber)함수에 입력하고 그 결과를 받아 미리 보기(Preview)의 내용(Caption)에 입력합니다.

Private Sub txtNumber_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
     Select Case KeyAscii
     Case vbKey0 To vbKey9
     Case 46
     Case Else
          KeyAscii = 0
     End Select
End Sub
텍스트상자 콘트롤은 키보드로부터 값을 얻습니다. 그래서 _KeyPress이벤트가 가능한데 즉 텍스트상자 콘트롤에서 키보드를 누를 때마다 위의 이벤트가 발생합니다. 이때 누른 키 값을 매개변수로 전달받는데 그 변수가 바로 KeyAscii이죠. 그리고 이 값은 정수값입니다. 이 값을 해독하여 우리는 무슨 키가 눌려 졌는가를 알 수 있습니다. 여기에서는 숫자와 점만 입력받고 나머지 키는 무시해버려야 합니다. 그래서 Else이하에서는 KeyAscii변수값을 0으러 설정하여 숫자와 점이 아닌 문자가 텍스트상자 콘트롤에 입력되지 않도록 하고 있습니다.
VB/VBA에서는 자주 사용하는 여러 키 값을 내부상수로 미리 정의해 두었습니다. 
다음은 숫자 키 상수와 값입니다. 그 외 여러 가지 키가 있지만 생략합니다.

상수 설명
vbKey0 48 0키
vbKey1 49 1키
vbKey2 50 2키
vbKey3 51 3키
vbKey4 52 4키
vbKey5 53 5키
vbKey6 54 6키
vbKey7 55 7키
vbKey8 56 8키
vbKey9 57 9키

Private Sub UserForm_Activate()
     Application.EnableCancelKey = xlDisabled
     If Application.WorksheetFunction.IsNumber(ActiveCell.Value) Then
        txtNumber.Text =  ActiveCell.Value
    EndIF    
           txtNumber.SetFocus
End Sub

Application.EnableCancelKey = xlDisabled 이란 코드가 있는데 생소하신 분들이 계실 겁니다. 하나하나 뜯어 보면 살펴보도록 하죠. Application이란 것은 현재의 VBA 호스트 프로그램인 엑셀을 의미합니다. CancelKey라는 단어는 뭔가 취소하는 키라는 뜻 같죠. 맞습니다. 이것은 프로시져를 중단시키는 Ctrl+Break키(또는 Esc키)를 의미합니다. Application.EnableCancelKey는 프로시져의 흐름을 중단시킬 수 있는 Ctrl+Break키(또는 Esc키)를 처리하는 방법을 지정하는 것입니다. 다음은 Application.EnableCancelKey에 지정할 수 있는 상수값과 의미입니다.

상수 의미
xlDisabled  취소키를 사용할 수 없게 됩니다.
xlInterrupt  현재 프로시저를 중지하여 사용자가 프로시저를 디버깅하거나 끝낼 수 있도록 합니다.
xlErrorHandler 인터럽트가 실행 중인 프로시저에 오류로 전달되고 On Error GoTo 문을 사용하여 오류 처리기 설정으로 차단할 수 있습니다. 차단할 수 있는 오류 코드는 18번입니다.

엑셀의 도움말 예제

On Error GoTo handleCancel
Application.EnableCancelKey = xlErrorHandler
MsgBox "이 작업은 오래 걸릴 것입니다. 취소하려면 Esc키를 누르십시오."
For x = 1 To 1000000 '지정한 작업을 백만 번쯤(오랫동안) 실행합니다.
     '지정한 작업을 실행합니다.
Next x

handleCancel:
If Err = 18 Then
     MsgBox "사용자가 작업을 취소했습니다."
End If

위의 예제에서는 Application.EnableCancelKey키에 xlErrorHandler를 설정하여 사용자가 ESC키를 누르면 사용자가 만든 에러 핸들러로 이동하게 하였습니다. 그리고 이때 에러번호는 18번이 됩니다. 시간이 오래 걸리는 작업에 성미 급한 사용자를 배려하여 이러한 루틴을 전형적으로 사용합니다.

If Application.WorksheetFunction.IsNumber(ActiveCell.Value) Then 
     txtNumber.Text = ActiveCell.Value
End If
이 사용자폼은 기본적으로 현재 셀의 내용을 텍스트상자 컨트롤에 자동으로 입력하게끔 하고 있습니다. 그런데 그러다 보니 현재 셀의 내용이 숫자인가 아니면 문자인가를 파악해주어 숫자라면 텍스트상자 컨트롤에 자동으로 입력하지만 문자라면 무시해야 합니다. 이러한 판단은 엑셀의 워크시트 함수인 IsNumber()함수를 이용합니다. 엑셀의 워크시트함수에 접근하려면 Application.WorksheetFunction을 통해야 합니다.

오늘은 여기까지 입니다. 다음 시간엔 숫자를 한글로 변환하는 함수를 소개하겠습니다.

목차 | 이전 | 다음