2016-05-16 81 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