У меня есть Clustered Bar charts
, созданный на листе Excel с различными диапазонами. Я использую Powerpoint deck
в качестве шаблона, состоящего из Clustered Bar chart
на слайде. Я дублирую Слайд-диаграмму и переношу каждую серию ExcelCollection в виде массива в таблицу Excel и пытаюсь изменить размер диапазона ChartData диаграмм Powerpoint в соответствии с границами массива.
- Приведенный ниже код работает, но диапазон ChartData не изменяется, а некоторые данные отсутствуют. Я попытался очистить диапазон ChartData перед передачей массива - чтобы очистить фиктивные значения в диаграмме, но он все еще не изменяет размер, и иногда старые фиктивные значения диаграммы все еще показывают.
- Я также закомментировал строки
ChartData.Activate
, так какмерцает экран даже после применения Application.screenupdating=false
. - Я должен был объявить
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
...