答案1
对于您的示例来说,这已经足够了。您需要进行一些修改才能与实际数据库匹配。
Example Data
Company | Address | City | State | ZIP | Phone | GM | EmailGM | PD | EmailPD | SM | EmailSM | PRM | EmailPRM
ABC | 1234 M | Saint | MN | zip | phone | gm | gm1@gm | pd | pd1@pd | sm | sm1@sm | prm | prm@prm
Result
Company | Address | City | State | ZIP | Phone | Name | Email
ABC | 1234 M | Saint | MN | zip | phone | gm | gm1@gm
ABC | 1234 M | Saint | MN | zip | phone | pd | pd1@pd
ABC | 1234 M | Saint | MN | zip | phone | sm | sm1@sm
ABC | 1234 M | Saint | MN | zip | phone | prm | prm1@prm
Company column (and Address, City, State, ZIP, Phone)
=INDIRECT("A"&(CEILING((ROW()+1)/4-1, 1)))
Name column (and Email)
=INDIRECT(CHAR(CODE("G")+MOD((ROW()-2), 4)*2)&CEILING((ROW()-1)/4+1, 1))
解释
在公司列,公式引用"A"
列并且行号从当前行开始计算。
ROW()-1
将行号调整回来,因为我们在数据表中有标题。我们使用数字1因为数据表数据从行开始2,而不是行1。
/4 + 1
基本上复制结果行4次,然后将结果行号向前调整一,因为我们在数据表中有标题。我们使用数字4因为我们有4 姓名和电子邮件.我们使用数字1因为数据表数据从行开始2,而不是行1。
CEILING( ... , 1 )
将行号向上舍入为整数。
在名称列中,公式引用列"G"
并且行号从当前行开始计算。
(ROW()-2)
将结果移MOD
回0
。我们使用数字2因为结果表数据从行开始2。
MOD( ... , 4)
计算要获取哪一列。结果为0
表示列G
,1
表示列H
,依此类推。我们使用数字4因为我们有4 姓名和电子邮件。
+ ... * 2
将获取的列移至列右侧G
。the result of modulo, multiplied by 2
我们使用数字2因为我们有2列,姓名和电子邮件,以供获取。
CODE("G")
将字符“G”转换为其 ASCII 码。
CHAR( ... )
将移位列的值(例如,从 7 到 11,即从“G”到“K”列)转换回字符串。
CEILING( ... )
给出要获取的数据行号。
操作说明
只需将列字母更改为匹配的列即可。
例子:
对于地址栏,将字母更改"A"
为"B"
对于电子邮件列,将字母更改"G"
为"H"
笔记
你提到你将拥有7 姓名和电子邮件。您需要调整公式以使用 7 而不是 4。
此公式对您放置此公式的位置很敏感。此公式假设您将它放在第 2 行(第 1 行用于标题)。如果您将它放在第 1 行,则需要进行调整(请参阅解释)
此公式不会跳过空白的姓名和电子邮件。所有公司都将恰好有 4 行,无论可用的姓名和电子邮件数量是多少。
这并非旨在替代数据库,但您可以使用此公式生成的数据来创建数据库。
答案2
在 Excel 中执行此操作的另一种方法是使用Power Query
或Data ► Get and Transform ► From Table
(取决于 Excel 版本)
进入查询编辑器后,选择重复的列,然后 UNPIVOT 其他列。这将为您提供如下表格:
请注意,我重命名了由 UNPIVOT 操作生成的新列。
现在添加第三列,将其标记为“电子邮件”,并在其中输入此公式I2
I2: =IF(ISERR(SEARCH("email",[@Position])),H3,"")
然后只需从电子邮件列中过滤掉空白即可。您可以使用简单的过滤器执行此操作;然后将可见单元格复制/粘贴到结果区域;或者您可以使用高级过滤器,它具有将过滤器结果发送到指定区域的机制: