【问题标题】:From a few Excel files to PowerPoint从几个 Excel 文件到 PowerPoint
【发布时间】:2018-01-18 21:51:13
【问题描述】:

我是 VBA 编程的新手。但是我必须(并且想要)在 Excel 文件中创建宏来自动创建 PowerPoint 演示文稿。

我希望有人能够帮助我或遇到类似的问题。 即 - 我在 Excel 文件中有 6 列:

1 - slide number
2 - file access path
3 - file name
4 - sheet name
5 - slide range
6 - slide title

我希望宏自动输入给定文件->工作表->获取幻灯片的范围,将其复制并粘贴为演示文稿的图片,并为其赋予适当的标题,然后循环到下一行,然后做同样的事情。

有人可以帮助我吗?下面是我设法编写的代码,但是,我不知道如何从给定单元格中引用工作表和幻灯片的范围。

Option Explicit

Sub ExcelRangeToPowerPoint()
     Dim rng As Range
     Dim PowerPointApp As Object
     Dim myPresentation As Object
     Dim mySlide As Object
     Dim myShape As Object
     Dim adr1 As String
     Dim shta As Worksheet
     Dim wrk As String

     Application.DisplayAlerts = False

     wrk = ThisWorkbook.Name ' nname
     adr1 = Worksheets("Sheet1").Range("B2")

    'Copy Range from Excel
    ' Set rng = ThisWorkbook.ActiveSheet.Range("A1:C12")

    'Create an Instance of PowerPoint
      On Error Resume Next

    'Is PowerPoint already opened?
      Set PowerPointApp = GetObject(class:="PowerPoint.Application")

    'Clear the error between errors
      Err.Clear

    'If PowerPoint is not already open then open PowerPoint
      If PowerPointApp Is Nothing Then Set PowerPointApp = CreateObject(class:="PowerPoint.Application")

    'Handle if the PowerPoint Application is not found
      If Err.Number = 429 Then
        MsgBox "PowerPoint could not be found, aborting."
        Exit Sub
      End If

     On Error GoTo 0

    'Optimize Code
      Application.ScreenUpdating = False

     'Create a New Presentation
      Set myPresentation = PowerPointApp.Presentations.Add

      ThisWorkbook.Activate
      Range("A2").Select
     'DO While
      Do While ActiveCell.Value <> ""
          Workbooks.Open Filename:=(ActiveCell.Offset(0, 1) & "\" & ActiveCell.Offset(0, 2)), UpdateLinks:=0, ReadOnly:=True ' to be sure read-only open
          ' Worksheet Open from D2
          'Copy Range from E2

          'Add a slide to the Presentation
          Set mySlide = myPresentation.Slides.Add(1, 11) '11 = ppLayoutTitleOnly
          'Paste to PowerPoint and position
          mySlide.Shapes.PasteSpecial DataType:=2  '2 = ppPasteEnhancedMetafile + title from F2
          Set myShape = mySlide.Shapes(mySlide.Shapes.Count)

          ActiveWorkbook.Close SaveChanges:=False  ' close file and don't save
          ActiveCell.Offset(1, 0).Range("A1").Select
      Loop

      MsgBox ("Ready")
      Application.CutCopyMode = False
      Application.DisplayAlerts = True
End Sub

【问题讨论】:

  • 这会有所帮助,但我想从中创建一些幻灯片的所有数据源都在几个 excel 文件中。这就是我的问题,因为我不知道如何引用其他文件中的工作表和范围。但是感谢您的快速回答:)
  • 假设您在表 2 中,如果您想从表 1 中引用,请使用 =sheet1!A1 希望它有所帮助。利用 !参考其他表格
  • 好的,但是我怎样才能从另一个工作簿中引用一些工作表和一些范围(警告! - 此工作表的名称和范围在 D 和 E 列中) - 你可以在我的屏幕上查看已添加。
  • 对于范围,您是否打算对值求和?还是别的什么(解释一下)?如果你是,试试 =sheet1!SUM(B2:N15)

标签: vba excel powerpoint


【解决方案1】:

您总是可以参考一些工作表或工作簿创建第一个变量类型工作簿或工作表。

如果您想将变量引用到工作表/工作簿,这很容易。只是一套。比如:

Dim wb as Workbook
Set wb = ThisWorkbook

现在 wb 将被引用到 ThisWorkbook 对象。与 Worksheets 相同。您的引用方式完全相同:

Dim ws as Worksheet
Set ws = ActiveSheet

现在ws被引用到activesheet,你可以从ws处理它。

我希望这能回答您的一些疑问。关于你的代码,循环部分应该是这样的:

Dim MyWb As Workbook 'variable for workbook
Dim MyWs As Worksheet 'variable for worksheet

