2015-09-14 61 views

回答

0

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

这是一个阵列式,并且必须以Ctrl键 + 移位来确认 + 输入

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

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

就是这样。

这里是如何工作的...

假设A1单元格的值是11101111

所以,这是一个总的八个字符。我们可以看到其中有7个是1,1个是0.

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

该公式的核心是MID()函数。我们用它来将这个值分成八个独立的字符。

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

例如:=MID(A1,3,3)在参考我们的A1时将返回101

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

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

这是数组公式出现的位置。请记住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键的排列方式 + 输入

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

即使从一个单元格看完整结果的另一种方法是在“公式栏”中选择完整公式,然后按键盘上的012键。该公式将替换为公式栏中的结果。您可以使用此技术来评估公式或较大公式的谨慎部分。如果您按输入结果将保留在配方栏中。如果您想要公式,请按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。当我们用第二个减号命中它时,-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秒表示原始源零,结果是源零的计数。

我们进行最后一个测试,看看结果是等于一个,因为你要知道,如果在单元格A1值有且仅有一个零吧:

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

结果为真。

+0

@KjubE这个为你工作 ? –

相关问题