从屏幕截图开始:
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。
答案 0 :(得分:0)
我想出了三个可能解决这个问题的方法。
示例数据设置
虽然您提供了数据的屏幕截图,但将其转换为测试用例以演示三种解决方案并不简单。因此,我把这个非常简单的设置汇总在一起。
=IF(A2<=$D$1,A2,"")
=IF(B2<>"",10,"")
以下是示例设置的屏幕截图,其中包含所有潜在用户。 (注意:这是Sheet1)
下面是示例设置的屏幕截图,其中仅包含潜在用户A到E.
第二张图片中的空白区域是我们要解决的问题。
解决方案1:制作数据的数据透视表
B1:C12
。下面是数据透视表的屏幕截图。
在包含数据的选项卡上,将最后一个潜在用户从E更改为G.在数据透视表上,刷新数据。
以下是刷新的数据透视表的屏幕截图。
解决方案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
下面是添加了按钮的数据标签的屏幕截图。
单击按钮后,现在看起来像这样......
此代码将在包含数据时展开行,而在不包含行时展开行。
这种方法的一个潜在问题是,如果图表覆盖这些行,扩展/折叠行将改变图表的大小。
解决方案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修改图表,因为这反映了您手动执行的操作。
答案 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-长度数组)。