因此,我在这里找到了这个不错的脚本: http://www.pptfaq.com/FAQ00274_Export_Text_to_a_text_file-_extract_text_from_PowerPoint_-Mac_or_PC-.htm (我用的是第二个)
导入部分是这样的:
For Each oShp In oSld.Shapes 'Loop thru each shape on slide
'Check to see if shape has a text frame and text
If oShp.HasTextFrame And oShp.TextFrame.HasText Then
If oShp.Type = msoPlaceholder Then
Select Case oShp.PlaceholderFormat.Type
Case Is = ppPlaceholderTitle, ppPlaceholderCenterTitle
Print #iFile, "Title:" & vbTab & oShp.TextFrame.TextRange
Case Is = ppPlaceholderBody
Print #iFile, "Body:" & vbTab & oShp.TextFrame.TextRange
Case Is = ppPlaceholderSubtitle
Print #iFile, "SubTitle:" & vbTab & oShp.TextFrame.TextRange
Case Else
Print #iFile, "Other Placeholder:" & vbTab & oShp.TextFrame.TextRange
End Select
Else
Print #iFile, vbTab & oShp.TextFrame.TextRange
End If ' msoPlaceholder
Else ' it doesn't have a textframe - it might be a group that contains text so:
If oShp.Type = msoGroup Then
sTempString = TextFromGroupShape(oShp)
If Len(sTempString) > 0 Then
Print #iFile, sTempString
End If
End If
End If ' Has text frame/Has text
Next oShp
我已经对其进行了一些修改,因此输出文件不包含“标题”、“其他占位符”等文本,也不插入制表符(“vbTab”)。但是,它将每一行(或段落)放入输出文件的新行中。
问题:我如何告诉脚本将“幻灯片”/“正文”中的所有“内容”转储到同一行/单元格中?
我注意到这个脚本(以及这个http://www.pptfaq.com/FAQ00332_Export_Slide_Number_and_Title_Text_to_a_text_file.htm) 对标题表现出这种行为,仅适用于“body”或“ppPlaceholderBody”。
我不知道为什么会这样,也不知道有什么区别。难道它根本就无法区分两行或公告,即使是在相同的形状/框中?我的目标是在多个 .ppt 上使用一致的行/单元格编号,以便在幻灯片 2 中添加一行不会导致幻灯片 5 中的内容移到下一行。
感谢您的帮助!
答案1
我的 PowerPoint 安装目前已关闭,因此尚未测试。但是...
您只需创建一个字符串变量并添加到其中,然后在完成幻灯片后,将该字符串复制到 Excel 单元格。
Dim slideText As String
For Each oShp In oSld.Shapes 'Loop thru each shape on slide
If Len(slideText) > 0 Then
'--- strip the unneeded trailing CRLF
slideText = Left$(slideText, Len(slideText) - 2)
'--- now copy the string to the appropriate cell in Excel
Else
'--- clear the string for the next slide
slideText = vbNullString
End If
'Check to see if shape has a text frame and text
If oShp.HasTextFrame Then
If oShp.TextFrame.HasText Then
If oShp.Type = msoPlaceholder Then
Select Case oShp.PlaceholderFormat.Type
Case Is = ppPlaceholderTitle, ppPlaceholderCenterTitle
slideText = slideText & "Title:" & vbTab & _
oShp.TextFrame.TextRange & vbCrLf
Case Is = ppPlaceholderBody
slideText = slideText & "Body:" & vbTab & _
oShp.TextFrame.TextRange & vbCrLf
Case Is = ppPlaceholderSubtitle
slideText = slideText & "SubTitle:" & vbTab & _
oShp.TextFrame.TextRange & vbCrLf
Case Else
slideText = slideText & "Other Placeholder:" & _
vbTab & oShp.TextFrame.TextRange & vbCrLf
End Select
Else
slideText = slideText & vbTab & oShp.TextFrame.TextRange
End If ' msoPlaceholder
End If
Else
' it doesn't have a textframe - it might be a group that contains text so:
If oShp.Type = msoGroup Then
sTempString = TextFromGroupShape(oShp)
If Len(sTempString) > 0 Then
slideText = slideText & sTempString & vbCrLf
End If
End If
End If ' Has text frame/Has text
Next oShp
'--- catch the text on the last slide here
If Len(slideText) > 0 Then
'--- strip the unneeded trailing CRLF
slideText = Left$(slideText, Len(slideText) - 2)
'--- now copy the string to the appropriate cell in Excel
End If
当然,你要对每张幻灯片都进行这样的循环。
答案2
我认为这没什么帮助,但是:https://stackoverflow.com/questions/45468824/printing-from-ppt-vba-to-an-excel-spreadsheet 尝试使用 Lbound 和 Ubound 进行类似的操作来打印到特定单元格。
只要单元格在多个 ppt/xls 上保持一致,我实际上就不知道字符串去了哪里......
(虽然它也选择了一个特定的 xls 文件,但我想为每次打印创建一个新的文件,但这对于我已有的代码来说应该不是问题,它可以创建一个指定的文件或使用 ppt 中的文件名。)