显示空白单元格的Excel条形图/柱形图

时间:2016-11-01 18:29:48

标签: excel charts excel-charts

从屏幕截图开始:

http://i.imgur.com/Isj9MER.png

(我是新用户,无法发布图片)

为呼叫中心工作。我们有一个程序可以跟踪我们在各种电话状态下花费的时间(因此,当我们进行通话,外出吃午餐等)时,可以将给定团队和日期范围的数据导出为CSV格式。

我正致力于自动化此报告。它的工作方式是团队领导将CSV,复制粘贴到另一个选项卡,然后我有一堆数组公式如果函数和间接引用拉动所有数据,如图所示。数据分析和一切都很好。

我的问题是图表。现在,我已经在B列中添加了If功能,可以输出代理商的电子邮件(系统跟踪它的方式)或""如果所有电子邮件都已使用过。其余列有If(B2="","", [relevant formula])。这样,我们可以让所有具有各种(和波动的)团队规模的团队负责人使用相同的报告和简单的复制粘贴。

我的问题是愚蠢的条形图。它从第2-32行(A2:A32)中提取数据。我们目前最大的团队是28岁,我为即将出现的新员工留出了空间。当我使用来自我们较小的团队的数据时,我的问题就出现了。如您所见,即使空白行在每个单元格中都填充了"",它仍然会显示这些行。在图表中。这意味着,对于最小的团队(显示),图表是一半浪费的空白。

有没有办法让柱形图只显示其中包含实际数据的行?

我尝试过的一件事是为系列值添加Indirect引用。所以我有一个{=MAX(IF(B2:B31="","",ROW(B2:B31)))}的单元格(AA1)。这将输出最后一个非空行的行号。然后对于系列值我放=Indirect("Report!A2:A"&AA1),但Excel给了我一个错误,说该函数无效。我猜你在图表的数据输入中只能有一个实际范围(而不是公式)。

顺便说一句,

Excel 2016。

2 个答案:

答案 0 :(得分:0)

