If you are looking for a data validation list index, this is what I would do:
Put the following code in the ThisWorkbook module:
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 MsgBox ValidationIndex End If End Sub
Put this function in the ThisWorkbook module as well or in any regular module:
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
source share