Abrufen des Index des ausgewählten Werts in der Excel-Dropdown-Liste

1

Ich habe eine Dropdown-Liste in Excel aus Zeilenwerten generiert. Ich möchte aus dieser Dropdown-Liste auswählen, den Index dieses Werts im Dropdown-Array abrufen und diesen dann für einen Versatzwert verwenden, um den Wert aus einer anderen Spalte auszuwählen.

Ich kann anscheinend keinen einfachen Weg finden, um den Index des ausgewählten Werts in der Dropdown-Liste abzurufen.

Bei jeder Antwort, die ich finde, werden Annahmen darüber getroffen, wo das Array generiert wird. Hier werden sie jedoch von verschiedenen Datensätzen generiert, die jederzeit geändert werden können.

user339389
quelle

Antworten:

2

Sie benötigen kein VBA, um dies zu beheben.

  1. Definieren Sie einen benannten Bereich in der Arbeitsmappe für die Liste , die Sie für die Validierung verwenden (In meinem Fall habe ich <5, >5und >10in Zellen A2, A3und A4für Dienstjahre, so dass der benannte Bereich genannt wird Years_of_service.

  2. Die Validierung erfolgt in der Zelle unter C1Verwendung des definierten Namensbereichs Years_of_servicefür die Liste.

  3. Formel in Zelle D1, um den Versatz oder das in der Liste ausgewählte Element zu ermitteln =MATCH(C1,Years_of_service,0).

Mark O'Rafferty

Mark O'Rafferty
quelle
1

Aktualisierte

Versuchen Sie, die folgende VBA in "ThisWorkbook" einzufügen (Wenn Sie dabei Hilfe benötigen, fragen Sie im Kommentar nach):

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim ValidationIndex As Long
Dim rngTest As Excel.Range

'assumes the data validation is in a cell named "rngTest"
On Error Resume Next
Set rngTest = Sh.Range("rngTest")
If rngTest Is Nothing Then
    Exit Sub
End If
On Error GoTo 0

If Not Intersect(ActiveCell, Sh.Range("rngTest")) Is Nothing Then
    ValidationIndex = GetValidationIndex
    Sheets("Sheet1").Range("E2").Value = ValidationIndex
End If
End Sub

Function GetValidationIndex() As Long
'returns a 1-based index
Dim rngTest As Excel.Range
Dim varValidationString As Variant
Dim ErrNumber As Long
Dim i As Long

With ActiveCell.Validation
    If .Type = xlValidateList Then    '3
        On Error Resume Next
        Set rngTest = ActiveCell.Parent.Range(.Formula1)
        'I do this goofy thing with ErrNumber to keep my indenting and flow pretty
        ErrNumber = Err.Number
        On Error GoTo 0
        'if the Validation is defined as a range
        If ErrNumber = 0 Then
            GetValidationIndex = Application.WorksheetFunction.Match(ActiveCell.Value2, rngTest, 0)
            Exit Function
        'if the validation is defined by comma-separated values
        Else
            varValidationString = Split(.Formula1, ",")
            For i = LBound(varValidationString) To UBound(varValidationString)
                If varValidationString(i) = ActiveCell.Value2 Then
                    GetValidationIndex = i + 1
                    Exit Function
                End If
            Next i
        End If
    End If
End With
End Function

Ein paar Anmerkungen:

  • Dies setzt voraus, dass Ihre Dropdown-Box / Zelle "rngTest" heißt. Wenn nicht, benennen Sie ihn um oder ändern Sie ihn im gesamten Code in den vorhandenen Namen.
  • Zeile 15 definiert die genaue Zelle, in der das Indexergebnis ausgegeben wird. Sie müssen die Blatt- und Zellennamen so ändern, dass sie mit Ihren eigenen übereinstimmen.

Ich habe dies getestet und es funktioniert, obwohl ich nicht die volle Punktzahl annehmen kann, da der ursprüngliche Code etwas war, das ich vor Monaten gefunden habe. Wenn Sie Probleme haben, ist es manchmal einfacher, diesen Prozess in einem neuen Arbeitsblatt zu replizieren, bis Sie die Funktionsweise verstanden haben.

Robert Seal
quelle
Vielen Dank, Robert. Eigentlich möchte ich den Index mit einigen Daten kombinieren und in einer anderen Zelle anzeigen, daher glaube ich nicht, dass eine msgbox funktioniert. Klingt es so, als ob die einzige Option, die ich habe, darin besteht, dies in eine Combobox umzuwandeln?
user339389
Der Code wurde für Sie aktualisiert und wird nun in eine Zelle ausgegeben, die Sie dann verwenden können, wie Sie möchten.
Robert Seal