Получить индекс выбранного значения в раскрывающемся списке Excel

У меня есть выпадающий список, созданный в Excel из значения строки. Я хочу выбрать из этого раскрывающегося списка, получить индекс этого значения в раскрывающемся массиве, а затем использовать его для значения смещения, чтобы выбрать значение из другого столбца.

Я не могу найти простой способ получить индекс выбранного значения в раскрывающемся списке.

каждый ответ, который я нахожу, делает предположения о том, где генерируется массив, но здесь они генерируются различными наборами данных, которые может быть изменен в любое время.

12
задан user339389
02.01.2023 3:25 Количество просмотров материала 2692
Распечатать страницу

2 ответа

вам не нужно VBA, чтобы решить эту проблему.

  1. определите именованный диапазон в книге для списка, который вы используете для проверки (в моем случае у меня есть <5,>5 и >10 в ячейках A2,A3 & A4 на Леты обслуживания, поэтому названный ряд вызван Years_of_service.

  2. проверки в камере C1 использование определенного диапазона имен Years_of_service для списка.

  3. формула в ячейке D1 для работы out смещение или элемент, выбранный в списке =MATCH(C1,Years_of_service,0) .

Марк О'Рафферти

2
отвечен Mark O'Rafferty 2023-01-03 11:13

Обновлено

попробуйте вставить следующий VBA в "ThisWorkbook" (если вам нужна помощь с этим, спросите в комментарии):

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

несколько замечаний:

  • это предполагает, что ваш выпадающий список / ячейка называется "rngTest". Если нет, затем переименуйте его или измените его в этом коде на существующее имя.
  • строка 15 определяет точную ячейку, в которой будет выведен результат индекса. Вам нужно будет изменить лист и ячейку имена, соответствующие вашим собственным.

Я проверил это, и это работает, хотя я не могу взять полный кредит, поскольку исходный код был чем-то, что я нашел несколько месяцев назад. Если у вас возникли проблемы, иногда проще воспроизвести этот процесс на новом листе, пока вы не поймете, что это теория работы.

1
отвечен Robert Seal 2023-01-03 13:30

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх