Я пытаюсь скопировать диапазоны из листа Excel и вставить их в слайды в виде таблиц, а затем расположить и изменить их размер. Однако, когда я пытаюсь разместить фигуры в ppt, метод .Left ведет себя не так, как ожидалось; на эскизах слайдов в левой части экрана фигуры находятся в ожидаемых положениях (по центру, как в приведенном ниже коде), но когда я выбираю слайд, фигуры сдвигаются далеко вправо от того места, где они должны быть.
Я думал, что он может использовать «центр» в качестве ориентира вместо левой границы слайда, но это не соответствует величине смещения.
Был бы очень признателен за помощь с этим - было бы хорошо знать, является ли это ошибкой в ppt или ошибкой в моем коде, как если бы это ошибка, она сильно повлияла на осуществимость этого проекта. В этом конкретном примере я, вероятно, мог бы использовать метод .Align в качестве обходного пути, но для последующих слайдов мне нужно иметь возможность точно позиционировать несколько фигур на одном слайде.
Я использую Office 365.
Код ниже:
Sub PP_export()
Dim PPApp As PowerPoint.Application
Dim PPPres As PowerPoint.Presentation
Dim PPSlide As PowerPoint.Slide
Dim XLws As Worksheet
Set PPApp = New PowerPoint.Application
Set XLws = ActiveSheet
Set PPPres = PPApp.Presentations.Open("Y:\Research\PROJECTS\2018\Magic Macro\ppt_template_.potx")
PPApp.Visible = True
''Lifestyle Statements
'By Col%
Set PPSlide = PPPres.Slides(3)
Dim LSCol As PowerPoint.Shape
XLws.Range("M106:o126").Copy
PPSlide.Shapes.PasteSpecial ppPasteDefault
Set LSCol = PPSlide.Shapes("Table 2")
With LSCol
.Left = (28.35 * 10.56)
.Top = (28.35 * 3.83)
.Height = (28.35 * 13.21)
.Width = (28.35 * 12.75)
End With
'By Index
Set PPSlide = PPPres.Slides(4)
Dim LSIndex As PowerPoint.Shape
XLws.Range("Q106:s126").Copy
PPSlide.Shapes.PasteSpecial ppPasteDefault
Set LSIndex = PPSlide.Shapes("Table 2")
With LSIndex
.Left = (28.35 * 10.56)
.Top = (28.35 * 3.83)
.Height = (28.35 * 13.21)
.Width = (28.35 * 12.75)
End With
Спасибо! Да, к сожалению, не так много подсказок. .Left - это свойство объектов фигуры, которое просто представляет расстояние в точках от левого края ограничительной рамки фигуры до левого края слайда. Он может быть установлен с целочисленным значением или возвращать целочисленное значение крайней левой позиции фигуры. Я умножаю по мере того, как VBA измеряет в пунктах, но у меня есть значения cm там, где я бы хотел, чтобы положение было, а коэффициент преобразования составляет 28,35
Не видя, что у вас есть, я не могу сильно помочь (или визуализировать вашу проблему), но можете ли вы правильно разместить эти формы вручную? Если да, то какова ценность .Left
после того, как вы это сделаете?
Посмотрите, поможет ли вставка как ppPasteEnhancedMetafile
.
@CCM, который, похоже, исправляет проблему с позиционированием, но вставляет диапазон как изображение, а не таблицу, что не идеально. Если это единственный способ обойти это, я могу отформатировать в Excel и вставить как изображение, но в идеале люди могли бы копировать и вставлять текст из этих таблиц.
@ashleedawg да, вот как я пришел к умноженным числам 10,56 и 3,83; это значения .left и .top при размещении вручную
@ user9729704 хорошо, я не работал с таблицами в ppt. Могу я предложить обходной путь? Я вижу, что вы уже используете шаблон, так почему бы не добавить туда таблицы так, как вы хотите, тогда вы можете либо обновить данные в рабочем файле, либо сохранить начальные размеры в некоторых переменных, чтобы использовать их позже в указанном рабочем файле.
@CCM, это было бы здорово, и я изначально думал создать шаблон с форматированными таблицами на каждом слайде и вставлять в них значения, но не могу понять, как передавать информацию в таблицы из диапазона. Придется ли вам перебирать все ячейки в таблице и присваивать им значения по отдельности или что-то в этом роде?
@ user9729704 Как я уже говорил, я не работал с таблицами в PowerPoint, поэтому, боюсь, никаких фрагментов кода, но если они действуют как таблицы базы данных, я почти уверен, что вы не сможете легко вставить туда диапазон. Вы должны относиться к нему как к матрице и переходить через ячейку / столбец / строку. Быстрый Google и это - это руководство по работе с таблицами в Excel (проще для понимания, imo), а это - для PowerPoint. Надеюсь, поможет!
@CCM спасибо за вашу помощь
Вам нужно перебрать таблицу и данные, если вы используете шаблон. Если у вас уже есть таблица (таблица 2) на слайде 3, вы можете использовать ее. просто отправьте объект файла Excel и шаблон (путь + имя) это может потребовать некоторой доработки.
Sub Slide_3(ByRef xlWorkBook, Template)
For Each oSh In Presentations(Template).Slides(3).Shapes
Select Case oSh.Name
Case "Table 2"
For i = 1 To 20
For j = 1 To 3
oSh.Table.Cell(i, j).Shape.TextFrame.TextRange.Text = xlWorkBook.Worksheets(24).Cells(105 + i, j + 12).Value
Next j
Next i
'M106:o126
End Select
Next oSh
End Sub
Большое вам спасибо за ответ - я связывал себя узлами, пытаясь выработать петли, которые заставят его работать, и мне удалось получить только одно и то же значение для заполнения каждой ячейки таблицы. Это действительно умно, еще раз спасибо !!
У меня та же проблема, и я запускаю сообщение отладки, показывающее положение после вставки, и оно кажется правильным. Но только эскиз выглядит нормально, а на самом деле слайд неправильный.
Я выяснил, что положение таблицы будет правильным при активации или отображении слайда перед вставкой таблицы. Также, если нужно вставить несколько таблиц, мне нужно было сделать небольшой перерыв в 2 секунды между операциями вставки.
Мой обходной путь довольно уродливый, и я все еще ищу причину. Вероятно, это ошибка, но, возможно, это также связано с каким-то смещением слайда в фоновом режиме.
Похоже, что выбор слайда перед попыткой изменить положение фигуры / таблицы является ответом в этом случае. Решил проблему для меня.
Добро пожаловать в Переполнение стека! Вы проверили документация метода? Кроме того, что / почему вы размножаетесь? Крайний слева -
.Left=0
.