2016-05-16 83 views
0

我期待为我的同事开发一个工具,使用它可以自动生成堆积条形图。我需要这个适用于任何大小的数据集,任何数量的Product和任何数量的Part。所以,我需要一个自动调整的VBA范围,我不知道该如何去做。自动生成带有动态范围的堆积条形图?

它需要做到以下几点:

  • 注意到连续值的总和,并在最后一列日志它。
  • 为每个行创建堆积条形图。
  • 转到“选择数据”和“交换行和列”

  • 打开的Total数据值No Fill

  • 使得Total数据标签显示“内部基地”
  • 去除白通过改变Y轴的最大值,从堆积的条形图中获得空间。

我的问题有以下几点:

  • 宏没有记录Total数据选择设置为无填充的记录。我应该怎么做只为Total数据点?
  • 如何使用VBA切换行和列?
  • 然后最后,我不知道如何使这个宏适用于任何大小的数据集?

这里是我一直在练习的样本数据集: https://docs.google.com/spreadsheets/d/19n_UH2fJxomur13G_I89WRaqW93KH6Z0FIpUOzsciyE/edit#gid=0

下面是我要创建图表的类型: enter image description here

这里是这是宏观创建时,我手动:

Sub StackedBar1() 
' 
' StackedBar1 Macro 
' 

' 
    Range("G2").Select 
    ActiveCell.FormulaR1C1 = "=SUM(RC[-5]:RC[-1])" 
    Range("G3").Select 
    ActiveCell.FormulaR1C1 = "=SUM(RC[-5]:RC[-1])" 
    Range("G4").Select 
    ActiveCell.FormulaR1C1 = "=SUM(RC[-5]:RC[-1])" 
    Range("A1:G4").Select 
    ActiveSheet.Shapes.AddChart.Select 
    ActiveChart.SetSourceData Source:=Range("'Sheet3'!$A$1:$G$4") 
    ActiveChart.ChartType = xlColumnStacked 
    ActiveChart.SetSourceData 
    ActiveChart.SetElement (msoElementDataLabelCenter) 
    ActiveChart.SeriesCollection(6).Select 
    ActiveSheet.ChartObjects("Chart 4").Activate 
    ActiveChart.SeriesCollection(6).DataLabels.Select 
    ActiveSheet.ChartObjects("Chart 4").Activate 
    Selection.Position = xlLabelPositionInsideBase 
    ActiveSheet.ChartObjects("Chart 4").Activate 
    ActiveChart.Axes(xlValue).Select 
    ActiveSheet.ChartObjects("Chart 4").Activate 
    ActiveChart.Axes(xlValue).MaximumScale = 14 
    ActiveChart.Axes(xlValue).MaximumScale = 8 
    ActiveSheet.ChartObjects("Chart 4").Activate 
    ActiveChart.ChartArea.Select 
End Sub 
+0

如果使用花在这篇文章中分析的时间并改进你的记录代码,你会发现它是如何工作的,应该想出一个可能的解决方案来解决你的问题。你所要求的并不是如此诚实地显示具体问题,如果我要回答这个问题,我不知道该从哪里开始。先尝试缩小你的问题。 – L42

+0

感谢您的评论,我现在同意你的意见。在VBA中,我只想选择'Total'列,然后用'No Fill'格式化它? – Gary

+0

Nevermind - 我这样做:ActiveChart.SeriesCollection(“Total”)。选择' – Gary

回答

1

我没有尝试动态,但它应该看起来像这样:

Dim lastRow As Long 
Dim lastColumn As Long 

'Define last column and last row in datasheet 
lastRow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row 
lastColumn = Sheet1.Cells(1, Columns.Count).End(xlToLeft).Column 

'define range  
ActiveChart.SetSourceData Source:=Sheets("Name").Range(Cells(1,1),Cells(lastRow,lastColumn)) 

要设置拉布勒,使之透明:

ActiveChart.SetElement (msoElementDataLabelInsideBase) 
ActiveChart.SeriesCollection(lastColumn-1).Fill.Visible = msoFalse 

切换行/列,这取决于你的需要:

ActiveChart.PlotBy = xlColumns 
'Or 
ActiveChart.PlotBy = xlRows 
+0

谢谢克莱门斯!我将如何设置“总计”栏+ 2的最大规模现在,我有:'随着ActiveChart.Axes(xlValue) .MaximumScale = Application.WorksheetFunction.Max(列(“合计”))+ 2 结束与',我有一些麻烦。 – Gary

+0

我不知道你的“Columns(”Total“)”参考正在做什么。而是引用像这样的绝对值:'ActiveChart.Axes(xlValue).MaximumScale = Application.WorksheetFunction.Max(Columns(lastColumn))+ 2' – Clemens