У меня есть аналогичный лист Excel, в котором даты указаны в столбце А, а имена — в строке 1. Каждое имя имеет значение в день.
Мне нужен еще один лист, в котором указаны даты в первом столбце, значения во втором столбце, а затем в этой строке перечислены все имена с соответствующими значениями на первом листе. Что-то вроде:
Я использую Microsoft Excel 365
Как этого можно достичь? Я не могу найти формулу Excel, которая возвращает несколько значений для соответствующей строки. Я хожу по кругу целую вечность, поэтому любая помощь очень ценится.
Обновлено: я думаю, что Index и Aggregate приближаются к этому, как показано здесь. https://www.xelplus.com/return-multiple-match-values-in-excel/ но я не могу перестать это понимать.
Использовать 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 user25652804 то, что у вас есть, - это не вопрос к формулам Excel, это вопрос к Power Query
, который работает очень хорошо в таких условиях. и намного проще, чем формулы. Объединение и отмена поворота с использованием формул с большими данными может выполняться медленнее в зависимости от различных условий. Здесь уместно использовать PQ
.
=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)
Посмотрите на разворот Power Query.