2017-03-01 2 views
0

회사 데이터를 업데이트하기 위해 userform을 만듭니다. 내 양식의 첫 번째 컨트롤은 콤보 상자 (코드)이고 나머지는 텍스트 상자입니다. 이제 vlookup을 사용하여 첫 번째 컨트롤을 조회해야하고 나머지 텍스트 상자는 내 콤보 상자에 입력 한 코드로 자동 업데이트됩니다. 하지만 시스템에 오류 1004가 표시됩니다. 다음은 내 콤보 상자 코드 :VBA Excel 사용자 폼 오류 1004

Private Sub ComboBox_code_AfterUpdate() 
    'check if value exist 
    If WorksheetFunction.CountIf(Sheet1.Range("A:A"), Me.ComboBox_code.Value) = 0 Then 
     MsgBox "Incorrect Code" 
     Me.ComboBox_code.Value = "" 
     Exit Sub 

    End If 
'lookup value based on first combobox 
    With Me 
     .TextBox_outlet = Application.WorksheetFunction.VLookup((Me.ComboBox_code), Sheet1.Range("Code"), 2, 0) 
     .TextBox_invoice = Application.WorksheetFunction.VLookup((Me.ComboBox_code), Sheet1.Range("Code"), 3, 0) 
     .TextBox_sales = Application.WorksheetFunction.VLookup((Me.ComboBox_code), Sheet1.Range("Code"), 4, 0) 
     .TextBox_comm = Application.WorksheetFunction.VLookup((Me.ComboBox_code), Sheet1.Range("Code"), 5, 0) 
     .TextBox_gst = Application.WorksheetFunction.VLookup((Me.ComboBox_code), Sheet1.Range("Code"), 6, 0) 
     .TextBox_netsales = Application.WorksheetFunction.VLookup((Me.ComboBox_code), Sheet1.Range("Code"), 7, 0) 
    End With 
End Sub 

답변

0

ComboBox.Value 선택한 인덱스를 제공하지만, 당신은 또한 사용자에 의해 실제 콤보 상자 값 선택을 테스트해야 .List(.ListIndex)

Private Sub ComboBox_code_AfterUpdate() 
    Dim c As Range 
    Set c = Sheet1.Range("Code").Resize(, 1).Find(Me.ComboBox_code.List(Me.ComboBox_code.ListIndex), , , xlWhole) 

    If c Is Nothing Then 
     MsgBox "Incorrect Code" 
     Me.ComboBox_code.ListIndex = -1 
    Else 
     Me.TextBox_outlet.Text = c(, 2) 
     Me.TextBox_invoice.Text = c(, 3) 
     Me.TextBox_sales.Text = c(, 4) 
     Me.TextBox_comm.Text = c(, 5) 
     Me.TextBox_gst.Text = c(, 6) 
     Me.TextBox_netsales.Text = c(, 7) 
    End If 
End Sub 
+0

OMG !!! 정말 고맙습니다!! – Janice

0

선택한 항목을 얻을 수 있습니다

Select Case 블록 적절할 수 :

Private Sub ComboBox_code_AfterUpdate() 
    Dim codeRow As Long 
    Dim codeRng As Range 

    Set codeRng = Sheet1.Range("Code") 
    With Me 
     Select Case True 

      'check if user selected a value 
      Case .ComboBox_code.ListIndex = -1 
       MsgBox "No Code selected!", vbCritical 
       .ComboBox_code.Value = "" 

      'check if value exist 
      Case WorksheetFunction.CountIf(codeRng.Resize(, 1), .ComboBox_code.Value) = 0 
       MsgBox "Incorrect Code", vbCritical 
       .ComboBox_code.Value = "" 

      Case Else 
       codeRow = WorksheetFunction.Match(.ComboBox_code.Value, Sheet1.Range("Code"), 0) 'lookup value based on first combobox 
       .TextBox_outlet = codeRng.cells(codeRow, 2) 
       .TextBox_invoice = codeRng.cells(codeRow, 3) 
       .TextBox_sales = codeRng.cells(codeRow, 4) 
       .TextBox_comm = codeRng.cells(codeRow, 5) 
       .TextBox_gst = codeRng.cells(codeRow, 6) 
       .TextBox_netsales = codeRng.cells(codeRow, 7) 
     End Select 
    End With 
End Sub 

마지막으로 ComboBox_code_AfterUpdate() 대신 ComboBox_code_Change() 이벤트 처리기를 사용할 수도 있습니다. 이전의 경우 모든 콤보 박스 변경 (예 : 선택) 콤보 박스가 더 이상 활성 컨트롤이 아닌 경우에만 후자가 실행됩니다. 즉 사용자가 컨트롤을 벗어날 때까지 기다려야합니다.

+0

@Janice, 너 끝냈 니? – user3598756

+0

@Janice, 의견이 있으십니까? – user3598756

관련 문제