배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   Excel 버전:   공통
검색어:   리스트박스
제목:   중복되지 않도록 리스트박스 채우기
     
 

New Page 2
  STEP> 따라하기


※ 아래 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메소드를 이용하여 추가합니다.