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


218

我需要从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
您能解释为什么单元格需要空白吗?根据“空白”使您获得什么,可能有解决方法。
JT Grimes,2009年

3
单元格包含公式,不是吗?那怎么能是空的或空白的呢?
SinanÜnür'09

8
我有一个类似的问题,我正在绘制图形,并且不想在图形上显示空白项目的值0。如果记录为空单元格,则会从图表中忽略它们,但是下面“答案”中列出的任何方法都会在图表上显示0。:(
Cobusve 2011年

5
为避免零在图形上显示,请使用NA()函数而不是空字符串/零。这会将#N / A放到单元格中,绘图程序会忽略它。
罗布2014年

5
罗伯建议使用#N / A的结果与空白单元格不同。#N / A将导致制图例程在单元格上插值,而真正空的单元格将被视为行中的间隙。如果您希望在间隙中使用GAP而不是使用INTERPOLATION,则需要使该单元格为空,而不是根据问题为#N / A。下面有一些解决方案可以按要求解决此问题。
紫色先生2014年

Answers:


50

然后,您将必须使用VBA。您将遍历范围内的单元格,测试条件,并在它们匹配时删除内容。

就像是:

For Each cell in SomeRange
  If (cell.value = SomeTest) Then cell.ClearContents
Next

6
我要补充一点:如果您总是有特定范围的单元格想要清除空白单元格,则可以给该范围命名,然后通过将SomeRange更改为Range(“ MyRange”)来修改Boofus的公式。要为您的单元格设置名称,请选择单元格,在功能区的“公式”选项卡上单击“定义名称”,然后在“名称”字段中输入“ MyRange”。(当然,您可以用所需的任何东西代替MyRange。)
devuxer

31
激烈的是,Excel中没有空常量。
ted.strauss

5
如果将宏放在worksheet_calculate()函数中,它将自动清空单元格。有关详细信息,请参见下面的答案。
紫色先生2014年

3
@ ted.strauss有VbNullString
brettdj

5
@brettdj那是VBA,不是Excel。对于诸如NULL()或BLANK()之类的某种功能,我们进行了漫长而艰苦的游说,无济于事。
乔恩·

74

Excel无法执行此操作。

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

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


19
NA()方法适用于设置为将空白单元格显示为间隙的图形的100%,当您导出到需要单元格为空白的应用程序(因为它包含公式)时,这可能不适用于您的情况。
Cobusve

4
没有完美的解决方案。NA()是一个不错的选择。另一个是(取决于)''或“”的空字符串
Jason

这样做的目的是在要绘制的数据中以二维方式返回空单元格,以便您可以有效地使用忽略空单元格作为图形中的间隙的选项。在我的情况下,我试图绘制12个值以表示每月的进度,但仅直到上个月,使用这样的公式:= IF(MONTH(TODAY())> C2; $ C $ 11 + C7; NA( ))
EKI

这对我有用。我有一个图表,其中包含每天添加的数据-一个Scrum的燃尽图,我希望看到该行仅延伸到当天。这帮助我做到了-在IF语句中使用NA()。谢谢!
theJerm'2

12
NA()不会导致差距。每个人都错了。如果值是NA()或#N / A,Excel将不会绘制标记,但是它将在相邻的非#N / A值之间绘制插值线
乔恩·

38

是的,有可能。

如果满足条件,则可能会有一个消灭公式评估为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)&")")

在此处输入图片说明

而已。没有进一步的步骤。只需使用自我消灭公式。将单元格放入B2以下公式:

=IF(A2=0,GetTrueBlank,A2)

B2如果您在中输入0,则中的上述公式将计算为trueblank A2

您可以在此处下载演示文件

在上面的示例中,将公式评估为trueblank将导致一个空单元格。用ISBLANK公式检查结果肯定为TRUE。这就像原木一样。满足条件后,该公式将从单元格中消失。尽管您可能希望公式不消失,但已达到目标。

您可以修改公式以在相邻单元格中返回结果,以使公式不会终止自身。 了解如何获取相邻单元格中的UDF结果

我在这里碰到过由The FrankensTeam透露的将真实结果作为公式结果的示例:https//sites.google.com/site/e90e50/excel-formula-to-change-the-value-of-another-细胞


5
这是一个不错的解决方法,尽管在没有物理清空单元格的情况下无法做到这一点非常疯狂。这里唯一的缺点是,尽管我猜您可以设置一个工作簿事件来执行此操作,但是您必须记住在重新计算时重新拖动公式。
Some_Guy

在尝试使用最佳解决方法之前,请注意可能会适得其反
Gserg

@GSerg您是否只是在说可以用VBA循环一个无限循环,这样程序将挂起?VBA可能是猴子手中的剃刀。而且有传言说狮子也击退了,应该会吓到更多:-)
Przemyslaw Remin

@PrzemyslawRemin不,我是说可能发生各种随机事件,包括崩溃的Excel
Gserg

20

