Изменение размера диапазона ChartData в Powerpoint Chart и передача значений данных Excel Chart в виде массива - PullRequest
0 голосов
/ 30 октября 2019

У меня есть Clustered Bar charts, созданный на листе Excel с различными диапазонами. Я использую Powerpoint deck в качестве шаблона, состоящего из Clustered Bar chart на слайде. Я дублирую Слайд-диаграмму и переношу каждую серию ExcelCollection в виде массива в таблицу Excel и пытаюсь изменить размер диапазона ChartData диаграмм Powerpoint в соответствии с границами массива.

  1. Приведенный ниже код работает, но диапазон ChartData не изменяется, а некоторые данные отсутствуют. Я попытался очистить диапазон ChartData перед передачей массива - чтобы очистить фиктивные значения в диаграмме, но он все еще не изменяет размер, и иногда старые фиктивные значения диаграммы все еще показывают.
  2. Я также закомментировал строки ChartData.Activate, так какмерцает экран даже после применения Application.screenupdating=false.
  3. Я должен был объявить Shp как объект, а не как Shape, как это ни странно, он не давал мне указатель на ChartData. То же самое касается oCht, pCht и ChtData.

. Я использую Excel 2016 Pro (64-разрядная версия) с PowerPoint 2016 (64-разрядная версия) в Windows 10 Enterprise (64). бита) машина. Любая помощь в том, что или где я делаю неправильно, будет очень признательна.

Dim sFormula As String
Dim rFirst As Range, rLast As Range
Dim arr
Dim oPPT As Object
Dim oPres As Object
Dim oSlide As Object
Dim oCht As ChartObject
Dim Shp As Object
Dim pCht As Object
Dim ChtData As Object 'ChartData

With shtSheetName
    For Each oCht In .ChartObjects
        With oCht.Chart
            sFormula = .SeriesCollection(1).Formula
            Set rFirst = Range(Split(sFormula, ",")(2))(1)
            sFormula = .SeriesCollection(.SeriesCollection.Count).Formula
            Set rLast = Range(Split(sFormula, ",")(2)).Item(Range(Split(sFormula, ",")(2)).Count)

            With Range(rFirst, rLast)
                arr = .Offset(0, -1).Resize(.Rows.Count + 1, .Columns.Count + 1).Value2
            End With
            With oPres
                Set oSlide = .slides("Slide0_SlideName").Duplicate
                With oSlide
                    .Select
                    .moveto oPres.slides.Count
                    For Each Shp In .Shapes
                        If Shp.HasChart = True Then
                            Set pCht = Shp.Chart
                            Set ChtData = pCht.ChartData
                            With ChtData
                                .Activate
                                .Workbook.Application.WindowState = -4140
                   .Workbook.Sheets("PTSht").UsedRange.Offset(1, 0).ClearContents
                   .Workbook.Sheets("PTSht").UsedRange.Offset(1, 0).Resize(UBound(arr, 1), UBound(arr, 2)).Value2 = arr
                                pCht.SetSourceData .Workbook.Sheets("PTSht").UsedRange.Resize(UBound(arr, 1), UBound(arr, 2)).Address(, , , External:=True)   'EDIT as per Dhirendra Kumar's solution
                                .Workbook.Close
                            End With
                            Exit For
                        End If
                    Next Shp
                End With
            End With
        End With
    Next oCht
End With
...

1 Ответ

1 голос
/ 30 октября 2019

Вы можете попробовать следующий код до закрытия таблицы данных диаграммы, чтобы обновить диапазон данных для диаграммы:

pcht.SetSourceData ChtData.Workbook.Sheets(1).UsedRange.Address(External:=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...