【问题标题】:Aggregating Excel cell contents that match a label聚合与标签匹配的 Excel 单元格内容
【发布时间】:2014-04-08 02:41:14
【问题描述】:

我确信这不是一件非常困难的事情,但它不是那种很容易适合互联网搜索的问题。

我被分配了一个涉及复杂电子表格的项目。我已经完成了通常的 =SUM 和其他基本 Excel 公式,并且我有足够的编码背景,我至少能够通过 VBA 捏造自己的方式,但我不确定如何处理其中的一部分任务。

简单版本:在工作表 1 上,我有一个人员列表(每行一个,A 列中的人名),在工作表 2 上,我有一个组列表(每行一个,A 列中的组名)。表 1 中的每个名称都有自己的行,我有一个“数据验证”下拉菜单,您可以在其中选择每个人所属的组。

该下拉列表来自工作表 2,其中每个组都有一行。所以本质上,Sheet 1 的“Group”列的数据验证源只是“=Sheet2!$a1:a100”或其他什么。

问题是这样的:我希望工作表 2 中的每个组行都有一个公式,该公式会生成在工作表 1 上分配给该组的所有用户的列表。我的意思是相当于“选择* 来自 PeopleTab,其中 GROUP = ThisGroup”。生成的单元格只会将名称粘在一起,例如“Bob Smith、Joe Jones、Sally Sanderson”

我已经在谷歌上搜索了几个小时,但我想不出一种方法来表达我的搜索查询以获得我想要的结果。

这是一个所需结果的示例(以破折号分隔。找不到让它看起来不错的方法,表格标签似乎在这里不起作用):

(表 1)
Bob Smith - 第 1 组(从下拉列表中选择)
Joe Jones - 第 2 组(从下拉列表中选择)
Sally Sanderson - 第 1 组(从下拉列表中选择)

(第 2 页)
第 1 组 - Bob Smith、Sally Sanderson(公式结果)
第 2 组 - 乔·琼斯(公式结果)

我在表 2 的第二列中使用什么公式(甚至什么函数)来从该组的成员中制作一个平面列表?

【问题讨论】:

  • 您可以使用 ADO 来查询 Excel 表格。
  • 听起来像是filter 的工作;唯一的问题是你会得到一个列的结果,而不是一行。
  • ^ 实际上不是问题; transpose 救援:P

标签: excel vba ms-office


【解决方案1】:

我已经使用FILTER 公式来实现类似的效果。基本格式是:

=FILTER(source, condition, [more conditions...])

这表示“获取我的源范围,并返回匹配每个条件的单元格”。

您可以引用整个列(第一个工作表中的名称,A 列),并使用 'Sheet1'!A:A 作为源,按另一列(工作表 1 的 B 列中选择的组)的内容过滤这些值, 和EQ('Sheet1'!B:B, $Ax) 作为条件,其中$Ax 是对Sheet 2 A 列中组名的引用(将x 替换为行号)。

例如在sheet2 你可以有这样的东西:

-------------------------------------------------------------------
|   A    |   B
-------------------------------------------------------------------
| Group1 | =TRANSPOSE(FILTER('Sheet1'!A:A, EQ('Sheet1'!B:B, $A1)))
-------------------------------------------------------------------
| Group2 | =TRANSPOSE(FILTER('Sheet1'!A:A, EQ('Sheet1'!B:B, $A2)))
-------------------------------------------------------------------

TRANSPOSE 是必需的,因为您的源范围是一列,因此您从 FILTER 得到一列。 Transpose 只是将该列转置为一行:)

附带说明,您可以使用过滤器做其他简洁的事情,例如查找过滤范围的总和 (=SUM(FILTER(...))) 等等;我在预算电子表格中使用它来计算按月份和类别分组和汇总的收入/支出。

免责声明:在谷歌文档电子表格中测试,因为我没有 MS Excel。

【讨论】:

  • 这看起来很棒,而且完全符合我的需要,但据我所知,Excel 没有公式的过滤功能 (office.microsoft.com/en-us/excel-help/…)。试图找到等价物。
  • 嗯-我担心...vlookup 可能有用,但我认为您必须交换列(即,将他的组放在第 1 列,将姓名放在第 2 列)。或者,使用谷歌电子表格是一种选择...... :)
  • 一段时间以来,我一直在努力让他们从 Excel/Office 中转换出来。简短的回答:失去的原因。我去看看 vlookup,谢谢
  • 除非有人带着正确的 Excel 魔法出现,否则我会接受你的答案,因为这是一个很好的答案(遗憾的是,它并不完全适用)
  • @Josh 不幸的是,我无法访问 excel,否则我会四处玩耍并尝试找出可行的方法。祝你好运!如果你弄明白了,你应该发布你自己的答案并接受那个。
【解决方案2】:

在表 1 中: VBA

Private Sub worksheet_Change(ByVal Target as Range)
  if target.row =1 and target.value<>"" then target.offset(,1)=sheets("sheet2").cells(application.match(target.value,sheets("sheets").columns(1),0),2).value
End sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多