在Excel中从公式返回空单元格

264

我需要从Excel公式中返回一个空单元格,但是看起来Excel会将空字符串或对空单元格的引用与真正的空单元格区分对待。因此,我需要类似于以下内容:

=IF(some_condition,EMPTY(),some_value)

我曾尝试过一些事情,例如

=IF(some_condition,"",some_value)

=IF(some_condition,,some_value)

假设B1是一个空单元格

=IF(some_condition,B1,some_value)

但这些似乎都不是真正的空单元格,我猜测这是因为它们是公式的结果。是否有办法仅当满足某些条件时填充单元格,否则保持单元格为空?

编辑:如建议所述,我尝试返回NA(),但对于我的目的,这也行不通。是否有用VB实现此操作的方法?

编辑:我正在构建一个工作表,从其他工作表中获取数据,并将其格式化为导入数据到数据库应用程序的非常特定要求。我无法更改此应用程序的实现方式,如果值为空字符串而不是真正的空值,则会失败。


8
您能解释一下为什么单元格需要空白吗?根据“空白”能给您带来什么,可能会有解决方法。 - J.T. Grimes
3
这个单元格包含公式,不是吗?那么它怎么可能是空的或者空白的呢? - Sinan Ünür
11
我有一个类似的问题,我正在绘制一个图表,不想在图表上显示空项目的值为0。如果记录是空单元格,则会从图表中省略它们,但是“答案”下面列出的任何方法都会导致在图表上显示0。 :( - Cobusve
5
为避免在图表中显示零值,应使用NA()函数替代空字符串/零。这将在单元格中放置#N/A,而图表程序会忽略它。 - Rob
5
Rob建议使用#N/A与空单元格具有不同的结果。 #N/A将导致绘图程序在单元格上进行插值处理,而真正的空单元格将被视为线条中的间隙。如果您想要在线条中显示间隙而不是穿越间隙的插值处理,则需要使单元格为空,而不是#N/A。下面有解决方案可以按照问题要求解决此问题。 - Mr Purple
显示剩余2条评论
20个回答

98

Excel没有任何方法可以做到这一点。

在Excel单元格中的公式结果必须是数字、文本、逻辑(布尔)或错误。没有"空"或"空白"的公式单元格值类型。

我看到过的一种做法是使用NA()和ISNA(),但这可能或可能不真正解决您的问题,因为NA()被其他函数处理的方式有很大的差异(如果A1为空,则SUM(A1)为0,而SUM(NA())为#N/A)。


26
如果图表设置了将空单元格显示为空白,那么NA()方法可以完美适用,但在导出到需要单元格为空白的应用程序中(因为它包含公式),这种方法可能无法奏效。 - Cobusve
4
没有完美的解决方案。 NA()是一个不错的选择。 另一个选项是空字符串,可以是''或""。 - Jason
这个方法适用于返回动态数据中的空单元格,以便您可以有效地使用忽略空单元格作为图表中间隙的选项。在我的情况下,我试图绘制12个值来表示每月的进展,但只到上个月,使用类似这样的公式:=IF(MONTH(TODAY())>C2;$C$11+C7;NA())。 - EKI
这对我有用。我有一个包含每天新增数据的图表 - scrum 的 burndown 图表,我想仅将线条延伸到当前日期。这帮助我做到了 - 使用 IF 语句中的 NA()。谢谢! - theJerm
我们发现,通过SSIS导入数据时,如果在一个包含空字符串的单元格上按下“删除”键,则SSIS会导入NULL值。因此,Excel可以表示这种情况,只是似乎无法通过公式设置。 - Nick.McDermaid
15
“NA()不会导致间隙”,这句话常被人误解。如果一个数值为NA()或#N/A,Excel不会在图表中显示该数据点,但会在相邻的非#N/A数值之间绘制一条插值线。请注意,这并不意味着有间隔存在。 - Jon Peltier

57
你需要使用VBA,然后遍历范围内的单元格,测试条件,如果匹配则删除内容。类似这样的代码:
For Each cell in SomeRange
  If (cell.value = SomeTest) Then cell.ClearContents
Next

6
我会补充一点:如果您总是希望清除特定单元格范围中的空白单元格,您可以给该区域命名,然后修改Boofus'公式,将SomeRange更改为Range("MyRange")。要为您的单元格设置名称,请选择这些单元格,点击功能区上的“公式”选项卡中的“定义名称”,并在名称字段中输入“MyRange”。(当然,您可以用任何您想要的名称替换MyRange。) - devuxer
37
Excel 中没有空常量,这相当强烈。 - ted.strauss
5
如果您将宏放置在worksheet_calculate()函数中,则会自动清空单元格。有关详细信息,请参阅下面的我的回答。 - Mr Purple
4
@ted.strauss,这里出现了VbNullString - brettdj
8
@brettdj这是VBA,不是Excel。我们已经长期努力游说加入类似NULL()或BLANK()的函数,但一直未能如愿。 - Jon Peltier
显示剩余5条评论

45

是的,这是可能的。

如果满足条件,可以使用公式返回trueblank。它通过ISBLANK公式的测试。唯一的不便之处在于,当条件满足时,该公式将消失,您需要重新输入它。您可以设计一个免疫自我销毁的公式,使其将结果返回到相邻的单元格。是的,这也是可能的。

在此输入图像描述

你只需要设置一个命名范围,比如GetTrueBlank,就可以像在你的问题中一样使用以下模式:

=IF(A1 = "Hello world", GetTrueBlank, A1)

步骤1。 将此代码放入VBA模块中。

Function Delete_UDF(rng)
    ThisWorkbook.Application.Volatile
    rng.Value = ""
End Function

步骤2。Sheet1A1单元格中添加名为GetTrueBlank的命名范围,公式如下:

=EVALUATE("Delete_UDF("&CELL("address",Sheet1!A1)&")")

enter image description here

就这样。没有其他步骤了。只需使用自我抵消公式。将以下公式放入单元格(例如B2)中:

=IF(A2=0,GetTrueBlank,A2)

如果您在A2中键入0,则B2中的公式将计算为trueblank。

您可以在此下载演示文件

在上面的示例中,将公式计算为trueblank会导致单元格为空。使用ISBLANK公式检查单元格会得到TRUE。这是自杀行为。当满足条件时,公式会从单元格中消失。虽然您可能希望公式不会消失,但目标已经实现。

您可以修改公式以在相邻单元格中返回结果,以便公式不会自我删除。请参阅如何在相邻单元格中获取UDF结果

adjacent cell

我曾经遇到过The FrankensTeam在此处揭示的作为公式结果的trueblank示例:https://sites.google.com/site/e90e50/excel-formula-to-change-the-value-of-another-cell


7
这是一个非常巧妙的解决方法,但很疯狂,竟然没有其他方法可以在不清空单元格的情况下完成。唯一的缺点就是重新计算时必须记得再次拖动公式,不过你可以设置工作簿事件来自动完成这个步骤。 - Some_Guy
在尝试使用巧妙的解决方法之前,请注意它可能会适得其反。参考链接 - GSerg
@PrzemyslawRemin 不,我的意思是可能会发生各种随机的事情,包括崩溃Excel - GSerg
似乎可以使用辅助列来监视A2。如果A2发生变化,辅助列可以将该公式转储到B2中,以便A2准备好再次变为零。 - jqning

22

也许这是作弊,但它有效!

我还需要一个表格作为图形的数据源,我不希望任何空白或零单元格产生图形上的点。确实需要设置图形属性,选择数据,隐藏和空单元格为“显示空单元格为空隙”(点击单选按钮)。这是第一步。

然后,在可能出现您不想绘制的结果的单元格中,使用一个IF语句并将NA()结果的公式放在其中,例如:=IF($A8>TODAY(),NA(), *要绘制的公式*)

这确实可以给出所需的图形,并在出现无效单元格值时不产生点。当然,这会使所有带有该无效值的单元格读取#N/A,看起来很凌乱。

为了清理这个问题,请选择可能包含无效值的单元格,然后选择条件格式 - 新建规则。选择“仅对包含内容的单元格进行格式化”,并在规则描述下拉框中选择“错误”。然后在格式下选择字体-颜色-白色(或者您的背景颜色是什么)。点击各种按钮退出,您应该看到带有无效数据的单元格看起来是空白的(实际上它们包含#N/A,但白色文本在白色背景上看起来是空白的)。然后链接的图形也不会显示无效值点。


7
不!!!“将空单元格显示为空白”要求单元格是空的。如果它们包含的不是空白,而是 #N/A,那么绘图程序会在 #N/A 单元格上进行插值,而不是将它们保留为线条中的间隙。如果你希望对 #N/A 单元格进行插值,那很好,但在这种情况下,“将空单元格显示为空白”不适用。 - Mr Purple
5
这不是真正的答案,因为它不符合提问者的需求。关于绘图问题应该另外提一个问题。 - ZX9
它在Excel 2010 (=14.0)中运作良好:图表会忽略空单元格和N/A单元格。 - jumpjack

16

如果目标是在实际值为零的情况下将单元格显示为空,则可以使用以下方法:而不是使用导致单元格为空或空白的公式(因为没有 empty() 函数):

  • 对于想要为空白单元格的位置,返回 0 而不是 "",然后

  • 设置单元格的数字格式,其中需要根据正数和负数来设置(前两个项之间用分号隔开)。在我的情况下,我有 0、1、2... 这些数字,并且我希望 0 显示为空。(我从来没有弄清楚文本参数的作用,但它似乎是必需的。)

0;0;"";"text"@

4
虽然这并不会使单元格为空(没有公式可以使单元格为空),但如果数字为零,它会使其看起来为空。然而,这是不正确的。正确的格式应该是0;-0;""(注意负号),甚至可以是0;-0;,不需要任何引号。第三个分号和“text”@部分是不必要的。以分号分隔的字段的含义是:如何显示正数、负数、零和文本(后者的格式必须包含@)。http://office.microsoft.com/en-gb/excel-help/create-or-delete-a-custom-number-format-HP005199500.aspx - cvoinescu
1
您真是太厉害了,您让我摆脱了Visual Basic的困扰。您就是我的救星! - CommaToast
这个格式不会将文本数据附加到字符串中:"0;0;"";@"。 - undefined

12

以下是我针对所使用的数据集所做的方法。看起来很复杂和愚蠢,但这是学习如何使用上面提到的VB解决方案之外的唯一选择。

  1. 我将所有数据进行了复制,并将数据粘贴为“值”。
  2. 然后,我突出显示了粘贴的数据并使用“替换” (Ctrl-H) 将空单元格替换为某个字母,我选择了 q 因为它在我的数据表中没有出现过。
  3. 最后,我又做了一次“替换”,将 q 替换为空。

这个三步骤的过程将所有“空”单元格转换为“空白”单元格。我尝试通过将第2步和第3步合并,仅用一个空白单元格替换另一个空白单元格,但那样行不通——我必须用某种实际文本替换空白单元格,然后再用空白单元格替换该文本。


虽然这在你的情况下可能有效,但我需要一种可以自动应用的解决方案。最终,我使用了一个VB宏来删除被确定为空的内容。该宏在保存文件之前运行。 - Bryan Ward
5
因为我不需要自动化,而是需要速度,所以这对我来说是最好的。本质上,这意味着Excel通过查找和替换尊重空白值,这已经足够好了! - rickcnagy

11

在你的IF语句中,使用COUNTBLANK(B1)>0代替ISBLANK(B1)

ISBLANK()不同,COUNTBLANK()""视为空,并返回1。


不幸的是,似乎Excel将=COUNTBLANK(IFNA(VLOOKUP(...),""))视为无效的(!)。 - NetMage

9
哇,很多人都误读了问题。让一个单元格看起来空很容易,但如果你需要这个单元格为空,Excel公式无法返回“没有值”,只能返回一个值。返回零、空格或者是“”都是有值的。
所以你需要返回一个“魔法值”,然后再使用查找和替换或者使用VBA脚本将其替换为没有值。虽然你可以使用空格或“”,但我的建议是使用明显的值,如“NODATE”、“NONUMBER”或“XXXXX”,这样你就可以很容易地看到它出现在哪里——在电子表格中很难找到“”。

1
是的,那就是我所做的。我使用一个函数来生成“#EMPTY”,然后把一些代码放入“工作表计算”事件子程序中。请检查我的答案以获取完整的解决方案。 - Mr Purple

8

尝试使用LEN函数来评估单元格。如果它包含公式,LEN将返回0。如果它包含文本,则会返回大于0的值。


虽然这并不能帮助原问题的提出者,但在许多情况下,这实际上并不是一个坏答案。它适用于那些被迫返回“”的情况。 - Technium
回答很好,但有点令人困惑。我想要测试的单元格返回一个数字或 "" 或为空。如果存在数字(包括零,以及通过公式计算得出的数字),则 LEN(cell)>0 返回 true,如果是空字符串或空,则返回 false。 - Chris

7
很多答案返回的值看起来是空的,但实际上并不是请求的空单元格......
按要求,如果您真的想要一个返回空单元格的公式。通过 VBA 是可以实现的。因此,这里是代码,可以做到这一点。首先编写一个公式,在希望单元格为空的位置返回 #N/A 错误。然后我的解决方案会自动清除所有包含该 #N/A 错误的单元格。当然,您可以根据自己的喜好修改代码以基于任何条件自动删除单元格内容。
打开 "Visual Basic 查看器" (Alt + F11) 在项目浏览器中找到感兴趣的工作簿,双击它 (或右键单击并选择查看代码)。这将打开 "查看代码" 窗口。在 (一般) 下拉菜单中选择 "工作簿",在 (声明) 下拉菜单中选择 "SheetCalculate"。
将以下代码 (基于 J.T. Grimes 的答案) 复制粘贴到 Workbook_SheetCalculate 函数中。
    For Each cell In Sh.UsedRange.Cells
        If IsError(cell.Value) Then
            If (cell.Value = CVErr(xlErrNA)) Then cell.ClearContents
        End If
    Next

将文件保存为启用宏的工作簿

注意:这个过程就像手术一样精细。它会删除任何计算出 #N/A 错误的单元格的整个内容,所以请注意。它们将消失,并且您不能在不重新输入其原先包含的公式的情况下取回它们。

注意2:显然,在打开文件时需要启用宏,否则它将无法工作,#N/A 错误将保持未删除状态。


2
如果您需要完全自动化/无需干预/动态化,而且不想重新输入公式以生成#NA错误,则可以重写宏代码以复制相关工作表,并在#NA的位置留下空单元格,然后从副本工作表生成图表。(如果此评论被投票支持,我将添加代码)。 - Mr Purple

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接