我想出了三个可能解决这个问题的方法。

  1. 将您的数据表转换为数据透视表并使用数据透视表(目前仅适用于Windows版本,如果您使用的是Mac,则很抱歉)。
  2. 使用一点VBA来隐藏空行。
  3. 使用一点VBA修改图表上显示的数据。
  4. 示例数据设置

    虽然您提供了数据的屏幕截图,但将其转换为测试用例以演示三种解决方案并不简单。因此,我把这个非常简单的设置汇总在一起。

    1. A列包含可能的“用户”列表。
    2. 单元格D1是用于更改B列和C列内容的用户条目。
    3. B列包含实际的“用户”。它使用=IF(A2<=$D$1,A2,"")
    4. 计算
    5. C列包含与“用户”一起使用的数据。它使用=IF(B2<>"",10,"")
    6. 计算
    7. 图表已添加到工作表中。
    8. 以下是示例设置的屏幕截图,其中包含所有潜在用户。 (注意:这是Sheet1)

      enter image description here

      下面是示例设置的屏幕截图,其中仅包含潜在用户A到E.

      enter image description here

      第二张图片中的空白区域是我们要解决的问题。

      解决方案1:制作数据的数据透视表

      1. 选择所有相关数据,在本例中为B1:C12
      2. 选择插入 - &gt;数据透视表
      3. 在“创建数据透视表”对话框中,确保选中“新工作表”,然后单击“确定”。
      4. 在数据透视表上,在“行”中放置“用户”字段,在“值”中放置“总计”字段。为“总计”字段选择值字段设置...并确保它使用总和。
      5. 在“数据透视表”中,选择“行标签”下拉列表,“标签过滤器”,“大于...”。在对话框中键入“”,然后选择“确定”。
      6. 来自数据透视表工具 - &gt;分析,选择数据透视图。从对话框中选择条形图。
      7. 下面是数据透视表的屏幕截图。

        enter image description here

        在包含数据的选项卡上,将最后一个潜在用户从E更改为G.在数据透视表上,刷新数据。

        以下是刷新的数据透视表的屏幕截图。

        enter image description here

        解决方案2:使用VBA隐藏空行

        以下代码附在工作表上可见的按钮上。 (n.b.还有其他方法可以激活代码,例如更改事件,但这取决于本答案范围之外的一些因素)。

        Sub HideRows()
        
        Dim AllCatRange As Range
        Set AllCatRange = Worksheets("Sheet1").Range("B2:B12")
        
        Dim iLoop As Long
        For iLoop = 1 To AllCatRange.Rows.Count
            If AllCatRange.Cells(iLoop, 1) = "" Then
                AllCatRange.Cells(iLoop, 1).EntireRow.Hidden = True
            Else
                AllCatRange.Cells(iLoop, 1).EntireRow.Hidden = False
            End If
        Next iLoop
        
        Set AllCatRange = Nothing
        
        End Sub
        

        下面是添加了按钮的数据标签的屏幕截图。

        enter image description here

        单击按钮后,现在看起来像这样......

        enter image description here

        此代码将在包含数据时展开行,而在不包含行时展开行。

        这种方法的一个潜在问题是,如果图表覆盖这些行,扩展/折叠行将改变图表的大小。

        解决方案3:使用VBA修改图表

        以下代码附加在按钮上,用于在源数据更改后修改图表。

        Sub ModifyChart()
        Dim AllCatRange As Range
        Set AllCatRange = Worksheets("Sheet1").Range("B2:B12")
        
        Dim lastRow As Long
        lastRow = 1
        
        Dim iLoop As Long
        For iLoop = 1 To 11
            If AllCatRange.Cells(iLoop, 1) <> "" Then
                lastRow = lastRow + 1
            End If
        Next iLoop
        
        Dim PlotCatRange As Range
        Set PlotCatRange = Worksheets("Sheet1").Range("B2:B" & lastRow)
        
        Dim PlotSerRange As Range
        Set PlotSerRange = Worksheets("Sheet1").Range("C2:C" & lastRow)
        
        Worksheets("Sheet1").ChartObjects(1).Chart.FullSeriesCollection(1).XValues = "=Sheet1!" & PlotCatRange.Address
        Worksheets("Sheet1").ChartObjects(1).Chart.FullSeriesCollection(1).Values = "=Sheet1!" & PlotSerRange.Address
        
        Set AllCatRange = Nothing
        Set PlotCatRange = Nothing
        Set PlotSerRange = Nothing
        
        End Sub
        

        下面是数据标签的屏幕截图,其中包含新按钮。

        enter image description here

        下面是单击按钮后标签的屏幕截图。

        enter image description here

        总结

        我个人的偏好是在修改数据后使用VBA修改图表,因为这反映了您手动执行的操作。

答案 1 :(得分:0)

我找到了解决方案!非常感谢this page。这是我做的:

我使用以下公式创建了一个命名范围:=OFFSET(Report!$B$1,1,0,COUNTIF(Report!$B$2:$B$30,"<>-"),1)

为了实现这一点,我必须将所有空单元格更改为空,而不是"-"时输出""。我无法让COUNTIF接受"<>""""<>"或我尝试过的任何其他奇怪的技巧。使用"-"更容易。

这使得动态命名范围在我将数据放入工作表时会改变大小。我为我想要绘制的所有内容命名了相似的范围(已批准状态,呼叫就绪,未就绪)。该图表能够接受这些名称,现在它的动态大小。如果我在工作表上只有三个代理,它会显示三个巨大的条形图。二十,它显示二十个酒吧(正是我正在寻找的)。

另一个提示:我将第一行更改为空时输出"",以便COUNTIF(Report!$B$2:$B$30,"<>-")始终返回至少1(否则会出现恼人的错误,因为您的命名范围引用了0-长度数组)。