检查单元格是否只包含一次值

时间:2015-09-14 22:31:29

标签: excel

我在Excel中有五个单元格,填充为1和0,现在我想检查这五个单元格中是否只有一次零?

实施例: (11110)是的 (11100)假

我需要一个没有VB的常规Excel函数。

1 个答案:

答案 0 :(得分:0)

假设值在单元格A1中,请使用以下公式:

这是一个数组公式,必须使用 Ctrl + Shift + Enter 确认。

=1=SUM(--(MID(A1,ROW(OFFSET($A$1,,,LEN(A1))),1)="0"))

现在复制公式以指向其他四个单元格。

那就是它。

以下是它的工作方式......

让我们说单元格A1的值是11101111

所以,这总共有8个字符。我们可以看到其中七个是1,一个是0。

但是我们如何让Excel看到同样的东西呢?

公式的核心是MID()函数。我们使用它将值拆分为八个单独的字符。

在正常使用情况下,MID()函数只返回较大字符串中的一个文本子字符串。您可以在较大的文本中提供它的起始位置以及您想要的子串的长度,并返回该子串。

例如:=MID(A1,3,3)在引用我们的A1时会返回101

如果我们将其更改为:=MID(A1,4,1),我们会获得0

但是我们怎样才能让MID()函数将A1中的值完全分解为谨慎的单字符子串。请记住,MID()通常只返回一个子字符串。但在我们的例子中,我们希望它返回8个子串。

这是数组公式的用武之地。请记住,MID()的第二个参数是我们想要的子字符串的起始位置。如果我们将第二个参数传递给一个数字数组而不是一个数字,那么MID()将为数组中的每个值执行一次它的函数。

在Excel中指定数组的一种方法是使用和数组常量。所以我们可以将MID()示例更改为:

=MID(A1,{1;2;3;4;5;6;7;8},1)

结果如下所示:{"1";"1";"1";"0";"1";"1";"1";"1"}

现在,如果您只在一个单元格中输入上述公式,您将只看到第一个元素,即一个元素。但是,如果您选择了八个垂直单元格的范围,然后单击工作表顶部的公式栏并输入公式,然后使用 Ctrl + Shift确认阵列方式 + 输入

...您会看到这八个不同的值出现在所选范围内。

另一种查看完整结果的方法,即使是从一个单元格,也可以选择公式栏中的完整公式,然后按键盘上的 F9 键。公式将替换为公式栏中的结果。您可以使用此技术来评估较大公式的公式或谨慎部分。如果按 Enter ,结果将保留在公式栏中。如果您想要公式,请按 Esc

使用数组常量的问题是,只有当单元格A1中的文本正好长达8个字符或更短时,它才能正常工作。如果我们想处理更长的文本,那么我们需要一个具有更多值的数组常量。解决此问题的一种方法是使用公式动态创建一个数组,当计算得到的数组看起来像我们的数组常量。我们将这个公式设计为具有与单元格A1中文本中的字符完全相同的递增元素数。

这正是我们公式中间的构造所做的:

ROW(OFFSET($A$1,,,LEN(A1))

回想一下,当MID()函数完成时,我们留下了这个结果数组:{"1";"1";"1";"0";"1";"1";"1";"1"}

现在我们对每个元素应用逻辑测试,询问每个元素是否等于0

以下是这样的:

{"1";"1";"1";"0";"1";"1";"1";"1"}=0

返回一个新的数组结果,如下所示:

{FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE}

请注意,只有第4个元素为TRUE,这当然是完全正确的。

这样的进步。

现在我们要计算有多少元素为TRUE。我们知道答案是一个。但Excel如何解决这个问题?

如果我们的数组是数字而不是这些布尔值为TRUE和FALSE,那就太好了。将布尔数组转换为数字的简单方法是在数组前面使用两个减号。当TRUE值变为负数时,它变为一个数字;它变成-1。当我们使用第2个减号触及它时,-1变为+1。当然,FALSE变为0

这样做会是这样的:

--({FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE}=0)

结果看起来像这样:

{0;0;0;1;0;0;0;0}

请注意,该数组现在由数字组成。当我们第一次查看MID()函数的结果时,它看起来像这样:{"1";"1";"1";"0";"1";"1";"1";"1"}并且那些不是数字;他们是文字。注意所有的引号。

如果您正在密切关注,您可能想知道为什么我们不能直接在MID()函数的输出上使用这两个减号来将这些文本数转换为实数。嗯,事实上我们可以。但我们想要一个数组,其中1代表源零,0代表源1。换句话说,我们想要逆。采取这些额外的步骤给了我们。

我们现在可以在数组上使用SUM()。

=SUM{0;0;0;1;0;0;0;0})

由于它仅对1和0进行求和,1表示原始源零,因此结果为源零的计数

我们执行一个最终测试以查看结果是否等于1,因为您想知道单元格A1中的值是否只有一个零:

=1=SUM{0;0;0;1;0;0;0;0})

结果为TRUE。