我有以下Excel电子表格:
A B C D E F G
1 USER1 USER2 MICHAEL SANDRA JAMES CAITLIN
2 Product A Michael James Michael James
3 Product B Sandra Caitlin Sandra Caitlin
4 Product C James Caitlin James Caitlin
5 Product D Michael Sandra Michael Sandra
在列D:G 中列出了4个产品用户。如果用户使用产品,他/她的名称将显示在单元格D2:G5 中。如果他/她不使用该产品,则该单元格仍为空。
在列B:C 中我现在想要实现消除了emtpy单元格,并且列出了最多2个用户。
你知道任何可以通过细胞D2:G5 选择2个用户并在列B:C 中显示它们的公式吗?
答案 0 :(得分:0)
没有公式可能虽然没有VBA或类似可能有点乏味(虽然没有标记的方式):
在C和D之间插入足够的额外列,以便能够将所有D:G复制到C中
将D:G复制到C中并移动D:G的内容(到其他行或其他表/书)。
选择C:F(或等效)中的填充行,HOME>编辑>找到&选择,转到特殊...,空白(仅限)确定。
右键单击其中一个选定单元格并删除...,左移Shift单元格,确定
将D:G复制回E2。
所选择的两个将是左边最远的那些。
答案 1 :(得分:0)
我不知道你可以使用任何快速公式。
最好使用VBA。你可以在那里写一些紧凑而简洁的东西。如果您的矩阵规模会增长,VBA绝对是您的选择。
但是,如果你坚持在Excel中使用可用的公式,并且矩阵仍然相对较小,这是一种方法:
对于“Mask”信息,您需要H列和I列。您可以在完成的工作表中隐藏这些列。
A B C D E F G H I
1 USER1 USER2 MICHAEL SANDRA JAMES CAITLIN MASK1 MASK2
2 Product A Michael James Michael James 1010 10
3 Product B Sandra Caitlin Sandra Caitlin 101 1
4 Product C James Caitlin James Caitlin 11 1
5 Product D Michael Sandra Michael Sandra 1100 100
在单元格H2中,您可以创建第一个Mask:
=IF(D2 <> "",1000,0)+IF(E2 <> "",100,0)+IF(F2 <> "",10,0)+IF(G2 <> "",1,0)
这是一个位置掩码,它在数据存在的每个数字列中放置1。
在USER1的单元格B2中,您可以放置嵌套的IF公式:
=IF(H2>=1000,D2,IF(H2>=100,E2,IF(H2>=10,F2,IF(H2>=1,G2,""))))
这使用Mask查找第一次出现的数据并将其放在USER1列中。
找到第二个用户有点棘手。但我们所要做的就是在第一列中创建第二个Mask。在单元格I2中,您可以使用以下公式:
=IF(LEN(TEXT(H2,0))>1,VALUE(RIGHT(TEXT(H2,0),LEN(TEXT(H2,0))-1)),0)
让我为你打破这个公式。我们想将H2中的第一个Mask转换为文本,以便我们可以修剪掉第一个字符(对应于USER1),因为我们不再需要USER1数据了。使用TEXT(H2,0)
=IF(LEN(TEXT(H2,0))>1,VALUE(RIGHT(TEXT(H2,0),LEN(TEXT(H2,0))-1)),0)
^^^^^^^^^^
但要做一个删除最右边字符的正确修剪,我们需要相同文本字符串的长度减去1. LEN(TEXT(H2,0))-1
=IF(LEN(TEXT(H2,0))>1,VALUE(RIGHT(TEXT(H2,0),LEN(TEXT(H2,0))-1)),0)
^^^^^^^^^^^^^^^^^
使用RIGHT函数中的那些为我们提供了新的Mask,它将删除USER1。
=IF(LEN(TEXT(H2,0))>1,VALUE(RIGHT(TEXT(H2,0),LEN(TEXT(H2,0))-1)),0)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
但我们不能对文本字符串进行数学运算,因此我们必须使用Value函数将其转换回数字。
=IF(LEN(TEXT(H2,0))>1,VALUE(RIGHT(TEXT(H2,0),LEN(TEXT(H2,0))-1)),0)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
这是我们可以用来查找USER2的新的第二个面具。但是,我们还需要测试错误值。如果所有单元格都是空白,则会出现错误,因为右侧函数中的长度不能为0。因此,我们需要测试文本的长度是否大于1. LEN(TEXT(H2,0))>1
=IF(LEN(TEXT(H2,0))>1,VALUE(RIGHT(TEXT(H2,0),LEN(TEXT(H2,0))-1)),0)
^^^^^^^^^^^^^^^^^
在If语句中包含所有内容,现在您拥有了USER2的新Mask。
现在,通过在单元格I2中使用Mask,它是单元格C2的简单嵌套IF公式:
=IF(I2>=100,E2,IF(I2>=10,F2,IF(I2>=1,G2,"")))
由于我们知道USER1会被捕获,因此我们能够将测试丢弃1000次。
现在只需将单元格B2,C2,H2和I2向下复制三行,您的所有数据都会出现。
如果您愿意,可以隐藏H和I列。
所以,总而言之,并不是那么困难(如果你的矩阵仍然很小)。这项工作只需要4个公式。而且它们只是中等复杂性。
但是再一次,如果你的矩阵最终会变大,那么在VBA中写这个就绝对会更好。
希望这有帮助。 :)