2016-03-03 34 views
1

我有一个生成数据透视表并将其粘贴到工作表的宏。我想对该表中的数据进行一些计算,然后从这些计算中创建一个图表。目前我有下面的VBA,它工作正常,但数据透视表已经开始有不同数量的行,而不是总是48.我希望能够动态生成图表,无论数据透视表有多少行结束。数据透视表数据将始终以A64开头(带有A63中我不需要的标题),并且底部有一个总数,我不想要,所以我想我必须使用xldown - 1或其他类似。表格中有多个表格,但它们之间有空格。在VBA中使用XLDOWN

我想我需要在这种情况下使用结束XLDOWN,但我不知道如何做到这一点。谁能帮忙?

Range("Pivots!$E64).Formula = "=((C64/B64)/DATA!$Y$5)" 
Range("Pivots!$E65).Formula = "=((C65/B65)/DATA!$Y$5)" 

... and so on down to 

Range("Pivots!$E111).Formula = "=((C111/B111)/DATA!$Y$5)" 

ActiveSheet.Shapes.AddChart.Select 
ActiveChart.ChartType = xlLine 
ActiveChart.SetSourceData Source:=Range("Pivots!$E$64:$E$111") 
ActiveChart.SeriesCollection(1).XValues = "=Pivots!$A$64:$A$111" 

ActiveSheet.ChartObjects("Chart 1").Activate 
ActiveChart.ChartArea.Select 
ActiveChart.Parent.Cut 
Sheets("Front Sheet").Select 

Range("B23").Select 
ActiveSheet.Paste 
+0

看到这篇文章[使用xlUp和xlDown](http://www.thespreadsheetguru.com/blog/2014/7/7/5-different-ways-to-find-the-last-row -or-last-column-using-vba)在表格或电子表格中。 – Oligg

回答

2

你可以存储数据透视表的行结尾:

Dim LRow as Long 
LRow = Sheets("Pivots").Range("B3").End(XLDown).Row -1 

然后,您可以使用LRow变量来表示数据透视表的最后一行。你需要使用一个循环设置你的公式,像昏暗LLOOP只要

For LLoop = 64 To LRow 
    Sheets("Pivots").Range("$E" & LLoop).Formula = "=((C" & LLoop & "/B" & LLoop & ")/DATA!$Y$5)" 
Next LLoop 

最后,你可以使用相同的LRow变量设置你的数据透视表的源数据和XValues。

ActiveChart.SetSourceData Source:=Sheets("Pivots").Range("$E$64:$E$" & LRow) 
ActiveChart.SeriesCollection(1).XValues = "=Pivots!$A$64:$A$" & LRow 
+0

感谢这个,但是我在这行 ActiveChart.SetSourceData来源得到一个错误:=表( “支点”)的范围。( “$ E $ 64:$ E $” &LRow) 它说 运行时间错误“91”: 对象变量或未设置块变量。 – tomdemaine

+0

@tomdemaine尝试使用'ActiveChart.SetSourceData Source:= Range(“Pivots!$ E $ 64:$ E $”&LRow)' –

+0

同样的问题恐怕 – tomdemaine

1

除了单独输出每个公式,您可以使用.FillDown Method

With wsPivots 
    lastPivotRow = .Range("E64").End(xlDown).Row - 1 
    .Range("E64").Formula = "=((C64/B64)/DATA!$Y$5)" 
    .Range("E64:E" & lastPivotRow).FillDown 
End With 

正如@Nick Peranzi解释,你可以指定一个变量与枢轴数据的最后一排,然后在你的代码中使用此。

还值得一提的是,当使用VBA中的对象时,如果利用了With...End With statement,它可以提高速度。

With ActiveChart 
    .ChartType = xlLine 
    .SetSourceData Source:=Range("Pivots!$E$64:$E$" & lastPivotRow) 
    .SeriesCollection(1).XValues = "=Pivots!$A$64:$A$" & lastPivotRow 
End With