ChatGPT解决这个技术问题 Extra ChatGPT

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

我需要从 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做到这一点?

编辑:我正在构建一个工作表,该工作表从其他工作表中提取数据,这些数据的格式符合将数据导入数据库的应用程序的非常具体的需求。我无权更改此应用程序的实现,如果值为“”而不是实际为空,则会失败。

你能解释为什么单元格需要是空白的吗?根据你得到的“空白”,可能会有一种解决方法。
单元格包含公式,不是吗?那怎么可能是空的或空白的呢?
我有一个类似的问题,我正在绘制一个图表并且不想在图表上显示空白项目的值 0。如果记录是空单元格,它会从图表中忽略它们,但下面“答案”中列出的任何方法都会导致图表上显示 0。 :(
为避免在图表上显示零,请使用 NA() 函数而不是空字符串/零。这会将#N/A 放入单元格中,绘图例程将忽略该单元格。
Rob 使用#N/A 的建议与空单元格的结果不同。 #N/A 将导致绘图例程在单元格上进行插值,而真正空的单元格将被视为行中的间隙。如果您希望行中的 GAP 而不是 INTERPOLATION 跨越间隙,则您需要单元格为 EMPTY 而不是 #N/A 根据问题。下面有一些解决方案可以解决这个问题。

J
Joe Erickson

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

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

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


NA() 方法对设置为将空单元格显示为间隙的图表 100% 有效,这可能不适用于您导出到需要单元格为空白的应用程序的情况,因为它包含一个公式......
没有完美的解决方案。 NA() 是一个不错的选择。另一个是(取决于)''或“”的空字符串
这样做的目的是在将要绘制的数据中动态地返回空单元格,以便您可以有效地使用忽略空单元格作为图表中的间隙的选项。在我的例子中,我试图绘制 12 个值来表示每月的进展,但只能到上个月,使用如下公式: =IF(MONTH(TODAY())>C2;$C$11+C7;NA( ))
这对我有用。我有一个图表,其中包含我每天添加的数据 - scrum 的燃尽图,我希望看到这条线只延伸到当天。这帮助我做到了——在 IF 语句中使用 NA() 。谢谢!
NA() 不会导致间隙。每个人都搞错了。如果值为 NA() 或 #N/A,Excel 将不会绘制标记,但它会在相邻的非 #N/A 值之间绘制一条插值线。
b
brettdj

那么,您将不得不使用 VBA。您将遍历范围内的单元格,测试条件,如果匹配则删除内容。

就像是:

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

我要补充一点:如果您总是有特定范围的单元格要清除空白单元格,则可以为该范围命名,然后通过将 SomeRange 更改为 Range("MyRange") 来修改 Boofus 的公式。要为单元格设置名称,请选择单元格,单击功能区“公式”选项卡上的“定义名称”,然后在“名称”字段中输入“MyRange”。 (当然你可以用你想要的任何东西替换 MyRange。)
Excel 中没有空常量,这很强烈。
如果您将宏放在 worksheet_calculate() 函数中,那么它将自动清空单元格。有关具体细节,您可以在下面查看我的答案。
@ted.strauss 有 VbNullString
@brettdj 那是 VBA,而不是 Excel。我们一直在游说某种函数,如 NULL() 或 BLANK(),但无济于事。
P
Przemyslaw Remin

对的,这是可能的。

如果满足条件,则可以使公式返回 trueblank。它通过了 ISBLANK 公式的测试。唯一的不便是,当条件满足时,公式会蒸发,你将不得不重新输入它。您可以通过将结果返回到相邻单元格来设计一个不会自毁的公式。是的,这也是可能的。

https://i.stack.imgur.com/cIcWc.gif

您只需要设置一个命名范围,例如 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)&")")

https://i.stack.imgur.com/CxfOr.png

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

=IF(A2=0,GetTrueBlank,A2)

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

您可以download a demonstration file here

在上面的示例中,将公式计算为 trueblank 会产生一个空单元格。使用 ISBLANK 公式检查单元格的结果为 TRUE。这是原切。满足条件时,公式将从单元格中消失。目标已经实现,尽管您可能希望公式不要消失。

