Question

Nanashi's reply helped me to modify the code below; the chart now responds properly. Would like to adjust further such that strfieldrange will offset one column farther to the right each time the loop steps to the next series (e.g., $Z$4:$Z$159 should become $AA$4:$AA$159 in the second step of the loop). I'm learning so please excuse the rough edges.

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

Any ideas? Thanks.

EDIT:

I think I solved it. Substituting the following code into the larger macro from above works:

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

Awesome. Thanks to @nanashi for all of his help.

Was it helpful?

Solution 3

Working code:

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

OTHER TIPS

It takes a raw formula string, as evidenced by the "=" in the beginning. Try doing it like this:

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

This should be equivalent to using: =$A$1:$A$10. Let us know if this helps.

EDIT:

As per discussion:

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

Let me know if this helps.

I am not sure if I understand your question properly.

However,

Try replacing "=$A$1:$A$15"

with Range("A1:A15").Resize(10)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top