0

从截图开始:

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

(我是新用户,不能发图)

在呼叫中心工作。我们有一个程序可以跟踪我们在各种电话状态下所花费的时间(所以当我们在打电话、出去吃午饭等时),它可以将给定团队和日期范围的数据导出为 CSV。

我正在努力使这份报告自动化。它的工作方式是团队负责人将提取 CSV,复制粘贴到另一个选项卡,然后我有一堆数组公式 If 函数和间接引用来提取所有数据,如图所示。数据分析和一切都运行良好。

我的问题是图表。现在,我的 B 列有一个If函数,可以输出代理的电子邮件(这是系统跟踪它的方式),或者""是否所有电子邮件都已使用。其余列有If(B2="","", [relevant formula]). 这样,我们可以让所有具有不同(和波动)团队规模的团队负责人通过简单的复制粘贴使用相同的报告。

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

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

我尝试过的一件事是Indirect为系列值提供参考。所以我有一个带有{=MAX(IF(B2:B31="","",ROW(B2:B31)))}. 输出最后一个非空白行的行号。然后对于我输入的系列值=Indirect("Report!A2:A"&AA1),但 Excel 给了我一个错误,说该函数无效。我想您在图表的数据输入中只能有一个实际范围(而不是公式)。

顺便说一句,Excel 2016。

4

2 回答 2

0

我找到了解决办法!很大程度上感谢这个页面。这是我所做的:

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

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

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

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

于 2016-11-02T15:50:13.167 回答
0

对于这个问题,我提出了三种可能的解决方案。

  1. 将您的数据表转换为数据透视表并使用数据透视图(目前仅在 Windows 版本中可用,如果您使用的是 Mac,请见谅)。
  2. 使用一点 VBA 来隐藏空行。
  3. 使用一点 VBA 来修改图表上显示的数据。

示例数据设置

尽管您提供了数据的屏幕截图,但要将其转换为测试用例来演示这三种解决方案并不容易。因此,我将这个非常简单的设置拼凑在一起。

  1. A 列包含可能的“用户”列表。
  2. 单元格 D1 是用于更改 B 列和 C 列内容的用户条目。
  3. B 列包含实际的“用户”。它是用计算的=IF(A2<=$D$1,A2,"")
  4. C 列包含与“用户”相关的数据。它是用计算的=IF(B2<>"",10,"")
  5. 图表将添加到工作表中。

下面是示例设置的屏幕截图,其中包括所有潜在用户。(注:是Sheet1)

在此处输入图像描述

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

在此处输入图像描述

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

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

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

下面是数据透视表的屏幕截图。

在此处输入图像描述

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

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

在此处输入图像描述

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

下面的代码附加到工作表上可见的按钮上。(nb还有其他方法可以激活代码,例如更改事件,但这将取决于此答案范围之外的许多因素)。

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

下面是添加了按钮的数据选项卡的屏幕截图。

在此处输入图像描述

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

在此处输入图像描述

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

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

解决方案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

下面是带有新按钮的数据选项卡的屏幕截图。

在此处输入图像描述

以下是单击按钮后的选项卡屏幕截图。

在此处输入图像描述

包起来

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

于 2016-11-02T01:03:13.620 回答