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

#excel #vba #dropdown

#excel #vba #выпадающий список

Вопрос:

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

  • AAA
  • BBB
  • CCC
  • DDD

Это значения, связанные с моим выпадающим списком. Категория Значение категории

  • AAA 1
  • BBB 2
  • CCC 3
  • DDD 4

Я добавил код VBA для множественного выбора, а также добавил простую формулу Vlookup для извлечения значения category.

 =VLOOKUP(E2;Sheet2!I2:J5;2;)
  

С помощью кода VBA я могу выбрать все три категории, а также удалить выбранную категорию позже. Но мне не удается получить сумму выбранной категории. Например, я хочу, чтобы, если клиент выбирает категории AAA и CCC, он / она мог видеть сумму как 4. Также, если клиент сначала выбирает все три категории, а затем удаляет одну из категорий, тогда также должна обновляться сумма. Я не понимаю, как мне обновить мою формулу Vlookup, чтобы получить сумму.

Вот мой код VBA для множественного выбора.

 Private Sub Worksheet_Change(ByVal Target As Range)
    'Updated: 2016/4/12
    Dim xRng As Range
    Dim xValue1 As String
    Dim xValue2 As String
    If Target.Count > 1 Then Exit Sub
    On Error Resume Next
    Set xRng = Cells.SpecialCells(xlCellTypeAllValidation)
    If xRng Is Nothing Then Exit Sub
    Application.EnableEvents = False
    If Not Application.Intersect(Target, xRng) Is Nothing Then
        xValue2 = Target.Value
        Application.Undo
        xValue1 = Target.Value
        Target.Value = xValue2
        If xValue1 <> "" Then
            If xValue2 <> "" Then
                '                If xValue1 = xValue2 Or _
                '                   InStr(1, xValue1, ", " amp; xValue2) Or _
                InStr(1, xValue1, xValue2 amp; ",") Then
                If InStr(1, xValue1, xValue2 amp; ",") > 0 Then
                    xValue1 = Replace(xValue1, xValue2 amp; ", ", "") ' If it's in the middle with comma
                    Target.Value = xValue1
                    GoTo jumpOut
                End If
                If InStr(1, xValue1, ", " amp; xValue2) > 0 Then
                    xValue1 = Replace(xValue1, ", " amp; xValue2, "") ' If it's at the end with a comma in front of it
                    Target.Value = xValue1
                    GoTo jumpOut
                End If
                If xValue1 = xValue2 Then        ' If it is the only item in string
                    xValue1 = ""
                    Target.Value = xValue1
                    GoTo jumpOut
                End If
                Target.Value = xValue1 amp; ", " amp; xValue2
            End If
            jumpOut:
        End If
    End If
    Application.EnableEvents = True
End Sub
  

Комментарии:

1. Просто примечание: посмотрите на использование If.....then....elseif...else....end if or Select case , чтобы вы могли избавиться от GoTo jumpOut

2. Вместо Vlookup я должен кодировать на VBA?

Ответ №1:

Вместо кодирования в VBA вы можете просто использовать эту функцию, и она будет работать.

 =SUMPRODUCT(ISNUMBER(SEARCH(Sheet2!A1:I4;Sheet1!A2))*Sheet2!B1:B4)
  

Ответ №2:

Я бы сделал что-то подобное для части суммирования. У меня есть моя справочная таблица A1: B4. Я вызвал, используя Get_Sum("A,C,D")

 Function Get_Sum(strInput As String) As Double

Dim a() As String
Dim v As Variant
Dim r As Excel.Range
Dim l As Long

a = Split(strInput, ",")
Set r = Range("a1:b4")

Get_Sum = 0

For Each v In a
    l = Application.WorksheetFunction.Match(v, r.Columns(1), 0)
    Get_Sum = Get_Sum   r.Cells(l, 2)
Next v

Set r = Nothing
Erase a

End Function
  

Вызываем вот так

 Private Sub Worksheet_Change(ByVal Target As Range)

    '   Where A5 is the validated cell and B5 is the sum result

    If Target = Range("a5") Then
        Range("b5").value = Get_Sum (Target.Value)
    End If


    End Sub
  

Комментарии:

1. С этим кодом моя опция множественного выбора не работает.

2. Через 6 минут: o) Как вы это называете, я не вижу вашу машину. Как я добавил в сообщении, когда у вас есть Get_Sum("AAA,BBB,CCC") ? Вы изменили справочную таблицу на ту, в которой находятся ваши данные?

3. Я пытаюсь добавить эту функцию внутри инструкции if

4. Получение суммы («AAA, BBB, CCC») возможно только в том случае, если клиент выбирает AAA, BBB, CCC из выпадающего меню. Я связал значение для своего выпадающего меню и с помощью Vlookup я могу получить соответствующее значение. Но когда я пытаюсь выполнить множественный выбор, мой код VBA не вычисляет сумму значения, связанного с выбранным меню.

5. В вашем IF...Intersect заявлении вы можете удалить закомментировать свой код. Вызовите эту функцию и отправьте строку всех выбранных вами значений в поле со списком. Еще одна вещь, на которую следует обратить внимание, это удаление On Error Resume Next из вашего кода, поскольку это просто скрывает проблемы