2015-02-05 462 views
1

我想將數據添加到一堆現有圖表。假設每個圖表具有不同數量的數據序列,並且原始數據的位置在同一工作簿中的某處。這裏是我開始用:Excel VBA - 獲取圖表數據範圍

For iChart = 1 To iCount 
    ActiveSheet.ChartObjects("Chart " & iChart).Activate 
    intSeries = 1 
    Do Until ActiveChart.SeriesCollection(intSeries).Name = "" 
     Set rXVal = ActiveChart.SeriesCollection(intSeries).XValues '<- Object Required error 
     Set rXVal = Range(rXVal, rXVal.End(xlDown)) 
     Set rYVal = ActiveChart.SeriesCollection(intSeries).Values 
     Set rYVal = Range(rYVal, rYVal.End(xlDown)) 
     ActiveChart.SeriesCollection(intSeries).XValues = rXVal 
     ActiveChart.SeriesCollection(intSeries).Values = rYVal 
     intSeries = intSeries + 1 
    Loop 
Next iChart 

我知道ActiveChart...XValues = rXVal的作品,但我對Set rXVal = ActiveChart....XValues線得到「對象需要」錯誤。我假設,自從一個範圍進入定義數據系列後,我可以再次將該範圍返回並添加到該範圍。

UPDATE
爲了澄清事情的話,我有8個地方和FFT軟件安裝加速度計來記錄4個單獨的頻段峯值振動響應。這樣每個樣本產生32個數據點。在導出時,軟件會分出4張Excel工作簿;每個頻段一個。每張表都有加速度計名稱,樣本數量也在減少。

+3

'Values'和'XValues'(儘管您可以將它們設置爲一個範圍,*返回*一個變體數組)請嘗試尋求幫助http://j-walk.com/ss/excel/tips/tip83.htm – 2015-02-05 23:57:45

+0

您可以嘗試聲明一個Series類型的變量,然後從諸如.ForumlaR1C1之類的屬性中解析出範圍地址。例如:Dim s As Series: Set s = ActiveChart.SeriesCollection(1): Debug.Print s.FormulaR1C1 – Mike 2015-02-06 04:56:16

回答

4

我一直在使用此語法成功:

Dim rXVal() As Variant 
rXVal = ActiveChart.SeriesCollection(intSeries).XValues 

UPDATE

在這種情況下,你會得到一個數組,因爲您定語句(ActiveChart.SeriesCollection(intSeries).XValues是一個數組,而不是一個範圍。這就是你在本地窗口中看到,如果你挖成系列物體ActiveChart.SeriesCollection(intSeries)

enter image description here

(在我的虛擬數據我行命名爲R1,R2,R3,R4)

我想要說的是,XValues沒有任何屬性可以顯示其佔用的範圍。

如果你實際上需要一個範圍,我會建議從formula財產得到它。我建議的方法是更換您的錯誤造成線路與這一個:

Set rXVal = Range(Split(ActiveChart.SeriesCollection(intSeries).Formula, ",")(1)) 

接下來,我看你試圖獲得範圍Values。同樣,使用這個:

Set rYVal = Range(Split(ActiveChart.SeriesCollection(intSeries).Formula, ",")(2)) 

另一件事。

這些生產線將最終導致你的錯誤:

intSeries = 1 
Do Until ActiveChart.SeriesCollection(intSeries).Name = "" 
    ...some code... 
    intSeries = intSeries + 1 
Loop 

用做改變他們:

For intSeries = 1 To ActiveChart.SeriesCollection.Count 
    ...some code... 
Next 

還有另一件事。

考慮使用WithEnd With,因爲您重複了很多ActiveChart.SeriesCollection(intSeries)。那麼你的代碼將更具可讀性,因爲你只需跳過這麼長的一行!這不是很棒嗎?

+0

對不起,延遲;我不得不把這個項目放下來,並解決一個更高優先級的任務。這個解決方案的問題是它返回一個值的數組而不是值存在的範圍。查看問題更新爲什麼這很重要。 – 2015-03-17 13:43:46

+0

我已經更新了我的答案。希望這會有所幫助。 – ZygD 2015-03-17 21:52:37

+0

謝謝!我非常感謝這些建議,特別是在何處用for循環替換do循環(我更喜歡)。我希望能有機會更快地開展這個項目。我會讓你知道它是怎麼回事。 – 2015-03-18 22:50:53