我在Excel中有五个单元格,填充为1和0,现在我想检查这五个单元格中是否只有一次零?
实施例: (11110)是的 (11100)假
我需要一个没有VB的常规Excel函数。
答案 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。