#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
orSelect 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
из вашего кода, поскольку это просто скрывает проблемы