我有以下数据集,我正在尝试重新排序以使用 Word 进行邮件合并。我需要隐藏空单元格并将数组中的用户名与其所属的公司名称进行匹配。
我使用以下解决方案来满足第一个条件
=INDEX(CompanyName,MATCH(1,MMULT(--(Attendee=G4),TRANSPOSE(COLUMN(Attendee)^0)),0))
但这意味着我必须先输入用户名,然后才能匹配公司
和
=INDEX(Attendee,MATCH(0,COUNTIF($G$4:I4,list),0))
给我水平列表中的用户名....但我需要它以垂直格式列出
ecompany name, user1, user2, user3, user4, user5, user6, user7
company1, bob, sue, dave, , ,john, mary
company2, dave, barry, steve, dan, , , pete
我希望邮件合并时数据显示在两列中
Company Name, User
company1, bob
company1, sue
company1, dave
company1, john
company1, mary
company2, dave
company2, dave
company2, barry
company2, steve
company2, dan
company2, pete
我希望这是有道理的?
这是我在示例中寻找的结果。不幸的是,它需要预填充第一列中的名称,然后才能与用户匹配。
输出样本:
答案1
好的。这仍然是一种“愚蠢”的方法,但它只需要一个简单的手动步骤,并且实际上符合规范,因为它按照要求在两列中显示结果。
步骤1:
我定义了命名范围 COMPANIES F2:F99 和 NAMES L2:AB99
第2步:
B 列中的公式为:
=INDEX(NAMES,ROUNDUP((ROW()-1)/17,0),MOD(ROW()-2,17)+1)
它只是一个第 n 列/每 n 行公式,其中 n 手动设置为 17(您可以根据需要轻松更改该硬编码值或将其替换为某种计数函数或数据表上计数函数的单元格引用等)。它必须从第二行开始(如示例所示),否则ROW()
需要调整调用的偏移量。但是放在单元格中的新工作表中B2
,此公式将向下复制,并读取命名范围 NAMES 第一行的前 17 列,然后读取第二行的前 17 列,依此类推。
步骤3:
我编写了A2
相同公式的半成品版本,仅获取命名范围的第一行 17 次,然后获取第二行等:
=INDEX(COMPANIES,ROUNDUP((ROW()-1)/17,0))
可以将其重写为索引匹配以获取与步骤 2 中检索到的与会者姓名值对应的公司名称值,但我没有看到该用例中的实用性。
步骤4:
这是愚蠢的部分...拿出你的输出表,全选,复制,粘贴值,过滤,删除 B 列中为 0 的行,删除过滤器,重新排序,就这样了。
后记
我确信使用 VBA 中的 for 循环可以更干净地完成此操作。您甚至可以在此子版块的其他问题中找到可快速适应此确切用例的代码。我确信,无需第 4 步,只需使用比我更专业的人编写的漂亮公式即可完成此操作。幸运的是,无论您的与会者名单有多大,第 4 步都只需要大约 10 秒钟,因此在这种情况下,快速而粗略的方法有效。
答案2
你可以转置吗?
因此,如果我理解正确的话,当您将值粘贴在水平线上时。
如果您复制这些内容并在想要粘贴它们的列中,选择选择性粘贴并选择转置,它会将它们放在该列中但垂直粘贴。
答案3
我评论要求澄清你到底需要多么优雅...如果答案是“不是很”,这将是一种简单、黑客的方式,需要一点手动努力,而不是一个可以一直起作用的上帝公式(我会考虑一下):
这假设您有一个合理(且已知)的最大参会人数。您的屏幕截图显示为 6。
目标单元格区域左上角的公式是:
=IF(ISBLANK(L2),"",CONCATENATE($E2,", ",L2))
该公式复制/拖动,产生如图所示的结果。
从那里,可以轻松复制整个输出数据块(如图所示,我的示例表中的 L8:Q12),粘贴值,并手动将输出列 2 到 6 移动到第 1 列下方(因此在我的示例表中选择 M8:M12,剪切并粘贴到 L13 等),然后按字母顺序排序以推出空白数据,您就得到了 MM 的列表。