Как объединить опыт двух клеток в одну - PullRequest
1 голос
/ 24 сентября 2019

Мы собрали данные от участников для работы.Теперь у нас есть данные в приведенной ниже форме.

Опыт-1 (Cell1) (5 лет 4 месяца) Опыт-2 (Cell2) (4 года 9 месяца)

Теперь хочу объединитьобе ячейки испытывают и хотят рассчитать общий опыт, как 10 лет 1 месяц

Ответы [ 3 ]

0 голосов
/ 24 сентября 2019

С помощью пользовательской функции легче уклониться от основных недостатков длинных ванильных формул:

Function sumyearmonth(rng As Range) As String
Dim rng2 As Range, strArr() As String, runtotal As Double, outYear As Long, outMonth As Long

For Each rng2 In rng ' for each of the cells
    strArr = Split(rng2.Value2, " ") 'splits any sort of string by spaces
    For i = LBound(strArr) To UBound(strArr) ' for each element of the array
        Select Case True
            Case strArr(i) Like "*year*" Or strArr(i) Like "*Year*" 'if it says something like "year", "Year" or "Years"
                runtotal = runtotal + Val(strArr(i - 1)) 'then the running total gets incremented by the preceding item of the array, e.g. 12 (years)
            Case strArr(i) Like "*month*" Or strArr(i) Like "*Month*"  'if it says something like "month", "Month" or "Months"
                runtotal = runtotal + Val(strArr(i - 1)) / 12 'then the running total gets incremented by the preceding item of the array, e.g. 9 (months) /12
        End Select
    Next i
Next rng2
'now we just need to interpret the running total
outYear = Int(runtotal) 'years is the integer part of the running total
outMonth = Round((runtotal - outYear) * 12, 0) 'months is the noninteger part of the running total multiplied by 12 and rounded to the next integer
sumyearmonth = outYear & " Year" & IIf(outYear > 1, "s", "") 'if it's more than 1 year, then years
sumyearmonth = sumyearmonth & " " & outMonth & " Month" & IIf(outMonth > 1, "s", "") 'if it's more than 1 month, then months
End Function

Это решение не предполагает, что ввод идет как год и месяц, он имеет приятныйвыходной формат [год (лет)], и вам не нужно показывать промежуточный итог вместе с ним.

0 голосов
/ 25 сентября 2019

Предположим, что формулировка опыта всегда будет в форме x Year(s) y Month(s), а все опыты перечислены в столбце, например ниже:

Example

Предположим, что вы дали имя вышеприведенному списку как List_Exp , вы можете использовать следующую формулу массива , которую необходимо подтвердить, нажав Ctrl + Shift + Введите в строке формул, чтобы найти всего месяцев сначала:

=SUMPRODUCT(--TRIM(MID(SUBSTITUTE(List_Exp," ",REPT(" ",100)),{1,200},100)),IF(ROW($A$1:INDEX($A:$A,ROWS(List_Exp)))>0,{12,1}))

Здесь я использовал функции TRIM + MID + SUBSTITUTE + REPT , чтобы извлечь цифру года и месяца из исходной строки, которая в приведенном выше примере составляет {5,4;4,9;1,2;1,1;10,9}, затем использовать SUMPRODUCT длярассчитайте общее количество месяцев, найдя соответствующие множители {12,1;12,1;12,1;12,1;12,1}, используя функции IF + ROW + INDEX .

Затем вы можете преобразовать Всего месяцев в Лет и Месяцев , как показано ниже:

Solution

Если вы не хотите использовать вспомогательные ячейки (ячейка D3:D6) в приведенном выше примере, вы можете присвоить имя цифре Всего месяцев в виде Ttl_Mth и объедините следующие формулы в одну:

Рисунок для лет: =INT(Ttl_Mth/12)

Слово для лет: ="Year"&IF(INT(Ttl_Mth/12)>1,"s","")

Рисунок дляМесяцы: =MOD(Ttl_Mth,12)

Слово для месяцев: ="Month"&IF(MOD(Ttl_Mth,12)>1,"s","")

В сочетании:

=INT(Ttl_Mth/12)&" "&"Year"&IF(INT(Ttl_Mth/12)>1,"s","")&" "&MOD(Ttl_Mth,12)&" "&"Month"&IF(MOD(Ttl_Mth,12)>1,"s","")

Ниже приведен результат теста для новогосписок опытов:

Test Result

[Подсказка] Рекомендую преобразовать список опытов в Таблица перед тем, как дать имя в списке.Преимущество состоит в том, что каждый раз, когда вы добавляете или заменяете значения в списке (который фактически является таблицей из одного столбца), именованный диапазон будет автоматически обновляться, поэтому вычисления также будут обновляться автоматически.

0 голосов
/ 24 сентября 2019

Для ванильных формул Excel это немного, хотя.Предположим, что ваша строка находится в ячейке A2 ваши значения могут быть вычислены с использованием следующей логики:
Вы можете найти первое число по следующей формуле:

=MIN(SEARCH({0;1;2;3;4;5;6;7;8;9};A2&"0123456789"))

и вы можете найти последнеестрока со следующей формулой:

=MAX(ISNUMBER(VALUE(MID(A2;{1;2;3;4;5;6;7;8;9};1)))*{1;2;3;4;5;6;7;8;9})

Если предположить, что ни один из ваших кандидатов не проработал более 99 лет, TRIM является адекватным:

=TRIM(MID($A2;MIN(SEARCH({0;1;2;3;4;5;6;7;8;9};A2&"0123456789"));2))*1

лет и

=TRIM(MID($A2;MAX(ISNUMBER(VALUE(MID($A2;{1;2;3;4;5;6;7;8;9};1)))*{1;2;3;4;5;6;7;8;9})-1;2))

мес.Чтобы получить одно число, которое можно суммировать, вы сохраняете годы как целые числа и добавляете месяцы, разделенные на 12, как нецелую часть

=TRIM(MID($A2;MIN(SEARCH({0;1;2;3;4;5;6;7;8;9};$A2&"0123456789"));2))*1+TRIM(MID($A2;MAX(ISNUMBER(VALUE(MID($A2;{1;2;3;4;5;6;7;8;9};1)))*{1;2;3;4;5;6;7;8;9})-1;2))/12

Эти числа можно суммировать, и в результате вы получите 10.83333.Чтобы получить строку в конце, вам нужно будет использовать формулу для суммы (в моем примере ячейка X1), например,

=INT(X1)&" Years " & ROUND((X1-INT(X1))*12;0) & " Months"

Обратите внимание, что вам, вероятно, потребуется сформулировать что-то дажеболее сложный, если ваши пользователи не поддерживают данные как 0 Years 6 Months для периодов менее 1 года.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...