※ 아래 Daily Tip은
곽승주님이 제공해주신 내용입니다
뭔가를 열심히 입력하고 ListBox에 채우는 경우가
있었습니다. 채우는 것은 별 문제가 아닌데 목록이 중복되지 않도록 하는 것이 생각해봐야 할
문제였습니다.
그걸 가지고 무슨 생각을 해? 그냥
CommandButton을 클릭하면 ListBox의 항목을 죄다 꺼내놓고 입력하려는
항목과 같은 가를 비교해서, 같은 것이 없으면 추가하고 같은 넘이 있으면 ‘실례했습니다’ 하고 빠져
나오면 될텐데… 아래의 코드처럼 말이죠.
Private Sub
CommandButton1_Click()
Dim i As Long For i = 0
To ListBox1.ListCount - 1
If ListBox1.List(i) = "입력할 내용" Then
...
End If
Next
...
End Sub |
그러나 웬지 이 방법이 마음에 들지 않습니다. 목록이 많을 수록
그에 비례하여 입력처리 하나 하는데 시간이 많이 걸리수도 있다는 사소한 이유도 그렇고…날씨가 춥기도
하고…
그래서 생각한 것이 에러를 이용하는 방법입니다(애로가 아닙니다)
런-타임 에러가 날 수 있는 코드를 실행해보고 에러 발생 여부에 따라 처리하는 것입니다.
ListBox의
Text속성이 여기에 이용됩니다. ListBox의 Text속성에 ListBox 항목에 있는 데이터를
입력하면 해당하는 항목을 찾아 하일라이트 시켜 찾아 줍니다.
그러나 ListBox의 Text속성에 ListBox 항목에 없는
데이터를 입력하면 Text속성을 설정할수 없다는 에러(308)가 발생합니다.
그래서 새로운 항목을 Text속성에 입력하는 경우 에러가
발생하게 됩니다. 그러면 이를 에러핸들러로 돌리고 ListBox의 AddItem메소드를
사용하여 새로운 항목을 입력하는 것이죠.
만일 이미 있는 항목을 Text속성에 입력하는 경우 에러가
발생하질 않을 겁니다. 이때에는 사용자에게 중복된 항목을 입력하려 했다는 메시지를 날리고 프로시져를
빠져 나오면 됩니다.
이렇게 처리하다 보니 부수적인 효과를 하나 얻게 됩니다.
ListBox에서 중복된 항목을 찾아서 사용자에게 보여줄 수 있다는 점이죠.
아래의 코드는 위에서 설명한 것을 코딩으로 옮긴 것입니다. 아니
거꾸로 얘기했군요. 사실은 아래의 코드를 만들고 나서 위의 설명을 달아 놓은 것이죠. 아무튼
Private Sub
CommandButton1_Click()
On Error GoTo ErrHandler ListBox1.Text
= TextBox1.Text
If Err.Number = 0 Then
MsgBox "중복된 항목입니다"
End If
Exit Sub
ErrHandler:
Select Case Err.Number
Case 380
ListBox1.AddItem TextBox1.Text
End Select
Err.Clear
End Sub |
위의 코드에서 굵게
표시한 부분은 중요한 요점인데, ListBox의Text속성에 입력한 내용(TextBox1.Text)을
입력해봅니다. 그래서 에러가 없다면(Err.Number=0) 이미 항목이 있다는 의미이죠(이때
ListBox는 이를 찾아내 하일라이트 시켜둔 상태) 따라서 중복되었다는 메시지를 사용자에게
뿌립니다.
그러나 에러가 나는 경우 미리 만들어 놓은 에러로 가는 길(ErrHandler:)로
프로세스를 인도하여 380번 에러이면 ListBox의 AddItem메소드를 이용하여 추가합니다.
|