在VBA中使用XLDOWN

时间:2016-03-03 15:37:12

标签: excel vba

我有一个生成数据透视表并将其粘贴到工作表中的宏。我想对该表中的数据进行一些计算,然后从这些计算中创建一个图表。目前我有下面的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 

2 个答案:

答案 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