【问题标题】:Creating a chart in Excel that ignores #N/A or blank cells在 Excel 中创建忽略 #N/A 或空白单元格的图表
【发布时间】:2021-07-28 03:07:26
【问题描述】:

我正在尝试使用动态数据系列创建图表。图表中的每个系列都来自一个绝对范围,但该范围可能只有一定数量的数据,其余的将是#N/A

问题是图表将所有#N/A 单元格作为值而不是忽略它们。我已经通过使用命名的动态范围(即插入 > 名称 > 定义)来解决这个问题,但这非常低效,因为每个图表都有 4 个动态系列,我必须制作 25 个这样的图表。

是否有任何其他解决方案可以让我像往常一样为数据系列指定范围,但告诉图表忽略所有“#N/A”或空白单元格?

【问题讨论】:

  • 你不能作为图表的一部分(比如在数据透视图中)告诉它忽略空白作为图表数据选择的一部分吗?
  • 空白单元格是否存在与#N/A 单元格相同的问题?我相信 excel 默认会忽略空白(请参阅“选择数据源”下的“隐藏和空单元格”子菜单)。至于#N/A,您可以从派生列制作图表,在其中使用 IFERROR 将#N/A 单元格更改为空白吗?
  • 是的,我可以将其设置为忽略空白,但问题是我不知道如何使单元格真正空白。单元格中有一个公式可以输出“#N/A”或“”,并且图表不会将“”视为空白。有没有办法从公式中输出一个真正的空白值?
  • Excel 2013 允许您在不弄乱工作表的情况下过滤图表数据。在这种情况下,您将能够阻止绘制带有错误的类别。我不知道您是否可以动态执行此操作,因为它的 UI 有供您检查的框。如果您被 2007/10 年困住,则无济于事。
  • 您应该使用 =NA(),而不是“#N/A”。

标签: excel


【解决方案1】:

通过使用 IF 语句将不需要的值返回给“”,我遇到了同样的问题,并且图表会按照您的描述进行。

但是,当我使用#N/A 而不是""(重要的是,请注意它没有引号,如#N/A 而不是"#N/A"),图表忽略了无效数据。我什至尝试输入无效的FALSE 语句,它的工作原理相同,唯一的区别是#NAME? 在单元格中返回为错误而不是#N/A。我将使用一个虚构的 IF 语句来向您展示我的意思:

=IF(A1>A2,A3,"")  
---> Returned "" into cell when statement is FALSE and plotted on chart 
     (this is unwanted as you described)

=IF(A1>A2,A3,"#N/A")  
---> Returned #N/A as text when statement is FALSE and plotted on chart 
     (this is also unwanted as you described)

=IF(A1>A2,A3,#N/A)  
---> Returned #N/A as Error when statement is FALSE and does not plot on chart (Ideal)

=IF(A1>A2,A3,a)  
---> Returned #NAME? as Error when statement is FALSE and does not plot on chart 
    (Ideal, and this is because any letter without quotations is not a valid statement)

【讨论】:

  • 谢谢,这个解决方案有效!注意:您可以使用NA() 函数获取#N/A 值。 (office.microsoft.com/en-au/excel-help/…)
  • 但是当单元格本身仍然显示为空而不显示大的#N/A 时呢?
  • 有时这可能不适用于直方图。我发现以下序列有效:1)将无效值设置为 0(2)更改箱数(3)将无效值设置为 NA。 excel中的奇怪故障
【解决方案2】:

当您将图表引用到定义的范围时,它会绘制该范围内的所有点,将(为了绘图)错误和空白解释为空值。

您可以选择将其保留为空(间隙)或将其强制为零值。但是这些都没有调整图表系列数据指向的范围。据我所知,这些都不合适。

如果您隐藏存在#N/A 数据的整个行/列,图表应完全忽略这些。您可以通过右键单击 | 手动执行此操作。隐藏行,或使用表自动筛选。我认为这是你想要完成的。

【讨论】:

  • 感谢您的详细回答,大卫!不幸的是,这个解决方案不起作用。电子表格是这样设置的 (i50.tinypic.com/2zj9v1u.png),这组数据在工作表中水平重复。 25 个图表中的每一个都来自这些部分。所以隐藏行/列是不可行的,因为它会影响图表的其余部分。
  • 没问题。您当前的电子表格不允许您利用 Excel 的功能。由于您使用一个电子表格来保存所有 25 个图表的系列数据,并且数据按原样排列,因此您无法利用此功能。您可以重新设计电子表格布局。或者正如您已经提到的,您可以使用命名范围,但这可能很麻烦。或者您可以将非空值分配给宏中的数组,然后将该数组分配给series.values。列和图表之间是否存在 1:1 的关系?这在 VBA 中很容易做到。
  • 图中第一列是X轴标签,后面4列是图表中的4个系列。为每个图表重复此块。宏是否会自动执行,以便在系列填满时无需手动更改任何内容?这会比创建 25x5=125 命名范围更方便吗?再次感谢大卫!
  • 在截图中,有什么问题?您是否担心 #N/A 从 2013 年 3 月开始的第 4 列,或者您是否担心所有列 2-5 的 #N/A *after 1 月 14 日 XValue ???跨度>
  • 问题是图表读取了左侧日期列中的#N/A 单元格,并在X 轴上制作了大量#N/A 标签,而不是忽略它们。这有意义吗?
