excel 使用基于其他像元值的范围大小的公式

x33g5p2x  于 2023-10-22  发布在  其他
关注(0)|答案(5)|浏览(169)

在Excel中,我为来自另一个系统的导出中的每个唯一ID的一堆“标签”做了一个文本连接。

  • 数据示例:*

目前,我在TEXTJOIN公式中更改给定ID出现的次数(也称为标记数)。
我想要一个自动填充公式,我可以双击,并有它填写下来只使用文本加入唯一的ID第一次,所以我可以删除重复,并为每个ID的所有标签。
目前我向下拖动这个公式=TEXTJOIN(";";TRUE;"A2:A5"),直到标签的数量发生变化,然后编辑公式并再次向下拖动。
我希望每个唯一的id都有一个单独的示例,并带有所有相关的标记,这样我就可以导入它。

ogsagwnx

ogsagwnx1#

给予以下公式-

  1. =MAP(A2:A17,
  2. LAMBDA(x,
  3. IF(COUNTIFS(A2:INDEX(A:A,ROW(x)),x)=1,
  4. TEXTJOIN(",",1,FILTER(B2:B17,A2:A17=x)),"")
  5. ))

cxfofazt

cxfofazt2#

由于TEXTJOIN()函数在超过character limitations时会出现错误,因此避免使用动态溢出数组,并选择使用TEXTJOIN()FILTER()的填充正则公式,同时运行COUNTIF(),我强烈建议使用Power Query,它将是动态的,灵活的和一次性的方法,所以每当您向源添加新数据时,您只需要刷新从Power Query导入的数据

使用Excel公式:

·单元格D2中使用的公式

  1. =TEXTJOIN(
  2. "; ",
  3. ,
  4. FILTER(
  5. $C$2:$C$17,
  6. (A2 = $A$2:$A$17) *
  7. (
  8. COUNTIF(
  9. A$2:A2,
  10. A2
  11. ) = 1
  12. ),
  13. ""
  14. )
  15. )

为了得到所需的输出,需要分别填写上述公式。

使用Power Query:

要使用Power Query执行上述任务,请执行以下步骤:
·首先将源范围转换为表并相应地命名,对于本示例,我将其命名为Table 1
·接下来,从Data Tab--> Get & Transform Data--> Get Data--> From Other Sources--> Blank Query打开一个空白查询
·上面让Power Query窗口打开,现在从Home Tab--> Advanced Editor-->并通过删除您看到的内容粘贴以下内容,然后按Done

M代码:

  1. let
  2. Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
  3. #"Grouped Rows" = Table.Group(Source, {"TicketId"}, {{"All", each _, type table [TicketId=text, COUNTIF=text, Tag=text]}, {"Sum", each Text.Combine([Tag],"; "), type text}}),
  4. #"Added Custom" = Table.AddColumn(#"Grouped Rows", "Custom", each Table.AddIndexColumn([All],"Index",1,1)),
  5. #"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom", "Custom", {"COUNTIF", "Tag", "Index"}, {"COUNTIF", "Tag", "Index"}),
  6. #"Added Conditional Column" = Table.AddColumn(#"Expanded Custom", "Result", each if [Index] = 1 then [Sum] else null),
  7. #"Removed Columns" = Table.RemoveColumns(#"Added Conditional Column",{"All", "Sum", "Index"})
  8. in
  9. #"Removed Columns"

·最后,要将其导入回Excel-->点击Close & LoadClose & Load To-->第一个点击的将创建一个新的工作表,其中包含所需的输出,而后者将提示一个窗口,询问您将结果放置在哪里。

展开查看全部
falq053o

falq053o3#

另一种选择:

D2中的公式:

  1. =MAP(A2:A17,LAMBDA(s,IF(ROW(s)=XMATCH(s,A:A),TEXTJOIN(";",,FILTER(C:C,A:A=s)),"")))

PowerQuery:

为了好玩,我尝试不分组:

  1. let
  2. Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
  3. Step1 = Table.TransformColumnTypes(Source,{{"TicketID", Int64.Type}, {"COUNTIF", type any}, {"Tag", type text}}),
  4. Step2 = Table.AddIndexColumn(Step1, "Index", 0, 1, Int64.Type),
  5. Step3 = Table.AddColumn(Step2, "Custom", each let l=Table.Column(Step2,"TicketID") in if List.Combine({{0},l}){[Index]}<>l{[Index]} then Text.Combine(List.Transform(List.Numbers(0,List.Count(l)),(n)=> if [TicketID]=l{n} then Table.Column(Step2,"Tag"){n} else null),";") else null),
  6. Step4 = Table.RemoveColumns(Step3,{"Index"})
  7. in
  8. Step4

展开查看全部
oknwwptz

oknwwptz4#

如果数据按“TicketId”排序,则可以使用此类型。它使用:TEXTJOIN,ROW,INDIRECT和COUNTIF
在单元格D2中:

  1. =IF(OR(A1=A2;A1="";A2="");"";TEXTJOIN(";";TRUE;INDIRECT("C" & ROW() & ":C" & ROW()+COUNTIF(A:A;A2)-1)))

xkftehaa

xkftehaa5#

和一个XML解决方案(也标记),构建一个仅包含必要数据的范围(以下ID之间没有空格)。请使用下一个功能。如果Excel 365(2019)也可以作为自定义函数(UDF)使用,范围可能不排序

  1. Function ExtractTags(rngTg As Range) As Variant
  2. Dim arr, i As Long, dict As Object
  3. arr = rngTg.Value2 'place the range (without header) in an array, for faster processing
  4. Set dict = CreateObject("Scripting.Dictionary") 'set the necessary dictionary to extract unique keys
  5. For i = 1 To UBound(arr) 'iterate (in memory) and load dictionary with unique keys and tag Items per key:
  6. If Not dict.Exists(arr(i, 1)) Then
  7. dict.Add arr(i, 1), arr(i, 3)
  8. Else
  9. dict(arr(i, 1)) = dict(arr(i, 1)) & ";" & arr(i, 3)
  10. End If
  11. Next i
  12. 'create a 2D array from the dictionary elements (keys and items)
  13. ExtractTags = Application.Transpose(Array(dict.keys, dict.Items))
  14. End Function

它可以用作UDF,将公式放置在开始返回的范围内:

  1. =ExtractTags(A2:C15)

对于Excel版本无法返回数组,请使用下一个子:

  1. Sub testExtractTags()
  2. Dim ws As Worksheet, lastR As Long, arr
  3. Set ws = ActiveSheet
  4. lastR = ws.Range("A" & ws.rows.count).End(xlUp).row
  5. arr = ExtractTags(Range("A2:C" & lastR))
  6. With ws.Range("E1:F1")
  7. .Value2 = Array("TicketID", "Tag") 'place the header
  8. .Offset(1).Resize(UBound(arr)).Value2 = arr 'drop the processed array content
  9. .EntireColumn.AutoFit 'autofit the two involved columns
  10. End With
  11. End Sub

展开查看全部

相关问题