2017-03-01 7 views
0

Ich erstelle ein Benutzerformular, um Firmendaten zu aktualisieren. Das erste Steuerelement in meinem Formular ist ein Kombinationsfeld (Code) und der Rest ist Textfeld. Jetzt muss ich vlookup verwenden, um mein erstes Steuerelement zu suchen, und der Rest des Textfelds wird automatisch mit dem Code aktualisiert, den ich in meinem Kombinationsfeld eingebe. Aber das System zeigt Fehler 1004. Kann mir jemand dabei helfen? Im Folgenden finden Sie Code Kombinationsfeld:VBA Excel UserForm Fehler 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 

Antwort

0

ComboBox.Value den gewählten Index gibt, aber Sie können das ausgewählte Element mit .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 !!! Ich danke dir sehr!! – Janice

0

Sie sollten auch für tatsächliche Combobox Wertauswahl durch den Benutzer testen, erhalten

ein Select Case Block könnte geeignet sein:

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 

Schließlich möchten Sie möglicherweise auch den Ereignishandler ComboBox_code_Change() anstelle von ComboBox_code_AfterUpdate() verwenden: Erstere würde bei jeder Änderung der Combobox (d. H. Auswahl), während letzteres nur einmal auslösen würde, wenn die Combobox nicht mehr die aktive Kontrolle ist, d. h. Sie müssen warten, bis der Benutzer die Kontrolle verlässt

+0

@ Janice, hast du es geschafft? – user3598756

+0

@ Janice, jede Chance, Feedback von Ihnen zu bekommen? – user3598756