(这与宏驱动的动态范围调整大小的方法完全不同,所以我使用了一个单独的答案......)
可以通过记住“命名范围”实际上命名为公式来构建动态直方图,因此它们的值可能是动态的,在某些情况下尤其如此。
让我们假设我们在 A 列中有一组任意值,从第 1 行开始,并且我们还有另一个单元格,其中包含我们想要在直方图中的 bin 数量。在我的工作簿中恰好是 E2。所以我们启动名称管理器(在“公式”选项卡上)并创建
num_bins =Sheet1!$E$2
我已经开始定义多个 bin,而不是 bin 大小(我们将在后面定义),因为后者使得准确地知道如何设置 bin 边界变得很棘手:我们对这个想法感到满意吗第一个和最后一个 bin 可以覆盖值范围的不同大小的部分,例如?*
我们还可以设置动态公式来描述我们的数据:
data_count =COUNT(Sheet1!$A:$A)
data_vals =OFFSET(Sheet1!$A$1,0,0,data_count,1)
max_val =MAX(data_vals)
min_val =MIN(data_vals)
有了这些定义,我们就可以看中了。每个垃圾箱应该有多大?制作另一个命名公式:
bin_size =(max_val-min_val)/(num_bins)
科学来了:这些公式构成了动态数组:
bin_array =min_val+ROW(OFFSET(Sheet1!$A$1,0,0,num_bins-1,1))*bin_size
bin_labels =min_val+ROW(OFFSET(Sheet1!$A$1,0,0,num_bins,1))*bin_size
data_vals =FREQUENCY(data_vals,bin_array)
第一个比较棘手:它使用num_bins minus one-size 范围的行号来生成bin_size 的倍数。它不会从min_val 开始数组,因为FREQUENCY() 函数将项目计数到每个bin 值。它比所需的 bin 数量小一,因为该函数会生成一个更大的数组,其中最终条目的点 高于 最高 bin 编号。因此,我们制作了一个单独的 bin_labels 数组用于演示目的。
现在我们可以制作图表了。插入(例如)二维柱形图并打开“选择数据”对话框(从功能区或右键单击图表)。添加一个新系列,将系列值设置为=Sheet1!freq_array。必须包含工作表名称或工作簿名称才能使其正常工作。如果您愿意,请添加系列名称,然后单击“确定”。现在点击“水平(类别)轴标签”的“编辑”并将范围设置为=Sheet1!bin_labels。
这里有 2000 个单元格,带有 =RAND()*5 和 5 个 bin(我列出了名称和它们的公式,以及它们不生成数组的值)
以及将 num_bins 更改为 10 后的同一张表。(RAND() 公式重新计算,因此这些 bin 加起来可能不会得到完全相同的值)
- (如果您必须有用户定义的 bin 大小,则需要将
bin_size 设为工作表引用并使用命名公式计算 num_bins)