ThisWorkbook.Activate
Range("A2").Select
'DO While
Do While ActiveCell.Value <> ""
    ThisWorkook.Activate
    Set MyWb = Workbooks.Open(Filename:=(ActiveCell.Offset(0, 1) & "\" & ActiveCell.Offset(0, 2)), UpdateLinks:=0, ReadOnly:=True) ' to be sure read-only open
    ' Worksheet Open from D2

    Set MyWs = MyWb.Worksheets(ActiveCell.Offset(0, 3).Value) 'now MyWs is referenced to the worksheet in column D

    'Copy Range from E2
    MyWs.Activate
    MyWs.Range(ActiveCell.Offset(0, 4).Value).Copy 'we copy the range shown in column E


    'Add a slide to the Presentation
    Set mySlide = myPresentation.Slides.Add(1, 11) '11 = ppLayoutTitleOnly
    'Paste to PowerPoint and position
    mySlide.Shapes.PasteSpecial DataType:=2  '2 = ppPasteEnhancedMetafile + title from F2
    Set myShape = mySlide.Shapes(mySlide.Shapes.Count)

    'after pasting, we go back to active workbook
    Application.CutCopyMode = False
    MyWb.Activate

    MyWb.Close SaveChanges:=False  ' close file and don't save
    Set MyWs = Nothing
    Set MyWb = Nothing
    ActiveCell.Offset(1, 0).Select 'we go 1 row down
Loop

我希望你可以测试它并告诉我它是否有助于你说清楚:)

【讨论】:

  • 您好,非常感谢您的回答。我试图运行你的代码,但我收到消息“对象'_Worksheet'的方法'范围'失败。在这一行中:MyWs.Range(ActiveCell.Offset(0, 4).Value).Copy'我们复制范围显示在 E 列中所以我认为我也应该像你为 MyWb 和 MyWs 所做的那样为 Range 调暗,但坦率地说,我不知道该怎么做..
  • 在你说的那一行,ActiveCell.Offset(0, 4).Value 的值是多少?另外,它至少工作过一次吗?还是直接失败了?因为我现在在我的电脑上运行了类似的东西并且它有效。
  • 另外,请确保 E 列中的所有值都输入正确。例如,E3 你有_"AB11:AK:26"_ 应该是"AB11:AK26"。请注意区别,您的值有 2 个冒号,这会导致错误,正确的输入方式是 1 个冒号。
  • 我必须添加一行 (ThisWorkbook.Activate) - '从 E2 ThisWorkbook.Activate MyWs.Range(ActiveCell.Offset(0, 4).Value).Copy 复制范围,然后你就对了我有错误,但我纠正了它,但仍然有问题。我有 2 张幻灯片,但在此之后我收到来自 VBA 的消息:下标超出此行的范围:Set MyWs = MyWb.Worksheets(ActiveCell.Offset(0, 3).Value) '现在 MyWs 被引用到 D 列中的工作表
【解决方案2】:

非常感谢您的回答 我不得不在几个地方使用“ThisWorkbook.Activate”。 现在这个宏工作几乎完美了..这意味着创建幻灯片的顺序是相反的:1是最后一个,最后一个是1.. 更重要的是,我还想从 Excel 文件列 F 中创建每张幻灯片的标题。

在我的 VBA 代码下方:

Sub VBA_PowerPoint()

Dim PowerPointApp As Object
Dim myPresentation As Object
Dim mySlide As Object
Dim myShape As Object
Dim MyWb As Workbook 'variable for workbook
Dim MyWs As Worksheet 'variable for worksheet
Dim MyRg As Excel.Range ' variable for Range

Application.DisplayAlerts = False

ThisWorkbook.Activate
Range("A2").Select

'Create an Instance of PowerPoint
  On Error Resume Next

'Is PowerPoint already opened?
  Set PowerPointApp = GetObject(class:="PowerPoint.Application")

'Clear the error between errors
  Err.Clear

'If PowerPoint is not already open then open PowerPoint
  If PowerPointApp Is Nothing Then Set PowerPointApp = CreateObject(class:="PowerPoint.Application")

 'Handle if the PowerPoint Application is not found
  If Err.Number = 429 Then
    MsgBox "PowerPoint could not be found, aborting."
    Exit Sub
  End If

  On Error GoTo 0

 'Optimize Code
  Application.ScreenUpdating = False

 'Create a New Presentation
  Set myPresentation = PowerPointApp.Presentations.Add


 'Do While
 ThisWorkbook.Activate

Do While ActiveCell.Value <> ""
 ThisWorkbook.Activate
 Set MyWb = Workbooks.Open(Filename:=(ActiveCell.Offset(0, 1) & "\" & ActiveCell.Offset(0, 2)), UpdateLinks:=0, ReadOnly:=True) ' to be sure read-only open
 ' Worksheet Open from D2
 ThisWorkbook.Activate
 Set MyWs = MyWb.Worksheets(ActiveCell.Offset(0, 3).Value) 'now MyWs is referenced to the worksheet in column D

 'Copy Range from E2
' Set MyRg = MyWs.Range(ActiveCell.Offset(0, 4).Value) 'now MyWs is referenced to the worksheet in column E

' MyWs.Range(MyRg).Copy 'we copy the range shown in column E
 ThisWorkbook.Activate
 MyWs.Range(ActiveCell.Offset(0, 4).Value).Copy


 'Add a slide to the Presentation
 Set mySlide = myPresentation.Slides.Add(1, 11) '11 = ppLayoutTitleOnly
 'Paste to PowerPoint and position
 mySlide.Shapes.PasteSpecial DataType:=2  '2 = ppPasteEnhancedMetafile + title from F2
 Set myShape = mySlide.Shapes(mySlide.Shapes.Count)

 'after pasting, we go back to active workbook
  Application.CutCopyMode = False
  MyWb.Activate

  MyWb.Close SaveChanges:=False  ' close file and don't save
  Set MyWs = Nothing
  Set MyWb = Nothing
  ActiveCell.Offset(1, 0).Select 'we go 1 row down
Loop


Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub

【讨论】:

  • 很高兴为您提供帮助,但如果这是一个新请求,您应该提出一个新问题 :) 另外,关于“thisworkbook.Activate”,您是对的。我使用了对象“Activecell”,但为了确保该对象有效,您必须像以前一样激活工作簿。我完全忘记了,但如果你得到了你想要的,我很高兴。
  • 但是要在 F 列中使用对标题的引用,应该类似于 MyWs.Range(ActiveCell.Offset(0, 5).Value).Copy A 列右侧的 5 列表示 F 列
  • 我将为此创建单独的问题。是的,非常感谢你的帮助。顺便说一句,标题还是不行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 2018-02-23
相关资源
最近更新 更多