Это моя ежедневная информационная панель, на которой я обновляю количество жалоб, и если количество жалоб за предыдущий день больше, чем я обновляю восходящий тренд, наблюдаемый в конкретном отделе.
Я хочу, чтобы сообщение под таблицей появлялось автоматически после ввода счетчика.
Я попробовал применить условие IF(), но получилось.


Ваш вопрос немного расплывчатый, но мне кажется, я понял, чего вы хотите; просто нужно знать, вы обновляете саму дату? Или вы добавляете новую строку каждый день?
Предполагая, что ваш лист начинается с «A1», а текстовая строка начинается с «A6», попробуйте эту формулу в «A6»:
=TEXT(A3,"dd/mmm") & "Uptrend observed in" & IF(B3>B2 , "CC(" & B2 & "," & B3 & "), " , "") & IF(C3>C2 , "Pune Distribution(" & C2 & "," & C3 & ")" , "") & IF(D3>D2 , "Mumbai Distribution(" & D2 & "," & D3 & ")" , "") & IF(E3>E2 , "Quality(" & E2 & "," & E3 & ")" , "") & IF( F>F2 , "Production(" & F2 & "," & F3 & ")" , "") & IF(G3>G2 , "Website(" & G2 & "," & G3 & ")" , "") & IF(H3>H2 , "Online Payment(" & H2 & "," & H3 & ")" , "") & IF(I3>I2 , "IT(" & I2 & "," & I3 & ")", "")
Он не даст вам «и» в конце последнего, но я надеюсь, что это приблизит вас к тому, что вам нужно.
Я подумаю о другом методе, когда найду еще немного времени.
Если у вас есть Excel 365, вы можете использовать эту формулу:
=LET(tbl,db[#All],
data,TAKE(DROP(tbl,1),-2),
header,TAKE(tbl,1),
diffByColumn,BYCOL(data,LAMBDA(c,INDEX(c,1,1)<INDEX(c,2,1))),
colsWithUptrend,DROP(FILTER(data,diffByColumn),,1),
headerWithUptrend,DROP(FILTER(header,diffByColumn),,1),
textUptrend,BYCOL(SEQUENCE(,COLUMNS(colsWithUptrend)),
LAMBDA(i,INDEX(headerWithUptrend,1,i)&" ("&TEXTJOIN(",",TRUE,CHOOSECOLS(colsWithUptrend,i))&"),")),
message,REDUCE(TEXT(INDEX(data,2,1),"tt.MM.")&" - Uptrend observed in ",textUptrend,LAMBDA(r,c,r&" "&c)),
LEFT(message,LEN(message)-1))
Я использую таблицу (называемую db), поэтому она расширяется за день, который вы добавляете, и вам не нужно корректировать формулу.
data возвращает две последние строки таблицы, которые затем сравниваются (diffByColumn который возвращает массив true и false)
textUptrend создает части текста для каждого столбца, имеющего восходящий тренд.
Поскольку TEXTJOIN нельзя применять к textUptrend, REDUCE он используется для объединения частей текста.
Вам придется настроить часть "tt.MM." в соответствии с вашими региональными настройками: TEXT(INDEX(data,2,1),"tt.MM.")
Мэм, я думаю, что это опечатка, Pune Distribution быть не должно, а Quality пропущено. Возможно, вам придется это исправить.
Большое спасибо @MayukhBhattacharya Никогда не углублялся в Excel. Благодаря этому я многому научился...!!!
Большое спасибо @Ike Никогда не углублялся в Excel. Благодаря этому я многому научился...!!!
Я думаю, вы имеете в виду, что хотели бы автоматически генерировать текст сводки восходящего тренда?
Эта строка текста состоит из нескольких частей:
Я предлагаю вам разбить предложение и посчитать каждый компонент отдельно в других строках или столбцах или (что еще лучше) вообще в другой вкладке. Хотя решения, основанные на одной формуле, выглядят очень эффективными, я обычно предполагаю, что подход, основанный на компонентах, будет легче проверять на ошибки, изменять, передавать коллегам и может привести к появлению инструментов или подходов, которые вы сможете повторно использовать позже.
Предполагая, что вы должны оставить эти данные в этом формате... Я предлагаю вам добавить строки внизу данных (после строки тренда) и поместить туда расчеты компонентов. Затем скройте эти строки и укажите их в формуле предложения.
Это самое быстрое решение, которое пришло в голову. Он не совсем соответствует желаемому тексту, но его должно быть легко добавлять или удалять столбцы данных, а также поддерживать иным образом:
Для производственного отчета или ежедневного использования скройте строки 5–7. Чтобы сделать все грамматически правильными (запятые, закрывающее «и» и т. д.), вы можете дополнительно улучшить текст, используя различные условия IF(). Это не выглядит главным вопросом, о котором идет речь.
Ваши формулы могут быть еще короче и понятнее, если:
поместите данные тренда и сводное предложение вверху таблицы, затем измените порядок дат (самые новые сверху)
Используйте относительный аргумент строки/столбца ADDRESS().
Ячейки тренда: =ДВССЫЛ(АДРЕС(СТРОКА()-1, СТОЛБЕЦ()))-ДВССЫЛ(АДРЕС(СТРОКА()-2, СТОЛБЕЦ()))
Ячейки сводки: =ДВССЫЛ(АДРЕС(1, СТОЛБЕЦ()))&" ("&ДВССЫЛ(АДРЕС(СТРОКА()-3, СТОЛБЕЦ()))&", "&ДВССЫЛ(АДРЕС(СТРОКА()-2, СТОЛБЕЦ() )))&")"&", "
Ячейки восходящего тренда: =ЕСЛИ(ДВССЫЛ(АДРЕС(СТРОКА()-2,СТОЛБЕЦ()))>0,ДВССЫЛ(АДРЕС(СТРОКА()-1,СТОЛБЕЦ())), "")
Ячейка отчета: =TEXT(INDIRECT(ADDRESS(ROW()-5,COLUMN()-1,)),"DD MMM")&" - Восходящие тенденции наблюдаются в: "&CONCAT(INDIRECT(ADDRESS(ROW()-2, COLUMN())&":"&ADDRESS(ROW()-2,COLUMN()+7)))
Если предположить, что в соответствии с опубликованными тегами нет Excel Constraints, то для получения желаемого результата должна работать следующая формула.
Следующая формула не использует никаких LAMBDA() вспомогательных функций для выполнения custom calculations и не использует никаких volatile functions, которые будут recalculate что-либо делать в любое время, когда в любой открытой книге происходят изменения, а также volatile функции, замедляющие работу engine/capacityExcel.
Это сказано:
• Формула, используемая в ячейке A6
=LET(
_Data, DailyDashBoard[#All],
_Header, TAKE(_Data,1,COLUMNS(_Data)-1),
_DataBody, DROP(TAKE(_Data,-2),,-1),
_Filtered, FILTER(VSTACK(_Header,_DataBody),TAKE(_DataBody,1)<TAKE(_DataBody,-1)),
_LastDay, TAKE(_Filtered,-1,1),
_CustomDate, DAY(_LastDay)&
LOOKUP(DAY(_LastDay),ORDINALS)&" "&
TEXT(_LastDay,"mmm - ")&"Uptrend Observed in ",
_Joined, TEXTJOIN({"(",",","), "},,WRAPROWS(TOCOL(DROP(_Filtered,,1),,1),3))&")",
SUBSTITUTE(_CustomDate&_Joined,"), ",") and ",MAX(LEN(_Joined)-LEN(SUBSTITUTE(_Joined,"),",))-2,1)))
Structured References или Tables, на этом форуме мы обычно предлагаем использовать то же самое. Потому что он может изменять размеры строк/столбцов, не затрагивая диапазоны/массивы, взятые в формулах.LET() облегчает чтение, присваивает определенные переменные, исключает избыточные вычисления._Data определена для всего Structured ReferencesDailyDashBoard[#All]TAKE(), динамически извлекающей _Header.DROP() и TAKE() для извлечения _DataBody, представляющего числа и даты, исключая Totals_Filtered, мы используем функцию FILTER() для извлечения _Header, а также _DataBody, сложенного с помощью VSTACK(), чтобы получить данные в соответствии с вышеупомянутыми условиями._LastDay извлекает дату с помощью функции TAKE(), и нам нужен только последний день, а не предыдущий._CustomDate — это не что иное, как объединение дня и порядковых значений вместе со строкой, которая должна следовать за ней._Joined использует функцию TEXTJOIN(), прежде чем преобразовать массив в одиночный с помощью TOCOL(), а затем в массив 2-dimensional, чтобы упростить объединение._CustonDate с _Joined для получения желаемого результата, но если внимательно отметить, то он использует функцию SUBSTITUTE() дополнительно, чтобы позаботиться о and, которая необходима, если имеется более одного массива данных.Тестовый пример_1:
Тестовый пример_2:
Приложение:
Забыл упомянуть о ORDINALS в функции LOOKUP(), используемой для переменной _CustomDate, это определенное имя в Name Manager с использованием VSTACK()
=VSTACK(
{1, "st"},
{2, "nd"},
{3, "rd"},
{4, "th"},
{21, "st"},
{22, "nd"},
{23, "rd"},
{24, "th"},
{31, "st"}
)
Сэр, я сам обновляю дату. Но не имеет значения, будет ли это обновление даты автоматическим или ручным. Большое спасибо, сэр, за ваш ответ!