您可以修改公式以在相邻单元格中返回结果,以便公式不会自行终止。 See how to get UDF result in the adjacent cell

https://i.stack.imgur.com/EfE1r.gif

我在这里遇到了获得真空白作为 The FrankensTeam 揭示的公式结果的示例:https://sites.google.com/site/e90e50/excel-formula-to-change-the-value-of-another-cell


这是他妈的甜蜜的解决方法,尽管如果没有物理清空单元格就无法做到这一点,这非常疯狂。这里唯一的缺点是您必须记住在重新计算时重新向下拖动公式,尽管我想您可以设置一个工作簿事件来做到这一点。
在您尝试使用甜蜜的解决方法之前,请注意它may backfire
@PrzemyslawRemin 不,我是说可能会发生各种随机事件,包括 crashing Excel
似乎您可以使用辅助列来观看 A2。如果 A2 发生变化,帮助列可以将该公式转储到 B2 中,准备好让 A2 变回零。
H
Honza Zidek

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

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

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

当出现无效的单元格值时,这确实给出了没有点的所需图表。当然,这会使所有具有该无效值的单元格读取 #N/A,这很麻烦。

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


不!!! “将空单元格显示为间隙” 要求单元格为空。如果它们包含#N/A 而不是NOTHING,则绘图例程将在#N/A 单元格上进行插值,而不是将它们作为行中的间隙。如果您希望插入 #N/A 单元格,那很好,但在这种情况下,“将空单元格显示为间隙”不适用
@GreenAsJade 这不是真正的答案,因为它不符合 OP 的需求。对于图形问题,确实应该有一个单独的问题。
它在 Excel 2010 (=14.0) 中运行良好:图表忽略空单元格和 N/A 单元格。
i
ib.

如果目标是能够将一个单元格显示为空,而实际上它的值为零,那么不要使用导致空白或空单元格的公式(因为没有 empty() 函数),

在你想要一个空白单元格的地方,返回一个 0 而不是 "" 然后

像这样设置单元格的数字格式,您必须在其中提出您想要的正数和负数(前两项以分号分隔)。就我而言,我拥有的数字是 0、1、2……我希望 0 显示为空。 (我从来没有弄清楚 text 参数的用途,但它似乎是必需的)。 0;0;"";"文本"@


虽然这不会使单元格为空(公式无法生成空单元格),但如果数字为零,它会使其看起来为空。然而,这是不正确的。它应该是 0;-0;"" (注意减号)甚至 0;-0;根本没有任何引号。第三个分号和“text”@ 部分不是必需的。分号分隔字段的含义是:如何显示正数、负数、零和文本(后一种格式必须包含@)。 office.microsoft.com/en-gb/excel-help/…
你是神先生。你把我从 Visual Basic 中救了出来。你统治
i
ib.

这就是我对我正在使用的数据集所做的。这看起来既复杂又愚蠢,但它是学习如何使用上述 VB 解决方案的唯一选择。

我对所有数据进行了“复制”,并将数据粘贴为“值”。然后我突出显示粘贴的数据并用一些字母“替换”(Ctrl-H)空单元格,我选择了 q 因为它不在我的数据表上的任何位置。最后,我又做了一次“替换”,将 q 替换为空。

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


虽然这可能适用于您的情况,但我需要一个可以自动应用的解决方案。最终,我想我使用了一个 VB 宏来擦除那些被确定为空的东西。此宏在保存文件之前运行。
这对我来说是最好的,因为我不需要它是自动的,但我需要它快速。从本质上讲,这意味着 Excel 尊重通过查找和替换添加的空白值,这对我来说已经足够了!
K
Kevin Vuilleumier

IF 语句中使用 COUNTBLANK(B1)>0 而不是 ISBLANK(B1)

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


不幸的是,似乎 Excel 拒绝 =COUNTBLANK(IFNA(VLOOKUP(...),"")) 为无效(!)
O
Oleks

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


尽管这对最初的提问者没有帮助,但在许多情况下这实际上并不是一个糟糕的答案。它适用于您被迫返回“”的情况。
很好的答案,但有点混乱。我要测试的单元格返回一个数字或 "" 或为空。 LEN(cell)>0 如果有数字(包括零,如果数字是通过公式计算的,则包括)返回 true,如果为空字符串或空则返回 false。
L
Laird Popkin

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

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


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

