从列表中选择多个值并忽略空单元格

时间:2017-06-23 11:59:05

标签: excel

我有以下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 中显示它们的公式吗?

2 个答案:

答案 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中写这个就绝对会更好。

希望这有帮助。 :)