简体   繁体   English

PowerPoint VBA创建和保存幻灯片

[英]powerpoint vba creating and saving slides

When I call each module separately everything works fine... but when I call them from the MAIN module the text does not shrink on overflow on the saved slides. 当我分别调用每个模块时,一切正常...但是当我从MAIN模块中调用它们时,文本不会在保存的幻灯片溢出时缩小。 Can you please help to find a way to fix this 您能帮忙找到解决此问题的方法吗

Sub MAIN()

Call Module1.CreateSlides
Call Module2.SaveSlides

End Sub

[ Module1 ] [ Module1 ]

Sub CreateSlides()

'Open the Excel workbook. Change the filename here.
Dim OWB As New Excel.Workbook
Set OWB = Excel.Application.Workbooks.Open("C:\B\Books\TXT.xlsx")

'Grab the first Worksheet in the Workbook
Dim WS As Excel.Worksheet
Set WS = OWB.Worksheets(1)

'Loop through each used row in Column A
For i = 1 To WS.Range("A65536").End(xlUp).Row

    'Copy the first slide and paste at the end of the presentation
    ActivePresentation.Slides(1).Copy
    ActivePresentation.Slides.Paste (ActivePresentation.Slides.Count + 1)

    'Change the text of the first text box on the slide.
    ActivePresentation.Slides(ActivePresentation.Slides.Count).Shapes(1).TextFrame.TextRange.Text = WS.Cells(i, 1).Value
    ActivePresentation.Slides(ActivePresentation.Slides.Count).Shapes(2).TextFrame.TextRange.Text = WS.Cells(i, 2).Value
    ActivePresentation.Slides(ActivePresentation.Slides.Count).Shapes(3).TextFrame.TextRange.Text = WS.Cells(i, 3).Value
 Next

'Close Excel
ActiveWorkbook.Close

'Delete presentation
ActivePresentation.Slides(1).Delete

End Sub

[ Module2 ] [ Module2 ]

Sub SaveSlides ()

'Save slides as png
Dim sImagePath As String
Dim sImageName As String
Dim oSlide As Slide '* Slide Object

On Error GoTo Err_ImageSave

sImagePath = "C:\"
For Each oSlide In ActivePresentation.Slides
    sImageName = oSlide.SlideNumber & ".png"
    oSlide.Export sImagePath & sImageName, "PNG"
Next oSlide

Err_ImageSave:
If Err <> 0 Then
    MsgBox Err.Description
End If

'Delete all slides
Dim Pre As Presentation
Set Pre = ActivePresentation
Dim x As Long
For x = Pre.Slides.Count To 1 Step -1
    Pre.Slides(x).Delete
Next x

'Add New slide
Set pptLayout = ActivePresentation.Designs(1).SlideMaster.CustomLayouts(1)
Set Sld = ActivePresentation.Slides.AddSlide(1, pptLayout)
Sld.Design = ActivePresentation.Designs(1)

End Sub

You mentioned "the text does not shrink on overflow on the saved slides". 您提到“文本不会在已保存的幻灯片上溢出时缩小”。 What text are you referring to? 您指的是什么文字? There are no lines that are setting the following property in your code so any on-slide objects should be following the properties of those objects in your Slide Master (and associated Custom Layouts). 没有任何行在代码中设置以下属性,因此任何幻灯片上的对象都应跟随幻灯片母版(以及关联的自定义布局)中这些对象的属性。

Sld.Shapes(x).TextFrame2.AutoSize = msoAutoSizeShapeToFitText

Try using the above line to explicitly set the fit option as required. 尝试使用上面的行根据需要显式设置fit选项。 Modified sub: 修改后的子:

Option Explicit

Sub CreateSlides()

'Open the Excel workbook. Change the filename here.
Dim OWB As New Excel.Workbook
Set OWB = Excel.Application.Workbooks.Open("C:\B\Books\TXT.xlsx")
Dim i As Long

'Grab the first Worksheet in the Workbook
Dim WS As Excel.Worksheet
Set WS = OWB.Worksheets(1)

'Loop through each used row in Column A
For i = 1 To WS.Range("A65536").End(xlUp).Row
  With ActivePresentation
    'Copy the first slide and paste at the end of the presentation
    .Slides(1).Copy
    .Slides.Paste (.Slides.Count + 1)

    'Change the text of the first text box on the slide.
    With .Slides(.Slides.Count).Shapes(1).TextFrame2
      .AutoSize = msoAutoSizeShapeToFitText
      .WordWrap = msoTrue
      .TextRange.Text = WS.Cells(i, 1).Value
    End With
    With .Slides(.Slides.Count).Shapes(2).TextFrame2
      .AutoSize = msoAutoSizeShapeToFitText
      .WordWrap = msoTrue
      .TextRange.Text = WS.Cells(i, 2).Value
    End With
    With .Slides(.Slides.Count).Shapes(3).TextFrame2
      .AutoSize = msoAutoSizeShapeToFitText
      .WordWrap = msoTrue
      .TextRange.Text = WS.Cells(i, 3).Value
    End With
  End With
 Next

'Close Excel
ActiveWorkbook.Close

'Delete presentation
ActivePresentation.Slides(1).Delete

End Sub

This appears to be a bug in PowerPoint. 这似乎是PowerPoint中的错误。 I've run into the same problem myself. 我自己也遇到了同样的问题。

If you can run the whole main batch of code, then separately run another small module to "tidy up" the text, you can fix this. 如果您可以运行全部主要代码,然后分别运行另一个小模块来“整理”文本,则可以解决此问题。

Somewhere in the main code, tag each shape that holds text (or perhaps just the ones set to shrink on overflow). 在主代码中的某处,标记每个包含文本的形状(或者可能只是设置为在溢出时缩小的形状)。 For example, if you had a reference to the shape in oSh: 例如,如果您在oSh中引用了该形状:

oSh.Tags.Add "H", cStr(oSh.Height)
oSh.Tags.Add "W", cStr(oSh.Width)

Now the shape is tagged with the size it SHOULD be. 现在,将形状标记为其应具有的尺寸。 When your main code pours text into it, the size will reset (incorrectly... there's the bug). 当您的主代码向其中倒入文本时,大小将重置(错误地...存在错误)。

So later, separately, you run code that 因此,稍后,您分别运行代码

' Looks at each shape on each slide and
' if it's tagged, reset the size to the
' size indicated by the tags:
If Len(oSh.Tags("H")) > 0 Then
   oSh.Height = cSng(oSh.Tags("H")
   oSh.Width = cSng(oSh.Tags("W")
End if

Fixup module to be applied separately 修复模块要单独应用

Sub FixUp()

Dim Obj1 As Object
Set Obj1 = CreateObject("powerpoint.application")
Obj1.Presentations.Open FileName:="C:\B\name.pptm"

    Dim pptSlide As Slide
    Dim pptShape as Shape
    'Set pptSlide = ActivePresentation.Slides(1)
    For Each pptSlide in ActivePresentation.Slides
      'With pptSlide.Shapes(1)
       For Each pptShape in pptSlide.Shapes
          With pptShape
          If .TextFrame2.TextRange.Characters.Count > 1 Then
              .TextFrame2.AutoSize = msoAutoSizeTextToFitShape
          End If
          End With '  pptShape
       Next  ' pptShape
      End With
    Next   ' Slide
End Sub

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM