. Левое позиционирование фигур в неправильном месте в PowerPoint 2016 VBA

Я пытаюсь скопировать диапазоны из листа 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=0.

ashleedawg 02.05.2018 12:58

Спасибо! Да, к сожалению, не так много подсказок. .Left - это свойство объектов фигуры, которое просто представляет расстояние в точках от левого края ограничительной рамки фигуры до левого края слайда. Он может быть установлен с целочисленным значением или возвращать целочисленное значение крайней левой позиции фигуры. Я умножаю по мере того, как VBA измеряет в пунктах, но у меня есть значения cm там, где я бы хотел, чтобы положение было, а коэффициент преобразования составляет 28,35

kaydee 02.05.2018 13:03

Не видя, что у вас есть, я не могу сильно помочь (или визуализировать вашу проблему), но можете ли вы правильно разместить эти формы вручную? Если да, то какова ценность .Left после того, как вы это сделаете?

ashleedawg 02.05.2018 13:05

Посмотрите, поможет ли вставка как ppPasteEnhancedMetafile.

CCM 02.05.2018 13:06

@CCM, который, похоже, исправляет проблему с позиционированием, но вставляет диапазон как изображение, а не таблицу, что не идеально. Если это единственный способ обойти это, я могу отформатировать в Excel и вставить как изображение, но в идеале люди могли бы копировать и вставлять текст из этих таблиц.

kaydee 02.05.2018 13:14

@ashleedawg да, вот как я пришел к умноженным числам 10,56 и 3,83; это значения .left и .top при размещении вручную

kaydee 02.05.2018 13:14

@ user9729704 хорошо, я не работал с таблицами в ppt. Могу я предложить обходной путь? Я вижу, что вы уже используете шаблон, так почему бы не добавить туда таблицы так, как вы хотите, тогда вы можете либо обновить данные в рабочем файле, либо сохранить начальные размеры в некоторых переменных, чтобы использовать их позже в указанном рабочем файле.

CCM 02.05.2018 13:20

@CCM, это было бы здорово, и я изначально думал создать шаблон с форматированными таблицами на каждом слайде и вставлять в них значения, но не могу понять, как передавать информацию в таблицы из диапазона. Придется ли вам перебирать все ячейки в таблице и присваивать им значения по отдельности или что-то в этом роде?

kaydee 02.05.2018 13:31

@ user9729704 Как я уже говорил, я не работал с таблицами в PowerPoint, поэтому, боюсь, никаких фрагментов кода, но если они действуют как таблицы базы данных, я почти уверен, что вы не сможете легко вставить туда диапазон. Вы должны относиться к нему как к матрице и переходить через ячейку / столбец / строку. Быстрый Google и это - это руководство по работе с таблицами в Excel (проще для понимания, imo), а это - для PowerPoint. Надеюсь, поможет!

CCM 02.05.2018 13:43

@CCM спасибо за вашу помощь

kaydee 02.05.2018 13:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
10
1 216
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужно перебрать таблицу и данные, если вы используете шаблон. Если у вас уже есть таблица (таблица 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

Большое вам спасибо за ответ - я связывал себя узлами, пытаясь выработать петли, которые заставят его работать, и мне удалось получить только одно и то же значение для заполнения каждой ячейки таблицы. Это действительно умно, еще раз спасибо !!

kaydee 09.05.2018 17:58

У меня та же проблема, и я запускаю сообщение отладки, показывающее положение после вставки, и оно кажется правильным. Но только эскиз выглядит нормально, а на самом деле слайд неправильный.

Я выяснил, что положение таблицы будет правильным при активации или отображении слайда перед вставкой таблицы. Также, если нужно вставить несколько таблиц, мне нужно было сделать небольшой перерыв в 2 секунды между операциями вставки.

Мой обходной путь довольно уродливый, и я все еще ищу причину. Вероятно, это ошибка, но, возможно, это также связано с каким-то смещением слайда в фоновом режиме.

Похоже, что выбор слайда перед попыткой изменить положение фигуры / таблицы является ответом в этом случае. Решил проблему для меня.

Noobster 13.02.2020 10:02

Другие вопросы по теме