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

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

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

  • 数据示例:*

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

ogsagwnx

ogsagwnx1#

给予以下公式-

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

cxfofazt

cxfofazt2#

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

使用Excel公式:

·单元格D2中使用的公式

=TEXTJOIN(
    "; ",
    ,
    FILTER(
        $C$2:$C$17,
        (A2 = $A$2:$A$17) *
            (
                COUNTIF(
                    A$2:A2,
                    A2
                ) = 1
            ),
        ""
    )
)

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

使用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代码:

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

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

falq053o

falq053o3#

另一种选择:

D2中的公式:

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

PowerQuery:

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

let
    Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    Step1 = Table.TransformColumnTypes(Source,{{"TicketID", Int64.Type}, {"COUNTIF", type any}, {"Tag", type text}}),
    Step2 = Table.AddIndexColumn(Step1, "Index", 0, 1, Int64.Type),
    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),
    Step4 = Table.RemoveColumns(Step3,{"Index"})
in
    Step4

oknwwptz

oknwwptz4#

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

=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)使用,范围可能不排序

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

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

=ExtractTags(A2:C15)

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

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

相关问题