2014-01-10 37 views
-1

我想要修改this answer中的代碼,以避免將範圍增加1,從而減小範圍一。任何想法如何做到這一點?VBA:縮小圖表數據範圍

Sub ChangeChartRange() 

Dim i As Integer, r As Integer, n As Integer, p1 As Integer, p2 As Integer, p3 As Integer 
Dim rng As Range 
Dim ax As Range 

'Cycles through each series 
For n = 1 To ActiveChart.SeriesCollection.Count Step 1 
    r = 0 

    'Finds the current range of the series and the axis 
    For i = 1 To Len(ActiveChart.SeriesCollection(n).Formula) Step 1 
     If Mid(ActiveChart.SeriesCollection(n).Formula, i, 1) = "," Then 
      r = r + 1 
      If r = 1 Then p1 = i + 1 
      If r = 2 Then p2 = i 
      If r = 3 Then p3 = i 
     End If 
    Next i 


    'Defines new range 
    Set rng = Range(Mid(ActiveChart.SeriesCollection(n).Formula, p2 + 1, p3 - p2 - 1)) 
    Set rng = Range(rng, rng.Offset(0, 1)) 

    'Sets new range for each series 
    ActiveChart.SeriesCollection(n).Values = rng 

    'Updates axis 
    Set ax = Range(Mid(ActiveChart.SeriesCollection(n).Formula, p1, p2 - p1)) 
    Set ax = Range(ax, ax.Offset(0, 1)) 
    ActiveChart.SeriesCollection(n).XValues = ax 

Next n 

End Sub 


+0

使用約翰Walkenbachs [類模塊(http://spreadsheetpage.com/index.php/tip/a_class_module_to_manipulate_a_chart_series/)的方法。上面的代碼在我的圖表類型上失敗。 – brettdj

+0

你剛纔轉發了其他答案的代碼...你有沒有嘗試過任何東西?例如試着理解它的作用,並自己去修改它? –

+0

是的,我努力修改代碼以將範圍減少1列。我將在將來更詳細地記錄相同內容。學過的知識。原始編碼人員在下面提供了答案。 – Bryan

回答

0

爲了減少每次運行宏時圖表中的列數,我已經在原始代碼中替換了兩行。

Sub ChangeChartRange() 
    Dim i As Integer, r As Integer, n As Integer, p1 As Integer, p2 As Integer, p3 As Integer 
    Dim rng As Range 
    Dim ax As Range 

    'Cycles through each series 
    For n = 1 To ActiveChart.SeriesCollection.Count Step 1 
     r = 0 

     'Finds the current range of the series and the axis 
     For i = 1 To Len(ActiveChart.SeriesCollection(n).Formula) Step 1 
      If Mid(ActiveChart.SeriesCollection(n).Formula, i, 1) = "," Then 
       r = r + 1 
       If r = 1 Then p1 = i + 1 
       If r = 2 Then p2 = i 
       If r = 3 Then p3 = i 
      End If 
     Next i 

     'Defines new range 
     Set rng = Range(Mid(ActiveChart.SeriesCollection(n).Formula, p2 + 1, p3 - p2 - 1)) 
     Set rng = rng.Resize(rng.Rows.Count, rng.Columns.Count - 1) '~~> Replaced line 

     'Sets new range for each series 
     ActiveChart.SeriesCollection(n).Values = rng 

     'Updates axis 
     Set ax = Range(Mid(ActiveChart.SeriesCollection(n).Formula, p1, p2 - p1)) 
     Set ax = ax.Resize(ax.Rows.Count, ax.Columns.Count - 1)  '~~> Replaced line 
     ActiveChart.SeriesCollection(n).XValues = ax 

    Next n 
End Sub 
+0

Soren,我試了一下代碼,它完美地工作。我將把它的使用擴展到40多個excel圖表。謝謝。 – Bryan

1

我想你需要做的是改變

Set rng = Range(rng, rng.Offset(0, 1))

Set rng = Range(rng, rng.Offset(0, -1))

編輯:嘗試改變周圍

Set rng = Range(Mid(ActiveChart.SeriesCollection(n).Formula, p2 + 1, p3 - p2 - 1))

例如這個公式,你可以嘗試:

Set rng = Range(Mid(ActiveChart.SeriesCollection(n).Formula, p2 - 1, p3 - p2 - 1))

Set rng = Range(Mid(ActiveChart.SeriesCollection(n).Formula, p2 + 1, p3 + p2 - 1))

Set rng = Range(Mid(ActiveChart.SeriesCollection(n).Formula, p2 + 1, p3 - p2 + 1))

等等等等...

+0

謝謝伯納德。我嘗試了你的建議,但沒有奏效。雖然看起來應該。繼續工作。感謝您的迴應。 – Bryan

0

您可以使用免費的附加在我的網站上,以調整圖表系列的公式。它像查找替換一樣工作。從系列公式中讀取最後一行數據,即從更改值開始,減去一得到更改值。本教程是Change Series Formula – Improved Routines,如果您想親自嘗試一下,它以一些VBA代碼開頭,但在最後附近是指向「更改系列公式」加載項的鏈接。