图例格式化不会通过 VBA 发生

Legend Formatting not happening via VBA

有没有人愿意指出我的代码逻辑中的缺陷。没有抛出任何错误,但我没有得到想要的结果。

逻辑:宏会获取主图表所有图例的所有属性,将其存储在一个数组中,然后对整个ppt中的其他图表应用相同的格式数组。

代码:

       Sub FormatLegendsOfCharts(   
        
        Dim NewSel As Selection
        Set NewSel = ActiveWindow.Selection
        
        On Error Resume Next
        Dim ThisShape As Shape
        Set ThisShape = ActiveWindow.Selection.ShapeRange(1)
        On Error GoTo 0
        
        If ThisShape Is Nothing Then GoTo 100:
 
        If ThisShape.HasChart = True Then
        
            Dim ThisChart As Chart
            Set ThisChart = ThisShape.Chart
        
            If ThisChart.ChartType = xlLineMarkers Or ThisChart.ChartType = xlLine Then
                Dim GetSourceFormatting() As Variant
                ReDim GetSourceFormatting(ThisChart.SeriesCollection.Count, 8)
                Dim i As Long
                For i = 1 To ThisChart.SeriesCollection.Count
        
                    Dim EachSeries As Series
                    Set EachSeries = ThisChart.SeriesCollection(i)
        
                    GetSourceFormatting((i - 1), 0) = EachSeries.Border.Color
                    GetSourceFormatting((i - 1), 1) = EachSeries.Border.Weight            
                    GetSourceFormatting((i - 1), 2) = EachSeries.Format.Line.ForeColor.RGB
                    GetSourceFormatting((i - 1), 3) = EachSeries.Format.Line.Weight
                    GetSourceFormatting((i - 1), 4) = EachSeries.MarkerStyle
                    GetSourceFormatting((i - 1), 5) = EachSeries.MarkerSize
                    GetSourceFormatting((i - 1), 6) = EachSeries.MarkerBackgroundColor
                    GetSourceFormatting((i - 1), 7) = EachSeries.MarkerForegroundColor
                    GetSourceFormatting((i - 1), 8) = EachSeries.Name
               Next
        
               Call FormatLegendsInOtherCharts(GetSourceFormatting())
           Else
               MsgBox "Macro only works on line chart."
           End If
        
       Else
           MsgBox "Please select master chart"
       End If
        
        
        MsgBox "Done"
        
        Exit Sub
 100:
        MsgBox "Please select master chart"
        
        
    End Sub
    '-----------------------------------------------------------------
        
    Private Sub FormatLegendsInOtherCharts(Database() As Variant)
        
        
         Dim j As Long
         Dim k As Long
         
         For j = 1 To ActivePresentation.Slides.Count
         
           Dim ThisSlide As Slide
           Set ThisSlide = ActivePresentation.Slides(j) 
           
           For k = 1 To ThisSlide.Shapes.Count
           
            Dim ThisOtherShape As Shape
            Set ThisOtherShape = ThisSlide.Shapes(k)
            
             If ThisOtherShape.HasChart = True Then
            
                    Dim ThisOtherChart As Chart
                    Set ThisOtherChart = ThisOtherShape.Chart
                
                         If ThisOtherChart.ChartType = xlLineMarkers Then
                         
                            Call FormattingHappensHere(ThisOtherChart, Database())
                         
                         End If
                   
             End If
           
           Next
         
         Next
    
        End Sub
        '--------------------------------------------------------------------


        
        Private Sub FormattingHappensHere(OurChart As Chart, Databasee() As Variant)
        
        
                    Dim i As Long
                    Dim k As Long
                    
                    For i = 1 To OurChart.SeriesCollection.Count
        
                             Dim EachOtherSeries As Series
                             Set EachOtherSeries = OurChart.SeriesCollection(i)
                             
                               For k = 1 To UBound(Databasee())
                               
                                    If EachOtherSeries.Name = Databasee((k - 1), 8) Then
                                    
                                         EachOtherSeries.Border.Color = Databasee((k - 1), 0)
                                         EachOtherSeries.Border.Weight = Databasee((k - 1), 1)
                                         EachOtherSeries.Format.Line.ForeColor.RGB = Databasee((k - 1), 2)

                                         EachOtherSeries.Format.Line.Weight = Databasee((k - 1), 3)
                                         EachOtherSeries.MarkerStyle = Databasee((k - 1), 4)
                                         EachOtherSeries.MarkerSize = Databasee((k - 1), 5)
                                         EachOtherSeries.MarkerBackgroundColor = Databasee((k - 1), 6)
                                         EachOtherSeries.MarkerForegroundColor = Databasee((k - 1), 7)
                                    
                                    
                                    
                                    End If
                               
                               
                               Next
                             
                            
                              Set EachOtherSeries = Nothing
        
                    Next
        
        
        
        End Sub
        
        

您有:

If ThisOtherChart.ChartType = xlLineMarkers Then
    Call FormattingHappensHere(ThisOtherChart, Database())
End If

但你的意思可能是:

If ThisOtherChart.ChartType = xlLine Or ThisOtherChart.ChartType = xlLineMarkers Then

编辑:这对我有用(为清楚起见进行了一些重构)

Option Explicit

Sub FormatLegendsOfCharts()
        
     Dim MasterChart As Chart, pres As Presentation
     Dim GetSourceFormatting() As Variant, i As Long
     
     Set pres = ActivePresentation
     Set MasterChart = SelectedChart()
     If MasterChart Is Nothing Then Exit Sub

     ReDim GetSourceFormatting(MasterChart.SeriesCollection.Count, 8)
     For i = 1 To MasterChart.SeriesCollection.Count
         With MasterChart.SeriesCollection(i)
             GetSourceFormatting((i - 1), 0) = .Border.Color
             GetSourceFormatting((i - 1), 1) = .Border.Weight
             GetSourceFormatting((i - 1), 2) = .Format.Line.ForeColor.RGB
             GetSourceFormatting((i - 1), 3) = .Format.Line.Weight
             GetSourceFormatting((i - 1), 4) = .MarkerStyle
             GetSourceFormatting((i - 1), 5) = .MarkerSize
             GetSourceFormatting((i - 1), 6) = .MarkerBackgroundColor
             GetSourceFormatting((i - 1), 7) = .MarkerForegroundColor
             GetSourceFormatting((i - 1), 8) = .Name
         End With
    Next
    FormatLegendsInOtherCharts pres, GetSourceFormatting
       
    MsgBox "Done"
End Sub
   
        
'get the user-selected chart (or Nothing if no valid selection)
Private Function SelectedChart() As Chart
    Dim ThisShape As Shape
    Dim ThisChart As Chart
    
    On Error Resume Next
    Set ThisShape = ActiveWindow.Selection.ShapeRange(1)
    On Error GoTo 0
    
    If ThisShape Is Nothing Then
        MsgBox "Please select a Line chart"
        Exit Function
    Else
        If Not ThisShape.HasChart Then
            MsgBox "Please select a Line chart"
            Exit Function
        Else
            Set ThisChart = ThisShape.Chart
            If Not OKChart(ThisChart) Then
                MsgBox "Macro only works on line chart."
                Exit Function
            End If
        End If
    End If
    Set SelectedChart = ThisChart
End Function


'check chart type
Private Function OKChart(cht As Chart)
    OKChart = cht.ChartType = xlLine Or cht.ChartType = xlLineMarkers
End Function

Private Sub FormatLegendsInOtherCharts(pres As Presentation, Database() As Variant)
    Dim j As Long, k As Long, ThisOtherChart As Chart
    Dim ThisSlide As Slide, ThisOtherShape As Shape
    
    For j = 1 To pres.Slides.Count
        Set ThisSlide = pres.Slides(j)
        For k = 1 To ThisSlide.Shapes.Count
            Set ThisOtherShape = ThisSlide.Shapes(k)
            If ThisOtherShape.HasChart = True Then
                Set ThisOtherChart = ThisOtherShape.Chart
                If OKChart(ThisOtherChart) Then
                    FormattingHappensHere ThisOtherChart, Database()
                End If
            End If
        Next
    Next
End Sub
        
Private Sub FormattingHappensHere(OurChart As Chart, Databasee() As Variant)
    Dim i As Long, k As Long
    
    For i = 1 To OurChart.SeriesCollection.Count
        With OurChart.SeriesCollection(i)
            For k = 1 To UBound(Databasee())
                If .Name = Databasee((k - 1), 8) Then
                    .Border.Color = Databasee((k - 1), 0)
                    .Border.Weight = Databasee((k - 1), 1)
                    .Format.Line.ForeColor.RGB = Databasee((k - 1), 2)
                    .Format.Line.Weight = Databasee((k - 1), 3)
                    .MarkerStyle = Databasee((k - 1), 4)
                    .MarkerSize = Databasee((k - 1), 5)
                    .MarkerBackgroundColor = Databasee((k - 1), 6)
                    .MarkerForegroundColor = Databasee((k - 1), 7)
                End If
            Next
        End With
    Next
End Sub