【解决方案3】:

请注意,在绘制折线图时,使用 =NA()(输出 #N/A)来避免绘制不存在的值仅适用于每个系列的末尾、第一个值和最后一个值。其他两个值之间的任何 #N/A 都将被忽略并桥接。

【讨论】:

    【解决方案4】:

    您是正确的,空格“”或字符串“#N/A”确实被解释为在 excel 中具有值。您需要使用函数 NA()。

    【讨论】:

      【解决方案5】:

      如果您有要散点图的 xy 列,但并非其中一列中的所有单元格都填充了有意义的值(即其中一些具有 #DIV/0!),然后插入在违规列旁边新建一列,然后键入 =IFERROR(A2, #N/A),其中 A2 是违规列中的值。

      如果有#DIV/0!,这将返回#N/A,否则将返回良好的值。现在用你的新列绘制你的图,Excel 会忽略 #N/A 值并且不会将它们绘制为零。

      重要:公式中不要输出"#N/A",只输出#N/A

      【讨论】:

        【解决方案6】:

        您可以使用函数“=IF(ISERROR(A1);0;A1)”,如果单元格 A1 包含错误,则显示零,否则显示实际值。

        【讨论】:

        • 感谢 Nicolaesse,但我也需要在图表中显示零。所以这不允许我区分应该在图表中的实零和“错误零”。
        【解决方案7】:

        我遇到了同样的问题。

        Bar chartStacked Bar chart 之间存在区别

        因为Line chartStacked Line chart 之间存在差异。

        堆叠的,不会忽略0或空白值,而是会根据其他图例显示一个累积值。

        只需右键单击图表,单击Change Chart Type 并选择一个非堆叠图表。

        【讨论】:

          【解决方案8】:

          只是想把我的 2cents 用于这个问题......

          我有类似的需求,我通过 INDEX/MATCH 从另一个表中提取数据,并且由于不匹配而很难区分真正的 0 值和 0 值(例如,对于显示过去 12 个月的值进展情况,我们仅在 2 月,但其余月份的数据尚不可用,柱形图仍显示 0 到 3 月至 12 月)

          我最终做的是创建一个系列并将这个新系列绘制在图表上作为折线图,然后我选择不隐藏折线图在选项中显示该行,然后我将数据标签放在顶部,这个新系列的值的公式类似于:

          =IF(LEN([@[column1]])=0,NA(),[@[column1]])

          我使用 LEN 作为验证,因为 ISEMPTY/ISBLANK 不起作用,因为 INDEX/MATCH 的结果总是返回除空白以外的其他内容,即使我在 IFERROR 之后放了一个“”...

          在折线图上,错误值 NA() 使得该值不显示......所以这对我来说很有效......

          我想在没有图片的情况下执行此过程有点困难,但我希望它可以绘制某种图片,以便您在遇到与我类似的情况时使用解决方法

          【讨论】:

            【解决方案9】:

            一种解决方案是图表/图形不显示隐藏行

            您可以通过以下方式测试此功能:1)右键单击行号 2)单击隐藏。

            为了自动完成,这是简单的代码:

            For Each r In worksheet.Range("A1:A200")
               If r.Value = "" Then 
                  r.EntireRow.Hidden = True 
               Else: 
                  r.EntireRow.Hidden = False
            Next
            

            【讨论】:

              【解决方案10】:

              还有另一种鲜为人知的解决方案在某些地方具有优点。使用#NULL!错误不会绘制并且不会为绘图创建零点。

              因此,您的绘图列填充了以下构造。假设 A 列中的真实数据和绘图版本在 C 列中。

              =If(Isnumber(A2),A2,A2 A3)

              该空格是一个鲜为人知的运算符,用于生成两个单元格地址或范围的交集。如果没有交集,则生成消息#NULL!

              包含#NULL 的单元格!出于绘图目的而被跳过。

              除此之外(对于 Microsoft)只需要获取数学方程式以某种方式忽略此类单元格?

              【讨论】:

              • 抱歉 - #Null 似乎因平台而异,我的示例是日志图 - 忽略
              【解决方案11】:

              这是我发现的,因为我只绘制了每 4 列集中在一起的 3 个单元格。我的图表有一个合并的单元格,日期是我的 x 轴。问题:BC26-BE27 在我的图表上绘制为零。 enter image description here

              我单击图表侧面的过滤器,发现它显示了所有列的数据点图表。我取消选中没有值的框。 enter image description here

              它对我有用。

              【讨论】:

                【解决方案12】:

                我在使用 X/Y 图表时遇到了类似的问题,但随后还需要计算两组数据的相关函数。

                =IF(A1>A2,A3,#N/A) 允许绘制图表,但 XY 的相关性失败。

                我解决了这个问题 =IF(A1>A2,A3,FALSE)

                然后可以使用条件格式或其他技巧将 FALSE 设为 removed

                【讨论】:

                  【解决方案13】:

                  如果您使图表上的垂直刻度(使用格式轴)从 0.0001(例如)开始,则不会绘制 Excel 认为为零的值。您在图表中的轴看起来仍会从零向上运行。

                  【讨论】:

                    【解决方案14】:

                    如果您使用 PowerPivot 和 PivotChart,您将排除不存在的行。

                    【讨论】:

                      【解决方案15】:

                      我找到了办法。

                      您可以绘制 x,y 散点图。它将忽略空记录(即行)

                      【讨论】:

                        【解决方案16】:

                        我遇到了同样的问题,出现了整行。

                        我的数据末尾只有#N/A。

                        当我将图表类型从 堆叠线 更改为 线条 时,线条的末端从图表中移除。

                        如果 #N/A 位于数据中间,则此方法不起作用,仅当它位于尾随数据中时。

                        【讨论】:

                          【解决方案17】:

                          选择栏上方的标签。 格式化数据标签。 而不是选择“VALUE”(取消单击)。 从单元格中选择值。选择值。 使用以下语句:if(cellvalue="","",cellvalue) 其中 cellvalue 是单元格中的计算结果。

                          【讨论】:

                          • 这个答案可以稍微清理一下,使它更容易扫描。也许一些换行符和格式,所以我们知道什么是输入,什么是指令?
                          • 欢迎来到 Stack Overflow!虽然这可能是解决问题的一个有价值的提示,但一个好的答案也可以证明解决方案。请edit 提供示例代码来说明您的意思。或者,考虑将其写为评论。
                          【解决方案18】:

                          虽然这是一篇旧帖子,但我最近在寻找同一问题的解决方案时遇到了它。虽然上述解决方案确实阻止了图表绘制数据(当源单元格为 #N/A 或看起来空白时),但它并不能解决图表数据标签本身仍显示零标签的问题。

                          当我发现网上发布的解决方案@@https://www.extendoffice.com/documents/excel/2031-excel-hide-zero-data-labels.html时,我已经搜索和搜索几乎放弃了。

                          效果很好。附上一张图片,展示了之前的数据(标签)如何显示的示例,图表#1,以及使用此提示图表#2 的显示方式。

                          enter image description here

                          【讨论】:

                            【解决方案19】:

                            我找到了以下解决方案:

                            如果不应包含在轴时间范围内的所有日期系列单元格包含"",Excel 图表会自动调整到正确的轴结束。因此,您可以创建一个辅助列,并将这样的内容写入日期系列辅助列单元格:

                            Helper Column Datecell = If( iserror (ValueCell);""; Datecell)
                            

                            另一方面,如果您想将图表调整到给定的时间范围,您可以在辅助列日期系列单元格中写入类似的内容:

                            Helper Column Datecell = IF(  OR(ISERROR(ValueCell); DateCell>DateInput)   ;"";DateCell)
                            

                            DateInput 是您输入日期以调整图表大小的单元格。


                            这里还有一个话题:

                            关于如果您为值系列单元格创建一个帮助列,并给出NA() Error,则值系列也会调整为您的系列: 您甚至可以使您的值系列单元格依赖于您给定的输入单元格。我觉得这也是需要的。

                            Helper Column Value Cell: if( condition that date cell is too big or bigger than a given input cell; NA(); ValueCell)
                            
                            【解决方案20】:

                            最好的方法是使用 Empty

                            Dim i as Integer
                            For i = 1 to 1000
                                If CPT_DB.Cells(i, 1) > 100 Then
                                   CPT_DB.Cells(i, 2) = CPT_DB.Cells(i, 1)
                                Else
                                   CPT_DB.Cells(i, 2) = Empty //**********************
                                End If
                            Next i
                            

                            【讨论】:

                              猜你喜欢
                              • 2018-11-20
                              • 2021-02-17
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2011-04-19
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多