2011-03-18 54 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