[英]Excel 2013 proper syntax for dynamic data range in VBA loop
Nanashi的回复帮助我修改了以下代码; 图表现在可以正确响应。 想要进一步调整,以便每次循环进入下一个系列时strfieldrange都将向右偏移一列(例如,在第二步中,$ Z $ 4:$ Z $ 159应该变成$ AA $ 4:$ AA $ 159环)。 我正在学习,所以请原谅。
Sub stacklabels2()
finalrow = Worksheets("Stacking RR").Range("Z" & Rows.Count).End(xlUp).Row 'trying to derive the proper range dynamically
' sensing that I need another variable here that will allow me to cause strfieldrange to step with the loop
strfieldrange = "=" & "'Stacking RR'!" & Range("$Z$4:$Z$159").Address
Sheets("Stacking").Select
ActiveSheet.ChartObjects("StackingPlan").Activate
ActiveChart.SetElement (msoElementDataLabelNone)
ActiveChart.ApplyDataLabels
ActiveSheet.ChartObjects("StackingPlan").Activate
For Each Ser In ActiveChart.SeriesCollection
Ser.DataLabels.Format.TextFrame2.TextRange.InsertChartField msoChartFieldRange, strfieldrange, 0
Ser.DataLabels.ShowRange = True
Ser.DataLabels.ShowValue = False
Next Ser
End Sub
有任何想法吗? 谢谢。
编辑:
我想我解决了。 将以下代码替换为上述工作中的较大宏:
keycolumn = Range("Z4").Column
For Each Ser In ActiveChart.SeriesCollection
n = Val(Ser.Name)
Ser.DataLabels.Format.TextFrame2.TextRange.InsertChartField msoChartFieldRange, CStr("='Stacking RR'!" & Range(Cells(4, keycolumn + n), Cells(LastRow, keycolumn + n)).Address), 0
Ser.DataLabels.ShowRange = True
Ser.DataLabels.ShowValue = False
Next Ser
真棒。 感谢@nanashi的所有帮助。
它采用原始的公式字符串,如开头的“ =”所示。 尝试这样做:
Sub Blah()
' Other code.
StrFieldRange = "=" & Range("A1").Resize(10, 1).Address
ActiveSheet.ChartObjects("Chart1").Activate
For Each Ser In ActiveChart.SeriesCollection
Ser.DataLabels.Format.TextFrame2.TextRange.InsertChartField _
msoChartFieldRange, StrFieldRange, 0
Next
'Etc.
End Sub
这应该等效于使用: =$A$1:$A$10
。 让我们知道是否有帮助。
编辑:
根据讨论:
Sub StackLabelsMod()
Dim WS0 As Worksheet, WS1 As Worksheet
Dim RngHeader As Range, RngCell As Range
Dim StrField As String
Dim LastRow As Long, ResizeRow As Long
With ThisWorkbook
Set WS0 = .Sheets("Stacking RR")
Set WS1 = .Sheets("Stacking")
End With
With WS0
LastRow = .Range("Z" & .Rows.Count).End(xlUp).Row
ResizeRow = LastRow - 3 'If data begins at row 4, subtract 1 to get correct starting row of data.
Set RngHeader = .Range("Z4:AS4")
End With
For Each RngCell In RngHeader
StrField = "='Stacking RR'!" & RngCell.Resize(ResizeRow, 1).Address
WS1.ChartObjects("StackingPlan").Activate
ActiveChart.SetElement (msoElementDataLabelNone)
ActiveChart.ApplyDataLabels
ActiveSheet.ChartObjects("StackingPlan").Activate
For Each Ser In ActiveChart.SeriesCollection
Ser.DataLabels.Format.TextFrame2.TextRange.InsertChartField msoChartFieldRange, StrField, 0
Ser.DataLabels.ShowRange = True
Ser.DataLabels.ShowValue = False
Next Ser
Next
End Sub
让我知道是否有帮助。
我不确定是否能正确理解您的问题。
然而,
尝试替换"=$A$1:$A$15"
与Range("A1:A15").Resize(10)
工作代码:
Sub StackLabels()
Dim WS0 As Worksheet, WS1 As Worksheet
Dim RngHeader As Range, RngCell As Range
Dim StrField As String
Dim LastRow As Long, ResizeRow As Long
With ThisWorkbook
Set WS0 = .Sheets("Stacking RR")
Set WS1 = .Sheets("Stacking")
End With
With WS0
LastRow = .Range("Z" & .Rows.Count).End(xlUp).Row
ResizeRow = LastRow - 3 'If data begins at row 4, subtract 1 to get correct starting row of data.
Set RngHeader = .Range("Z4:AS4")
End With
WS1.ChartObjects("StackingPlan").Activate
ActiveChart.SetElement (msoElementDataLabelNone)
ActiveChart.ApplyDataLabels
ActiveSheet.ChartObjects("StackingPlan").Activate
keycolumn = Range("Z4").Column
For Each Ser In ActiveChart.SeriesCollection
n = Val(Ser.Name)
Ser.DataLabels.Format.TextFrame2.TextRange.InsertChartField msoChartFieldRange, CStr("='Stacking RR'!" & Range(Cells(4, keycolumn + n), Cells(LastRow, keycolumn + n)).Address), 0
Ser.DataLabels.ShowRange = True
Ser.DataLabels.ShowValue = False
Next Ser
End Sub
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.