我有一个生成数据透视表并将其粘贴到工作表中的宏。我想对该表中的数据进行一些计算,然后从这些计算中创建一个图表。目前我有下面的VBA并且它工作正常但是数据透视表已经开始具有不同数量的行而不是总是48.我希望能够动态生成图表,无论数据透视表最终有多少行。数据透视表数据将始终在A64中启动(A63中的标题我不需要)并且它底部有一个总计我不想要的所以我想我将不得不使用xldown - 1或者其他东西类似。工作表上有多个表格,但它们之间有空格。
我认为在这种情况下我需要使用End 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 :(得分:2)
您可以使用以下内容存储数据透视表结尾的行:
Dim LRow as Long
LRow = Sheets("Pivots").Range("B3").End(XLDown).Row -1
然后,您可以使用LRow变量来表示数据透视表的最后一行。您将需要使用循环来设置公式,例如Dim LLoop As Long
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
答案 1 :(得分: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