Приветствую. Нужна помощь знатоков. Есть таблица, к примеру, с товарами и дополнительными услугами. Услуг много - порядка десяти, и они еще будут расширяться. Нужно сделать мультивыбор с выпадающего списка, чтобы всё оставалось в ячейке. В Сети нашел следующий макрос, отредактировал под свой случай, получилось сделать мультивыбор в ячейке. [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range On Error Resume Next If Not Intersect(Target, Range("B4:B10")) Is Nothing And Target.Cells.Count = 1 Then Application.EnableEvents = False newVal = Target Application.Undo oldval = Target If Len(oldval) <> 0 And oldval <> newVal Then Target = Target & "," & newVal Else Target = newVal End If If Len(newVal) = 0 Then Target.ClearContents Application.EnableEvents = True End If End Sub
[/vba]
Но возникла проблема с обработкой самих данных в ячейке. Искать позицию и индексировать не получается, ибо функция ищет 1 значение, а у меня их может быть несколько. Была мысль разнести сбоку ячейку на столбцы или строки, чтобы можно было с ними работать. Но. Во-первых, я на алё в VBA и не смогу это сделать сам. Во-вторых, разнести в одну сторону как бы и можно, но будут ли удаляться разнесенные строки и столбцы после очистки поля ввода? Учитывая, что полей для ввода данных будет больше тысячи, вариант не очень.
Я что-то явно делаю не так. Подскажите, пожалуйста, как быть? Отказаться от этого макроса и искать альтернативный вариант? // Прошу прощения, файл приложил, но из-за неподтвержденного имейла он сбросился, а текст остался. Прикрепил. [moder]Ну да, не так - файл не прикладываете.
Приветствую. Нужна помощь знатоков. Есть таблица, к примеру, с товарами и дополнительными услугами. Услуг много - порядка десяти, и они еще будут расширяться. Нужно сделать мультивыбор с выпадающего списка, чтобы всё оставалось в ячейке. В Сети нашел следующий макрос, отредактировал под свой случай, получилось сделать мультивыбор в ячейке. [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range On Error Resume Next If Not Intersect(Target, Range("B4:B10")) Is Nothing And Target.Cells.Count = 1 Then Application.EnableEvents = False newVal = Target Application.Undo oldval = Target If Len(oldval) <> 0 And oldval <> newVal Then Target = Target & "," & newVal Else Target = newVal End If If Len(newVal) = 0 Then Target.ClearContents Application.EnableEvents = True End If End Sub
[/vba]
Но возникла проблема с обработкой самих данных в ячейке. Искать позицию и индексировать не получается, ибо функция ищет 1 значение, а у меня их может быть несколько. Была мысль разнести сбоку ячейку на столбцы или строки, чтобы можно было с ними работать. Но. Во-первых, я на алё в VBA и не смогу это сделать сам. Во-вторых, разнести в одну сторону как бы и можно, но будут ли удаляться разнесенные строки и столбцы после очистки поля ввода? Учитывая, что полей для ввода данных будет больше тысячи, вариант не очень.
Я что-то явно делаю не так. Подскажите, пожалуйста, как быть? Отказаться от этого макроса и искать альтернативный вариант? // Прошу прощения, файл приложил, но из-за неподтвержденного имейла он сбросился, а текст остался. Прикрепил. [moder]Ну да, не так - файл не прикладываете._Under
а где Вы пытаетесь это сделать? Нашёл только функцию добавления значения в конец ячейки с мультивыбором.
Я прикрепил только пример документа с нуля, чтобы не повергать в шок людей другими моими "гениальными" решениями. Пробовал дублировать ячейку с мультивыбором, а потом в таблице услуг искать позицию и индексировать или использовать ВПР. Естественно, что формула возвращает только одно значение, в то время, как мне надо получать всевозможные, учитывая выбор. К примеру, в той же В4 выбраны Услуга 3(100), Услуга 2(70), Услуга 3(100) и Услуга4(125). В столбце Сумма я хочу получить сумму выбранных услуг - 395. При этом, хотелось бы получать динамическую сумму, т.е. выбрал что-то - сумма прибавилась, убрал всё - столбец Сумма пустой.
а где Вы пытаетесь это сделать? Нашёл только функцию добавления значения в конец ячейки с мультивыбором.
Я прикрепил только пример документа с нуля, чтобы не повергать в шок людей другими моими "гениальными" решениями. Пробовал дублировать ячейку с мультивыбором, а потом в таблице услуг искать позицию и индексировать или использовать ВПР. Естественно, что формула возвращает только одно значение, в то время, как мне надо получать всевозможные, учитывая выбор. К примеру, в той же В4 выбраны Услуга 3(100), Услуга 2(70), Услуга 3(100) и Услуга4(125). В столбце Сумма я хочу получить сумму выбранных услуг - 395. При этом, хотелось бы получать динамическую сумму, т.е. выбрал что-то - сумма прибавилась, убрал всё - столбец Сумма пустой._Under
Udik, спасибо огромное! В моей таблице дублироваться может только несколько услуг, но это всё решится путём добавления в список "Дополнительная Услуга1".
Udik, спасибо огромное! В моей таблице дублироваться может только несколько услуг, но это всё решится путём добавления в список "Дополнительная Услуга1"._Under
Udik, я тоже попытался сделать подобным образом, но если в ячейке одна и таже услуга введены более одного раза, то посчитается только одна. Поэтому, мне кажется, удобнее сделать UDF[vba]
Код
Function tt(Text As String, Rng As Range) 'Text содержимое ячейки (или ссылка на нее) в которой содержится перечень услуг 'Rng двухмерный диапазон, содержащий соответствия между наименованием услуги и ее стоимостью Dim arr, aText, i As Long, j As Long arr = Rng.Value aText = Split(Text, ",") For i = 0 To UBound(aText) For j = 1 To UBound(arr) If aText(i) = arr(j, 1) Then tt = tt + Val(arr(j, 2)) Next Next End Function
[/vba]
Udik, я тоже попытался сделать подобным образом, но если в ячейке одна и таже услуга введены более одного раза, то посчитается только одна. Поэтому, мне кажется, удобнее сделать UDF[vba]
Код
Function tt(Text As String, Rng As Range) 'Text содержимое ячейки (или ссылка на нее) в которой содержится перечень услуг 'Rng двухмерный диапазон, содержащий соответствия между наименованием услуги и ее стоимостью Dim arr, aText, i As Long, j As Long arr = Rng.Value aText = Split(Text, ",") For i = 0 To UBound(aText) For j = 1 To UBound(arr) If aText(i) = arr(j, 1) Then tt = tt + Val(arr(j, 2)) Next Next End Function
Здравствуйте, уважаемы эксперты Эксель. Подскажите, пожалуйста, возможно ли в вышеперечисленном примере сделать формулу так, чтобы значения не складывались, а умножались в зависимости от выбранных значений?
Здравствуйте, уважаемы эксперты Эксель. Подскажите, пожалуйста, возможно ли в вышеперечисленном примере сделать формулу так, чтобы значения не складывались, а умножались в зависимости от выбранных значений?coyt23rus