объединить все ячейки, цифры и символы в сумму - PullRequest
0 голосов
/ 10 апреля 2020

Добрый день,

Я в недоумении по этой проблеме.

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

Ячейка A1 - «яблоко», B1 - «+», ячейка C1 - «яблоко», ячейка D1 - «*», ячейка E1 - «яблоко». ", вызов F1 - это" = ", а ячейка G1 - рекомендуемая сумма, в этом случае будет" 6 ". Это будет опубликовано как | яблоко | + | яблоко | * | яблоко | = | 6 |

В легенде содержится значение слова, поэтому если вы введете 2 в легенде, яблоко будет равно 2. Лог c определит, что формула будет 2 + 2 * 2 =, если написанный в Excel, я хотел бы объединить все ячейки и вычислить это.

Я пытался использовать = sum, sumproduct, concate и т. п. безрезультатно.
Любой способ, который я сделал, я закончил неправильно понял BEDMAS, так как он рассчитывается как 2 + 2 = 4 * 2 = 8, вместо правильного 2 * 2 = 4 + 2 = 6.

Любой знает, как объединить эти ячейки и правильно Суммируйте значения в правильную сумму?

Спасибо за потраченное время!

Ответы [ 3 ]

3 голосов
/ 10 апреля 2020

Go до Name manager и создайте именованный диапазон Eval, в поле Refers to добавьте формулу:

=EVALUATE(CONCATENATE(VLOOKUP(Sheet1!A1,Sheet1!$A$3:$B$5,2,0),Sheet1!B1,VLOOKUP(Sheet1!C1,Sheet1!$A$3:$B$5,2,0),Sheet1!D1,VLOOKUP(Sheet1!E1,Sheet1!$A$3:$B$5,2,0)))

В диапазоне A3: B5 у меня есть легенда. Изменить ссылки, как вам нужно. Затем в ячейку G1 напишите формулу =Eval.

Образец:

enter image description here

0 голосов
/ 10 апреля 2020

Мой лист Вот что у меня есть.

В ячейках M - U я считаю все вхождения слова из ячеек E, G и I из легенды.

=SUMPRODUCT((LEN(E3)-LEN(SUBSTITUTE(E3,$B$3,"")))/LEN($B$3))

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

=SUM(M3*$C$3)

В ячейке E8 - I8 я складываю три возможных значения вместе. = СУММА (W3: Y3), так что каждая ячейка теперь представляет собой число.

Я хотел бы взять ячейки E8 - I8, чтобы вычислить k8 и т. Д.

Итак каждая ячейка собирается вместе, чтобы сделать оператор

=SUM(E8:I8) 

, который работает все, кроме E11 - I11, что соответствует 26 вместо 43.

0 голосов
/ 10 апреля 2020

Это решение на основе 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
...