2014-04-20 3 views
3

나는이 포럼에서 처음으로 사용자입니다. 여기에 내 시나리오가있다 : 사용자 폼에, 나는 콤보 박스, 두 개의 텍스트 박스와 'OK'버튼을 가지고있다. 사용자가 콤보 상자의 드롭 다운 목록에서 선택하면 콤보 상자의 변경 이벤트가 트리거되고 이벤트 처리 코드는 사용자 선택에 따라 워크 시트의 정보로 텍스트 상자를 채 웁니다. 그런 다음 사용자는 텍스트 상자 중 하나 또는 둘 다에있는 정보를 편집 할 수 있습니다. 그런 다음 사용자는 'OK'를 누릅니다. OK 단추의 click 이벤트는 텍스트 상자의 수정 된 정보를 다시 워크 시트의 셀에 씁니다. 꽤 솔직하게 보입니다. 여기 내 문제 : 콤보 상자의 변경 이벤트는 해당 속성을 참조 할 때마다 트리거 할 것으로 보입니다. 특히 콤보 상자의 ListIndex 속성이 참조되는 아래의 cb_CustomersUpdateOK_Click() 서브 루틴의 세 인스턴스입니다. Change 이벤트 코드에 Msgbox를 배치하여 이벤트가 트리거 된시기를 나타냅니다. 확인 클릭 이벤트 코드에서 세 개의 할당 문에서 중단 점을 사용하면 세 문에서 각기 다른 시점에 콤보 상자가 표시됩니다 (Msgbox가 표시됨). 트리거가 발생하면 텍스트 상자의 편집 정보를 콤보 상자 선택의 초기 데이터로 덮어 씁니다. (1) 콤보 박스 변경 이벤트가 왜 그런 식으로 실행 되는가? (2) 이것이 일어나지 않도록 내가 무엇을해야 하는가?(Excel VBA) 콤보 상자 변경 이벤트가 해당 속성 중 하나가 반환 될 때마다 트리거되는 이유는 무엇입니까?

나는 지난 몇 시간 동안 이것을 연구 해왔고, 나는별로 유용한 것을 발견하지 못했다. 어떤 도움이라도 대단히 감사하겠습니다. 더 많은 정보가 필요하면 알려주십시오.

Private Sub combo_CustomersUpdateLastName_Change() 

    MsgBox "combobox changed"  'For debug purposes 

    With Sheets("Customers") 
     tb_CustomersUpdateFirstName.Value = .Cells(combo_CustomersUpdateLastName.ListIndex + 2, 2).Value 
     tb_CustomersUpdatePhone.Value = .Cells(combo_CustomersUpdateLastName.ListIndex + 2, 3).Value 
    End With 

End Sub 

... 

Private Sub cb_CustomersUpdateOK_Click() 

    'Copy the updated customer data from the controls to the Customers sheet 
    With Sheets("Customers") 
     .Cells(combo_CustomersUpdateLastName.ListIndex + 2, 1).Value = combo_CustomersUpdateLastName.Value 
     .Cells(combo_CustomersUpdateLastName.ListIndex + 2, 2).Value = tb_CustomersUpdateFirstName.Value 
     .Cells(combo_CustomersUpdateLastName.ListIndex + 2, 3).Value = tb_CustomersUpdatePhone.Value 

     'Sort the customer data in case the last name or first name was updated 
     Range("CustomerInfo").Sort Key1:=.Columns("A"), Key2:=.Columns("B") 
    End With 

    MsgBox "Customer data updated." 

    Unload form_CustomersUpdate 

End Sub 

답변

3

콤보 박스 항목의 출처는 무엇입니까? 범위에 링크되어 있으면 워크 시트에 쓰면 연결된 소스가 변경되므로 콤보 상자 자체가 새로 고쳐 지므로 변경 이벤트가 트리거됩니다.

이 문제가 발생하지 않으려면 범위의 값을 배열에 '캐시'하고 combox를 채워야합니다.

+0

정확히 무슨 일이 있었는지, 솔루션 코딩은 간단했습니다. 좋은 캐치 !! – BillD

+0

도움이 되니 기쁩니다. 나는 사건을 proccing하고있는 이벤트와 같은 종류의 물건을 항상 proccing하고있다. –