Excel, сгенерируйте список имен в зависимости от значений строк и столбцов другого листа

У меня есть аналогичный лист Excel, в котором даты указаны в столбце А, а имена — в строке 1. Каждое имя имеет значение в день.

Дата Алиса Боб Чарльз Дэн 01.01.24 Э л Э Э 01.02.24 Э л л А

Мне нужен еще один лист, в котором указаны даты в первом столбце, значения во втором столбце, а затем в этой строке перечислены все имена с соответствующими значениями на первом листе. Что-то вроде:

Дата Ценить Имя1 Имя2 Имя3 01.01.24 Э Алиса Чарльз Дэн 01.01.24 л Боб 01.01.24 А 01.02.24 Э Алиса 01.02.24 л Боб Чарльз 01.02.24 А Дэн

Я использую Microsoft Excel 365

Как этого можно достичь? Я не могу найти формулу Excel, которая возвращает несколько значений для соответствующей строки. Я хожу по кругу целую вечность, поэтому любая помощь очень ценится.

Обновлено: я думаю, что Index и Aggregate приближаются к этому, как показано здесь. https://www.xelplus.com/return-multiple-match-values-in-excel/ но я не могу перестать это понимать.

Посмотрите на разворот Power Query.

bugdrown 30.06.2024 16:55
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
1
105
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Использовать Power Query будет намного проще, чем Excel Formula:


  • Преобразуйте диапазоны в Structured References, то есть Tables and name it as Table1`.
  • Откройте пустой запрос на вкладке Data --> Get Data --> From Other Sources --> Blank Query.
  • На вкладке Home --> нажмите Advanced Editor --> удалите все, что видите, и вставьте следующее:

let
    Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
    DataType = Table.TransformColumnTypes(Source,{{"Date", type date}, {"Alice", type text}, {"Bob", type text}, {"Charl", type text}, {"Dan", type text}}),
    UnpivotOtherCols = Table.UnpivotOtherColumns(DataType, {"Date"}, "Name", "Value"),
    GroupBy = Table.Group(UnpivotOtherCols, {"Date", "Value"}, {{"Count", each Table.RowCount(_), Int64.Type}, {"All", each _, type table [Date=nullable date, Attribute=text, Value=text]}}),
    ExtractNames = Table.AddColumn(GroupBy, "Name", each [All][Name]),
    Expanded = Table.TransformColumns(ExtractNames, {"Name", each Text.Combine(List.Transform(_, Text.From), "|"), type text}),
    SplitByDelim = Table.SplitColumn(Expanded, "Name", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), {"Name.1", "Name.2", "Name.3"}),
    RemovedCols = Table.RemoveColumns(SplitByDelim,{"Count", "All"})
in
    RemovedCols

  • Теперь внизу есть кнопка Done, нажмите на нее.
  • Из File --> Нажмите Close & Load или Close & Load To импортируйте данные в Excel, чтобы получить желаемый результат.
  • Теперь при каждом добавлении новых данных просто обновляйте импортированную таблицу, чтобы получать обновленные результаты.

Используя Excel Formulas:


MAKEARRAY():

=LET(
     _Data, Table1[#All],
     _Names, DROP(TAKE(_Data,1),,1),
     _Vals, UNIQUE(TOCOL(DROP(_Data,1,1))),
     _Date, DROP(TAKE(_Data,,1),1),
     _DateExpanded, TOCOL(IFNA(EXPAND(_Date,,ROWS(_Vals)),_Date)),
     _ValsExpanded, TOCOL(IFNA(EXPAND(_Vals,,ROWS(_Date)),_Vals),,1),
     _DataBody, MAKEARRAY(ROWS(G2:G7),ROWS(_Vals),LAMBDA(r,c,
            INDEX(TOROW(IFS((INDEX(_DateExpanded,r)=_Date)*
            (INDEX(_ValsExpanded,r)=DROP(_Data,1,1)),_Names),2),c))),
     _Output, IFERROR(HSTACK(_DateExpanded,_ValsExpanded, _DataBody),""),
 VSTACK(HSTACK("Date","Value","Name"&SEQUENCE(,ROWS(_Vals))),_Output))

REDUCE():

=LET(
     _Data, Table1[#All],
     _Vals, UNIQUE(TOCOL(DROP(_Data,1,1),3)),
     _Output, IFNA(DROP(REDUCE("",SEQUENCE(ROWS(_Data)-1),LAMBDA(a,b,
          VSTACK(a, DROP(REDUCE("",_Vals,LAMBDA(c,d,
          LET(e, CHOOSEROWS(DROP(_Data,1),b), f, TAKE(e,,1),
          VSTACK(c,HSTACK(f,d,IFERROR(FILTER(DROP(TAKE(_Data,1),,1),DROP(e,,1)=d),"")))))),1)))),1),""),
      VSTACK(HSTACK(A2,"Value","Name"&SEQUENCE(,ROWS(_Vals))),_Output))

Это отлично, спасибо за объяснение четких шагов. Мне нужно убедить (и довериться) кому-то нажать «Обновить», но это работает очень хорошо.

user25652804 30.06.2024 17:49

@user25652804 user25652804 то, что у вас есть, - это не вопрос к формулам Excel, это вопрос к Power Query, который работает очень хорошо в таких условиях. и намного проще, чем формулы. Объединение и отмена поворота с использованием формул с большими данными может выполняться медленнее в зависимости от различных условий. Здесь уместно использовать PQ.

Mayukh Bhattacharya 30.06.2024 18:03

Преобразование данных: отмена поворота

=LET(list,A1:E3,rlr_title,"Value",vals_title,"Name",
    shv,DROP(TAKE(list,1),,1),
    sd,DROP(list,1),
    sdr,ROWS(sd),
    sr,TAKE(sd,,1),
    sv,DROP(sd,,1),
    vu,UNIQUE(TOCOL(sv)),
    vur,ROWS(vu),
    vus,SEQUENCE(vur),
    drl,HSTACK(TOCOL(IF(SEQUENCE(,vur),sr)),
        TOCOL(IF(SEQUENCE(,sdr),vu),,1)),
    dv,IFNA(DROP(REDUCE("",SEQUENCE(sdr),LAMBDA(rr,r,LET(
        svr,CHOOSEROWS(sv,r),
        VSTACK(rr,DROP(REDUCE("",vus,LAMBDA(cc,c,
            VSTACK(cc,FILTER(shv,ISNUMBER(XMATCH(svr,
            CHOOSEROWS(vu,c))),"")))),1))))),1),""),
    dh,HSTACK(TAKE(list,1,1),rlr_title,vals_title&SEQUENCE(,COLUMNS(dv))),
    r,VSTACK(dh,HSTACK(drl,dv)),
    r)

Power Query лучше, но для развлечения используйте формулу:

Чтобы просмотреть результат каждого шага, измените конечную переменную (unpivotted).

=LAMBDA(names, dates, values,
    LET(
        uniq_values, UNIQUE(TOCOL(values)),
        values_for_date, LAMBDA(date_,
            INDEX(values, XMATCH(date_, dates), )
        ),
        names_for_date_values, LAMBDA(date_, values,
            DROP(
                REDUCE(
                    "",
                    values,
                    LAMBDA(acc, value,
                        VSTACK(
                            acc,
                            FILTER(
                                names,
                                values_for_date(date_) = value,
                                ""
                            )
                        )
                    )
                ),
                1
            )
        ),
        format_date, LAMBDA(date_, TEXT(date_, "mm/dd/yyyy")),
        date_value_names, DROP(
            REDUCE(
                "",
                dates,
                LAMBDA(acc, date_,
                    VSTACK(
                        acc,
                        HSTACK(
                            EXPAND(
                                format_date(date_),
                                ROWS(uniq_values),
                                ,
                                format_date(date_)
                            ),
                            uniq_values,
                            names_for_date_values(
                                date_,
                                uniq_values
                            )
                        )
                    )
                )
            ),
            1
        ),
        header, HSTACK(
            "Date",
            "Value",
            "Name" & TOROW(SEQUENCE(COLUMNS(date_value_names) - 2))
        ),
        unpivotted, VSTACK(header, IFNA(date_value_names, "")),
        unpivotted
    )
)(B1:E1, A2:A3, B2:E3)

Другие вопросы по теме