也许这是作弊,但行得通!

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

然后,在可能会导致您不想绘制结果的单元格中,将公式放入带有如下NA()结果的IF语句中=IF($A8>TODAY(),NA(), *formula to be plotted*)

当出现无效的单元格值时,这不会给所需的图没有任何点。当然,这会使所有具有该无效值的单元格变为read #N/A,这很混乱。

要清理此问题,请选择可能包含无效值的单元格,然后选择条件格式 -新规则。选择“仅格式化包含的单元格”,然后在规则说明下从下拉框中选择“错误”。然后在格式下选择字体-颜色-白色(或任何背景色)。单击各种按钮以退出,您应该看到带有无效数据的单元格看起来是空白的(它们实际上包含#N/A但白色背景上的白色文本看起来是空白的。)然后,链接的图也不会显示无效值点。


6
没有!!!“将空单元格显示为空白”要求这些单元格为空。如果它们包含#N / A而不是NOTHING,则绘图例程将在#N / A单元上插值,而不是将它们留为行中的间隙。如果您希望对#N / A单元进行插值,那很好,但是在这种情况下,“将空白单元显示为间隙”不适用
Purple先生

4
@GreenAsJade这不是真正的答案,因为它不符合OP的需求。对于制图问题,确实应该有一个单独的问题。
ZX9

10

这就是我为正在使用的数据集执行的操作。看起来令人费解和愚蠢,但这是学习如何使用上述VB解决方案的唯一选择。

  1. 我对所有数据进行了“复制”,并将数据粘贴为“值”。
  2. 然后,我突出显示了粘贴的数据,并用一些字母“替换”(Ctrl- H)空单元格,我选择了q它,因为它不在我的数据表上的任何地方。
  3. 最后,我做了另一个“替换”,q什么也没替换。

这三步过程将所有“空”单元格变成了“空白”单元格。我尝试通过简单地将空白单元格替换为空白单元格来合并步骤2和3,但这没有用-我不得不替换带有某种实际文本的空白单元格,然后将该文本替换为空白单元格。


尽管这可能适合您的情况,但我需要一个可以自动应用的解决方案。最终,我认为我使用了VB宏来擦除确定为空的内容。该宏在保存文件之前就已运行。
布莱恩·沃德

4
这对我来说是最好的,因为我不需要它是自动的,但是我需要它是快速的。从本质上讲,这意味着Excel尊重通过“查找和替换”添加的空白值,这对我来说已经足够了!
rickcnagy 2014年

10

如果目标是在一个单元格实际上为零时将其显示为空,那么与其使用导致空单元格为空的公式(因为没有empty()函数),而是

  • 您想要空白单元格的地方,返回a 0而不是""然后

  • 像这样设置单元格的数字格式,在这里您将需要为正数和负数(用分号分隔的前两个项目)提供所需的内容。就我而言,我的数字是0、1、2 ...,我希望0显示为空。(我从未弄清楚text参数用于什么目的,但似乎是必需的)。

    0;0;"";"text"@
    

4
虽然这不会使单元格为空(公式无法导致单元格为空),但如果数字为零,则使其看起来为空。但是,这是不正确的。它应该是0; -0;“”(注意减号),甚至是0; -0; 完全没有引号。不需要第三分号和“ text” @部分。以分号分隔的字段的含义是:如何显示正数,负数,零和文本(后一种格式必须包含@)。 office.microsoft.com/en-gb/excel-help/…–
cvoinescu

你是个上帝先生。您使我脱离了Visual Basic。您统治
CommaToast '16

7

尝试使用评估单元格LEN。如果包含公式LEN将返回0。如果包含文字,它将返回大于的文字0


尽管这对原始申请者无济于事,但在许多情况下,这实际上并不是一个错误的答案。它在您被迫返回“”的情况下效果很好。
Technium

好的答案,但有点令人困惑。我要测试的单元格返回数字,""或者为空。LEN(cell)>0如果存在数字(包括零,并且包括该数字是由公式计算得出的),则返回true;如果为空字符串或空,则返回false。
克里斯,

7

哇,很多人误解了这个问题。使单元格看起来很空很容易。问题是,如果您需要该单元格为空,则Excel公式不能返回“无值”,而只能返回一个值。返回零,空格或什至是“”是一个值。

因此,您必须返回“魔术值”,然后使用搜索和替换或使用VBA脚本将其替换为无值。虽然您可以使用空格或“”,但我的建议是使用一个明显的值,例如“ NODATE”或“ NONUMBER”或“ XXXXX”,以便您可以轻松地看到它的出现位置-很难找到“”在电子表格中。


1
是的,那就是我所做的。我使用了一个函数来生成“ #EMPTY”,然后在“工作表计算”事件子例程中弹出了一些代码。查看我的答案以获取完整的解决方案。
紫先生


6

如此众多的返回值的答案看起来像是空的,但实际上并不是作为请求的单元格为空的...

根据要求,如果您实际上想要一个返回空单元格的公式。通过VBA可以实现。因此,这里是恰好做到这一点的代码。首先,编写公式以返回#N / A错误,只要您希望单元格为空即可。然后,我的解决方案会自动清除包含该#N / A错误的所有单元格。当然,您可以修改代码以根据自己的喜好自动删除单元格的内容。

打开“ Visual Basic查看器”(Alt + F11),在项目浏览器中找到感兴趣的工作簿,然后双击它(或右键单击并选择查看代码)。这将打开“查看代码”窗口。在(常规)下拉菜单中选择“工作簿”,在(声明)下拉菜单中选择“ SheetCalculate”。

将以下代码(基于JT 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错误的单元格的全部内容。它们会消失,而您不能在不重新输入它们过去包含的公式的情况下将它们取回。

NB2:显然,当您打开文件时,您需要启用宏,否则它将无法正常工作,并且#N / A错误将保持不变


2
如果您需要它是全自动/免提/动态的,并且您不想重新输入公式以生成#NA错误,则可以重写宏代码以复制有问题的工作表,从而在#NA处留空单元格,然后生成图形从重复的工作表中。(如果对此评论提出异议,我将添加代码)。
紫色先生

4

这个答案不能完全解决OP问题,但是有好几次我遇到类似的问题并寻找答案。

如果可以根据需要重新创建公式或数据(并且从描述中看起来好像可以),那么当您准备运行需要空白单元格实际为空的部分时,可以选择区域和运行以下vba宏。

Sub clearBlanks()
    Dim r As Range
    For Each r In Selection.Cells
        If Len(r.Text) = 0 Then
            r.Clear
        End If
    Next r
End Sub

这将清除当前显示""或仅具有公式的任何单元格的内容


4

我使用的是一个小技巧。我使用了T(1),它返回了一个空单元格。T是excel中的一个函数,如果它是一个字符串,则返回其参数,否则返回一个空单元格。因此,您可以做的是:

=IF(condition,T(1),value)

创建一个零长度的字符串(ISBLANK(CELL)= FALSE)。
vinh,

这有效,应该是公认的答案。非常感谢,艾哈迈德。我的用例有些不同。我想将单元格留空,以便诸如AVERAGE(),MIN(),MAX(),STDEV(),COUNT()和MEDIAN()之类的聚合函数将忽略值。
查理·雷茨

2

我使用以下方法来使我的excel看起来更干净:

当您进行任何计算时,“”将给您错误,因此您要将其视为数字,因此我使用嵌套的if语句返回0而不是“”,然后如果结果为0,则此等式将返回“”

=IF((IF(A5="",0,A5)+IF(B5="",0,B5)) = 0, "",(IF(A5="",0,A5)+IF(B5="",0,B5)))

这样Excel表格看起来会很干净...


1
这不是解决问题的方法。该工作表看起来很干净,但是就图形而言,值“”不是“空”。
GreenAsJade 2014年

1

如果使用诸如HLOOKUP和VLOOKUP之类的查找函数将数据带入工作表,请将函数放在方括号内,该函数将返回一个空单元格,而不是{0}。例如,

如果查找单元为空,则将返回零值:

    =HLOOKUP("Lookup Value",Array,ROW,FALSE)

如果查找单元为空,这将返回一个空单元:

    =(HLOOKUP("Lookup Value",Array,ROW,FALSE))

我不知道这是否可以与其他功能一起使用...我还没有尝试过。我正在使用Excel 2007来实现这一目标。

编辑

要真正使IF(A1 =“”,,)恢复为真,在同一个单元格中需要用&分隔两个查询。解决此问题的简单方法是使第二个查询成为位于行尾且始终为空的单元格。


1

到目前为止,这是我能想到的最好的方法。

它使用该ISBLANK功能检查IF语句中单元格是否真正为空。如果该单元格中有任何内容(A1在此示例中甚至是空格字符),则该单元格都不EMPTY并且将导致计算。这样可以避免显示计算错误,直到您有可用的数字为止。

如果是该单元格,EMPTY则计算单元格将不显示计算中的错误。如果是该单元格,则将显示NOT EMPTY计算结果。如果您的数据不好,这将引发错误#DIV/0

=IF(ISBLANK(A1)," ",STDEV(B5:B14))

根据需要更改单元格引用和公式。


1
问题在于,然后您必须使用此结果将此检查传播到其他所有单元格。
guthrie

0

答案是肯定的-您不能使用= IF()函数并将单元格留空。“看起来空白”与空白不同。令人遗憾的是两个背对背的引号在不清除公式的情况下不会产生空单元格。


如果您准备使用VBA,则可以。根据其他答案。
紫先生

-1

Google给我带来了一个非常类似的问题,我终于找到了适合我需求的解决方案,它可能也会对其他人有所帮助...

我用这个公式:

=IFERROR(MID(Q2, FIND("{",Q2), FIND("}",Q2) - FIND("{",Q2) + 1), "")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.