Это решение на основе UDF. Его преимущество в том, что он более универсален и гораздо проще в обслуживании, если вы изучите его элементы кода. Недостаток в том, что вам нужно изучить элементы кода, и у вас есть книга с поддержкой макросов xlsm, которая не везде приветствуется.
Настройка проста. Я создал таблицу со столбцами Item и Value . Я поместил его на другой лист, чем задание. Фактически, вы можете создать лист с таблицей VeryHidden , чтобы пользователь не мог просматривать его без доступа к проекту VBA, который вы можете защитить паролем. Я назвал стол Легенда . У столбцов товара есть названия, такие как яблоко, груша, апельсин. Столбец Значение имеет числа c, связанные с каждым именем.
Обратите внимание, что, поскольку это проект VBA, весь список можно перенести в VBA, не оставляя следов на листе. У вас может быть функция для отображения значения каждого элемента, когда пользователь щелкает по нему, и он исчезает, когда он щелкает в другом месте.
Затем я создал раскрывающийся список проверки данных в A1, где список определен как =INDIRECT("Legend[Item]")
. Скопируйте эту ячейку в C1 и E1.
Затем я создал еще одно раскрывающееся меню Проверка данных в B1 со списком +,-,*,/
. Это раскрывающееся меню необходимо скопировать в D1.
Теперь приведенный ниже код входит в стандартный модуль кода. Найдите способ создать его, потому что он не настроен автоматически. Это имя по умолчанию будет Module1 . Вставьте туда код.
Function Evalue(Definition As Range) As Double
Dim Task As String
Dim Fact(2) As Double
Dim C As Long
Dim i As Long
With Definition
For C = 1 To 5 Step 2
On Error Resume Next
Fact(i) = Application.VLookup(.Cells(C).Value, Range("Legend"), 2, False)
i = i + 1
Next C
Task = "(" & Fact(0) & .Cells(2).Value _
& Fact(1) & ")" & .Cells(4).Value _
& Fact(2)
End With
Evalue = Evaluate(Task)
End Function
Теперь вы готовы к тестированию. Вызовите функцию из рабочего листа с помощью вызова, подобного =Evalue(A1:E1)
. Вы можете использовать его для сравнения, например =IF(G6 = Evalue(A1:E1), "Baravo!", "Try again")
. При изменении любого из компонентов ячейка с функцией изменится.
Не забудьте использовать абсолютную адресацию, если копируете формулы, содержащие диапазон. Если вам нужно получить результат в VBA во время тестирования, используйте эту подпрограмму для вызова функции.
Private Sub TestEvalue()
Debug.Print Evalue(Range("A1:E1"))
End Sub