如何更新 Excel 公式,使其适用于连续向右的所有列,而不仅仅是为其设置的当前 2 列

问题描述 投票:0回答:3

我有一个“小组历史记录”选项卡,用于记录每个学生被分入的小组。“小组历史记录”选项卡内容的屏幕截图:

screenshot of contents of Group History tab

另一个名为“历史矩阵”的选项卡我已经成功地计算了每个学生与另一个学生在一个小组中的次数,并且我能够拖动手柄来动态更新其他单元格。 历史矩阵选项卡内容截图:

screenshot of contents of History Matrix tab

问题是,目前设置为仅适用于那两列日期,我必须更新未来日期的公式,这会变得很麻烦。还有,按照目前的编写方式,如果我删除 N 之前的任何列,那么它就会放弃它,因为某些公式使用 INDIRECT,它通过字符串文本提及这些列名称,而不是实际连接列来动态更新和他们在一起。 这是历史矩阵的单元格 B3 中当前的公式:

=IF(B$2=$A3, "x", SUM((--('Group History'!$N3=INDIRECT("Group History!$N"&COLUMN(B$2)+1))) + (--('Group History'!$O3=INDIRECT("Group History!$O"&COLUMN(B$2)+1)))))

查看电子表格的链接

复制链接

我尝试过 ChatGPT premium,但它只是绕圈子,没有任何帮助。

google-sheets excel-formula array-formulas counting
3个回答
1
投票

使用 Microsoft 365,您可以尝试以下操作:

=LET(
    students, 'Group History'!A3:A28,
    grp_assigned, 'Group History'!B3:AD28,
    num_students, ROWS(students),
    st_indices, SEQUENCE(num_students),
    num_shared, LAMBDA(x, y,
        IF(
            x = y,
            "x",
            SUM(
                --BYCOL(
                    CHOOSEROWS(grp_assigned, x, y),
                    LAMBDA(c, IF(SUM(--(LEN(TRIM(c)) = 0)), 0, ROWS(UNIQUE(c)) = 1))
                )
            )
        )
    ),
    history_matrix, MAKEARRAY(num_students, num_students, num_shared),
    HSTACK(VSTACK("", students), VSTACK(TOROW(students), history_matrix))
)

结果:

Result

一次迭代两行(学生),然后按每个(日期)列迭代:

  • 如果有空白,则设置列数 = 0
    SUM(--(LEN(TRIM(c)) = 0))
  • 如果共享,唯一计数将为 1
    ROWS(UNIQUE(c)) = 1

请根据未来可能的条目调整范围

B3:AD28


Google 表格

似乎需要进行一些调整:

  • BYCOL
    ,与
    --(ROWS(UNIQUE(c)) = 1)
  • 检查空白行
    sum(--byrow(c, lambda(a, len(trim(a)) = 0)))
=LET(
    students, 'Group History'!A3:A28,
    grp_assigned, 'Group History'!B3:AD28,
    num_students, ROWS(students),
    st_indices, SEQUENCE(num_students),
    num_shared, LAMBDA(x, y,
        IF(
            x = y,
            "x",
            SUM(
                BYCOL(
                    CHOOSEROWS(grp_assigned, x, y),
                    LAMBDA(c, IF(sum(--byrow(c, lambda(a, len(trim(a)) = 0))), 0, --(ROWS(UNIQUE(c)) = 1)))
                )
            )
        )
    ),
    history_matrix, MAKEARRAY(num_students, num_students, num_shared),
    result, HSTACK(VSTACK("", students), VSTACK(TOROW(students), history_matrix)),
result
)

Sheets result


1
投票

假设您的表格都从单元格

A1
开始,在
'Group History'!B2
中,输入:

 =IF($A2<>B$1,SUMPRODUCT((XLOOKUP($A2,'Group History'!$A$3:$A$28,'Group History'!$B$3:$S$28, 0,0)=XLOOKUP(B$1,'Group History'!$A$3:$A$28,'Group History'!$B$3:$S$28,0,0))*(XLOOKUP($A2,'Group History'!$A$3:$A$28,'Group History'!$B$3:$S$28, 0,0)<>"")),"x")

然后将公式复制到右侧。


1
投票

使用自动向下和向右填充的数组公式来实现这一点的一种方法是,首先将数据逆透视为面向行的格式,然后迭代学生,计算他们在同一组中的次数其他学生分开。

要取消数据透视,请插入>工作表,将新工作表命名为

Unpivot
,然后将此公式放入单元格
A1
中:

=let( 
  unpivot_, lambda(data, numFixedCols, numColsPerGroup, let(k,n(numFixedCols),d,if(k,data,hstack(sequence(rows(data)),data)),f,if(k,k,1),g,numColsPerGroup,s,lambda(r,c,h,w,chooserows(choosecols(d,sequence(1,w,c)),sequence(h,1,r))),h,hstack(s(1,1,1,f),"Date","GroupID"),i,sequence(1,(columns(d)-f)/g,f+1,g),a,reduce(h,sequence(rows(d)-1,1,2),lambda(a,r,let(x,s(r,1,1,f),b,reduce(tocol(æ,2),i,lambda(y,c,let(z,s(r,c,1,g),if(""=+z,y,vstack(y,hstack(x,s(1,c,1,1),z)))))),vstack(a,b)))),if(k,a,choosecols(a,sequence(1,columns(a)-1,2))))), 

  unpivot_('Group History'!A2:ZZ, 1, 1) 
)

这将一直有效到第

ZZ
列,但如果需要,您可以一直到
ZZZ

要获取矩阵,请插入另一张纸并将此公式放在那里:

=let( 
  students, tocol('Group History'!A3:A, 1), 
  data, filter(Unpivot!A2:C, len(Unpivot!A2:A)), 
  names, choosecols(data, 1), 
  dates, choosecols(data, 2), 
  groupIds, choosecols(data, 3), 
  matrix, map(students, lambda(s, let( 
    d, filter(dates, names = s), 
    i, filter(groupIds, names = s), 
    inSameGroup, filter(names, match(dates & groupIds, d & i, 0)), 
    counts, query(inSameGroup, "select Col1, count(Col1) group by Col1", 0), 
    row, arrayformula(ifna(vlookup( 
      torow(students), counts, 2, false 
    ))), 
    arrayformula(if(torow(students) = s, "x", row)) 
  ))), 
  vstack( 
    hstack( 
      "in the same group on the same date", 
      torow(students) 
    ), 
    hstack(students, matrix) 
  ) 
)

screenshot

让(), lambda(), 地图(), vstack(), hstack(), 选择cols(), 过滤器()vlookup(), 匹配()数组公式(), 查询(), 托罗()tocol().

© www.soinside.com 2019 - 2024. All rights reserved.