2011-03-18 57 views
0

好吧,我是VBA和宏的初學者,但我的學習速度很快。創建圖表時參考第一張表格1(索引形式)

我試圖創建一個宏來重新排列和圖形數據快速。我將根據文件名應用數千個具有不同選項卡名稱的文件。我發現可以通過「索引號」引用該選項卡,並在排序數據時起作用。

現在我試圖創建一個線圖,我不知道如何引用標籤名稱。我正在嘗試選擇範圍。我將它改回'Sheet1',並計劃在獲悉'索引號'之前將每個文件的標籤名稱更改爲'Sheet1'。這完全是低效的,但是這是我的圖表創建代碼的部分看起來像:

ActiveSheet.Shapes.AddChart.Select 
ActiveChart.SetSourceData Source:=Range("'Sheet1'!$Z$2:$AA$25") 
ActiveChart.ChartType = xlLineMarkers 
ActiveChart.SeriesCollection(1).Delete 
ActiveChart.SeriesCollection(1).Delete 
ActiveChart.SeriesCollection.NewSeries 
ActiveChart.SeriesCollection(1).Name = "='Sheet1'!$C$1" 
ActiveChart.SeriesCollection(1).Values = "='Sheet1'!$AA$2:$AA$25" 
ActiveChart.SeriesCollection(1).XValues = "='Sheet1'!$Z$2:$Z$25" 
ActiveChart.ApplyLayout (3) 

我假設我要與某種索引號,以取代所有的「工作表Sheet1的,但我不能想辦法!我試圖隨機組合多張表單(1),但是由於我對VBA代碼不是很瞭解,所以我迷失在黑暗中。

我很欣賞任何迴應!謝謝您的幫助!

回答

0

阿曼達,

我已經修改您的代碼通過它的索引號來引用在工作簿的第一片。此代碼將允許您將圖表應用於工作簿中的第一張表格,而不管其名稱是什麼。這是通過工作表(x)完成的,其中「x」是您想要參考的工作表。工作簿中的第一張紙張通常是「1」。

ActiveSheet.Shapes.AddChart.Select 
ActiveChart.SetSourceData Source:=Sheets(1).Range("Z2:AA25") 
ActiveChart.ChartType = xlLineMarkers 
ActiveChart.SeriesCollection(1).Delete 
ActiveChart.SeriesCollection.NewSeries 
ActiveChart.SeriesCollection(1).Name = Sheets(1).Range("C1") 
ActiveChart.SeriesCollection(1).Values = Sheets(1).Range("AA2:AA25") 
ActiveChart.SeriesCollection(1).XValues = Sheets(1).Range("Z2:Z25") 
ActiveChart.ApplyLayout (3) 

希望這有助於

約翰

+0

John,非常感謝您的回覆!我嘗試了你的代碼,並得到了很好的結果(沒有錯誤),除了一件事:標題不再工作/讀取單元格C1。你寫道:ActiveChart.SeriesCollection(1).Name = Sheets(1).Range(「C1」),我相信這是爲C1命名圖表標題的要求。但是,圖表標題僅作爲「圖表標題」。我真的很喜歡它參考C1中的內容。該單元如果重要,則通過Vlookup函數引用另一個文件。我嘗試了其他隨機常量單元,但它們也沒有工作。十分感謝你的幫助! :) – Amanda 2011-03-21 19:45:08

0

這將工作。你的代碼包含很多重複的關鍵字;請注意,我使用With聲明對其進行了清理。此外一切都在代碼的頂部規定:當數據位於等

這是不良的做法依靠SheetSeriesCollection的指標,盲目地假定它是(1)。我保證這會在某些時候爲你搞砸。更好地繼續參考這些對象,如下所述,例如, Set serMyseries = .SeriesCollection.NewSeries,然後在serMyseries上運行 - 不在SeriesCollection(1)上。

所有Dim語句只有在您的代碼頂部有Option Explicit時才需要。如果您不使用Option Explicit,則可以刪除這些行。 (但是Option Explicitgood practice。)

Dim shtData As Worksheet 
Dim chtMyChart As Chart 
Dim serMyseries As Series 
Dim rngName As Range 
Dim rngMyValues As Range 
Dim rngMyXValues As Range 

' What sheet is the data on? 
Set shtData = Worksheets("Sheet1") ' Or whatever it's called on the tab 

' Where is the data? 
Set rngName = shtData.Range("C1") 
Set rngMyValues = shtData.Range("AA2:AA25") 
Set rngMyXValues = shtData.Range("Z2:Z25") 

With shtData 
    .Activate 

    ' Add a chart. 
    Set chtMyChart = .Shapes.AddChart 
    With chtMyChart 
     .ChartType = xlLineMarkers 
     ' Add the series. 
     Set serMyseries = .SeriesCollection.NewSeries 
     With serMyseries 
      .Name = rngName 
      .Values = rngMyValues 
      .XValues = rngMyXValues 
     End With 
     .ApplyLayout (3) 
    End With 
End With 

的代碼的以下兩行是無用的(第一行創建一個系列,第二行立即刪除它),所以我除去它們。

ActiveChart.SetSourceData Source:=shtData.Range("Z2:AA25") 
ActiveChart.SeriesCollection(1).Delete 
+0

Jena-Francois-謝謝你的迴應。但是,我能夠理解約翰寫得更好的代碼,因爲顯然他並沒有從我自己那裏改變太多。我對VBA的理解程度非常低。感謝您的迴應,但我無法完全理解它,以至於能夠操縱它並將其合併到包含許多其他操作的原始長代碼中。我只是不習慣你的格式。感謝您花時間回答我的問題! – Amanda 2011-03-21 19:47:47

+0

好的,但現在更好地擺脫你的壞習慣,而不是採取別人的壞習慣...... – 2011-03-22 00:16:58