给定 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) ), "")
请注意将其作为数组公式输入:首先选择单元格B2
,B8
然后将上述内容粘贴到公式栏中,并按 Ctrl+Shift+Enter(或在 Mac 上的 Office 中按 Command+Return,或在 Mac 上的 OpenOffice 中按 Command+Shift+Return)保存。
对于C2:C8
,重复将>= 0
条件替换为< 0
。
为了逐步解释这一点,我在 OpenOffice Calc 工作表中添加了以下公式,结果如下。请注意,在 OpenOffice 中需要用分号分隔函数参数,而在 Excel 中可能需要逗号,因此在接下来的公式中使用分号。
在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),"")}