如何将数字拆分为具有负值和正值的列,且没有空单元格?

如何将数字拆分为具有负值和正值的列,且没有空单元格?

给定 Excel 工作表 A 列中的正值和负值,我希望 B 列列出 A 列中的正值,C 列显示负值,按照它们在 A 列中出现的顺序。

但是,我不希望 B 列和 C 列中有任何空单元格。

所以,我不想要:

   A     B     C
----------------
 All   >=0    <0
 100   100
-300        -300
-800        -800
 900   900
 700   700
-200        -200
 900   900

但相反,我想要的是:

   A     B     C
----------------
 All   >=0    <0
 100   100  -300
-300   900  -800
-800   700  -200
 900   900
 700
-200
 900

答案1

不是在 Windows 框上。我敢打赌肯定有一个公式可以做到这一点。当然是 VBA:在 VB 编辑器中单击“插入模块”,然后键入:

Sub posInBnegInC(ByRef aList as range)
    Dim cll as Range
    For each Cll in AList
        If cll.value2 > 0 then
            Sheet2.Range("B65000").end(xlup).offset(1,0).value2 = cll.value2
        Else
            Sheet2.Range("C65000").end(xlup).offset(1,0).value2 = cll.value2
        End If
    Next cll
End Sub

如果存在 0 值,您可以添加逻辑来处理该值。代码会将零复制到 C 列。如果 A 列中有非数字数据,它将不起作用,但我认为所有 A 都是数字。然后您可以以多种方式运行,包括:

Sub DoIt()
    call posInBnegInC(Sheet1.Range("A2:A65000"))
End Sub

答案2

你基本上是在问如何获得第 n 个过滤值从某一列到第 n 列另一列。

微软解释了如何获取第 n 个过滤值Excel:查找满足条件的第 n 个值。这使用“数组公式”对数组(列表)中的项目执行计算。Microsoft 的示例可以扩展到获取与行号匹配的值。如果您的数组在 中A2:A8,并且您只想显示值>= 0,则可以使用以下内容B2:B8(未经测试):

=iferror(index(A2:A8, small( if(A2:A8 >= 0, row()-1, ""), row()-1) ), "")

请注意将其作为数组公式输入:首先选择单元格B2B8然后将上述内容粘贴到公式栏中,并按 Ctrl+Shift+Enter(或在 Mac 上的 Office 中按 Command+Return,或在 Mac 上的 OpenOffice 中按 Command+Shift+Return)保存。

对于C2:C8,重复将>= 0条件替换为< 0

为了逐步解释这一点,我在 OpenOffice Calc 工作表中添加了以下公式,结果如下。请注意,在 OpenOffice 中需要用分号分隔函数参数,而在 Excel 中可能需要逗号,因此在接下来的公式中使用分号。

OpenOffice 结果

D2:D8

=if(A2:A8 >= 0; row()-1; "")

如果值为在同一行A2:A8正数,否则为空单元格。减 1 会将第 2 行至第 8 行转换为第 1 行至第 7 行,以忽略第一个标题行。

所以,现在我们知道第 1、第 4、第 5 和第 7 个值A2:A8是正数。

接下来,在E2:E8

=small( if(A2:A8 >= 0; row()-1; ""); row()-1 )

这将以先前的结果作为输入small(..., k) 哪个取 中先前显示的第 k 个最小数字D2:D8。(该列表恰好按 1 到 7 排序,但这对于函数来说甚至不是必需的small。)在这里,我们将k当前行号设置为减 1,以再次忽略标题行。因此,对于第 3 行,我们得到了 中第 2 个正值的位置A2:A8。但是对于E6和 向下,没有找到任何值,显示错误。

F2:F8

=index(A2:A8; small( if(A2:A8 >= 0; row()-1; ""); row()-1 ))

这需要职位上一步中的 1、4、5 和 7(以及错误)作为的输入index(..., k)哪个找到第 k 个价值来自,如果无效A2:A8则出现错误。k

现在,F2:F8最后几行仍然显示错误。在 Excel 2007 及更高版本中,可以使用iferror在出现错误时不显示任何内容,就像上面第一个公式中所使用的一样。OpenOffice不支持,但需要用 中的公式if(iserror(...); ""; ...)替换。不太好。...F2:F8

或者,在从第一列获取实际值时使用index(A2:A9; ...)包含单元格A9,然后以某种方式使 OpenOffice 使用,small(...; 8)如果没有找到更多值。例如G2:G8

=if(A2:A8 >= 0; row()-1; 8)

这仍然会在 7 个值中搜索正数A2:A8,但如果不是正数则返回8

H2:H8

=small( if(A2:A8 >= 0; row()-1; 8); row()-1 )

最后是I2:I8

=index(A2:A9; small( if(A2:A8 >= 0; row()-1; 8); row()-1 ))

这里,值8映射到中的值A9。示例屏幕截图中A9包含一些点,然后在中显示H6:H8为没有找到更多正数。

像微软写道如果你真的想掌握 Excel 中的公式,你需要知道如何使用数组公式。 享受。

答案3

Arjan 已经提到过两次了,但我还是想把它作为实际答案发布,而不是评论。他说帖子被锁定了,但我对 Stack Exchange 还很陌生,不明白为什么它被锁定了,但我仍然可以把它作为答案发布。无论如何,微软对此有一个确切的解决方案。我只需要稍微修改一下,将其包装在 IFERROR 中以返回空白而不是 #NUM!错误。


http://support.microsoft.com/kb/101167 正如知识库文章所述,请务必以数组公式的形式输入它们

积极的一面:

{=IFERROR(INDEX($A$2:$A$8,SMALL(IF($A$2:$A$8>0,ROW($A$2:$A$8),""),ROW()-1)-ROW($A$2:$A$8)+1),"")}

缺点:

{=IFERROR(INDEX($A$2:$A$8,SMALL(IF($A$2:$A$8<0,ROW($A$2:$A$8),""),ROW()-1)-ROW($A$2:$A$8)+1),"")}

相关内容