如此多的答案返回一个看起来为空但实际上不是空单元格的值...

根据要求,如果您确实想要一个返回空单元格的公式。通过 VBA 是可能的。所以,这里是完全做到这一点的代码。首先编写一个公式以在您希望单元格为空的任何位置返回 #N/A 错误。然后我的解决方案会自动清除所有包含该 #N/A 错误的单元格。当然,您可以修改代码以根据您喜欢的任何内容自动删除单元格的内容。

打开“visual basic viewer”(Alt + F11)在项目资源管理器中找到感兴趣的工作簿并双击它(或右键单击并选择查看代码)。这将打开“查看代码”窗口。在(General)下拉菜单中选择“Workbook”,在(Declarations)下拉菜单中选择“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 错误将保持未删除状态


如果您需要它是全自动/免提/动态的,并且您不想重新输入公式以生成#NA错误,您可以重写宏代码以复制有问题的工作表,留下空单元格代替#NA,然后生成图表从复制表。 (如果此评论被赞成,我将添加代码)。
E
ElderDelp

这个答案并没有完全处理 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

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


A
Ahmed Shahid

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

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

创建一个长度为零的字符串 (ISBLANK(CELL) = FALSE)。
这有效,应该是公认的答案。非常感谢,艾哈迈德。我的用例有点不同。我想将单元格留空,以便 AVERAGE()、MIN()、MAX()、STDEV()、COUNT() 和 MEDIAN() 等聚合函数将忽略值。
k
kleopatra

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

当你进行任何计算时,“”会给你错误,所以你想把它当作一个数字,所以我使用嵌套的 if 语句返回 0 而不是“”,然后如果结果为 0,这个等式将返回“”

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

这样excel表格看起来很干净......


这不是问题的解决方案。工作表看起来很干净,但就图形而言,值“”不是“空”。
L
Lance Roberts

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

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

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

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

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

我不知道这是否适用于其他功能......我没有尝试过。我正在使用 Excel 2007 来实现这一点。

编辑

要真正使 IF(A1="", , ) 返回为真,需要在同一个单元格中进行两次查找,并用 & 分隔。解决此问题的简单方法是使第二次查找位于行尾且始终为空的单元格。


s
shawndreck

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

它使用 ISBLANK 函数在 IF 语句中检查单元格是否真的为空。如果单元格中有任何内容,在此示例中为 A1,即使是空格字符 ,则单元格不是 EMPTY,并且将产生计算结果。这将防止显示计算错误,直到您有数字可以使用。

如果单元格为 EMPTY,则计算单元格将不会显示计算错误。如果单元格为 NOT EMPTY,则将显示计算结果。如果您的数据不正确,这将引发错误,可怕的 #DIV/0

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

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


这样做的问题是,您必须使用此结果将此检查传播到每个其他单元格。
K
Ken

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


如果您准备好使用 VBA,则可以。根据其他一些答案。
J
JGFMK

我去掉了单引号,因此 +1-800-123-4567 这样的电话号码列不会导致计算并产生负数。我尝试了一个 hack 来删除空单元格上的它们,禁止引用,然后也遇到了这个问题(F 列)。在源单元格上调用文本要容易得多,瞧!:

=IF(F2="'","",TEXT(F2,""))

j
jdaw1

这可以在 Excel 中完成,而无需使用将 #N/A 设置为间隙的新图表功能。但这很繁琐。假设您想在 XY 图表上画线。然后: 第 1 行:第 1 行 第 2 行:第 2 行 第 3 行:硬空 第 4 行:第 2 行 第 5 行:第 3 点 第 6 行:硬空 第 7 行:第 3 行 第 8 行:第 4 行 第 9 行:硬空等

结果是很多单独的行。点数的公式可以控制是否被#N/A 省略。通常将 INDEX() 点的公式放入另一个范围。


h
hamish

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

我使用了这个公式:

=IFERROR(MID(Q2, FIND("{",Q2), FIND("}",Q2) - FIND("{",Q2) + 1), "")