Excel 到 Word 到 PDF 使用 VBA

标签 excel vba pdf ms-word export

背景 :
在 StackOverflow 的帮助下,我成功地找到了一种使用 VBA 将特定内容(文本、表格和图表)从 Excel 复制到带有书签的 Word 模板的方法。保存时,我不想要 .docx 格式,而是想将其导出为 .pdf。我尝试使用 ExportAsFixedFormat 和 ExportAsFixedFormat2 并且能够成功导出它。
问题 :
这个 .pdf 文件上的内容被导出为图像(我猜)。我无法突出显示或复制文件中的文本。我做错了什么,我该如何解决? (仅供引用,pdf 上的内容复制设置为“允许”)
我目前正在使用 ActiveDocument.ExportAsFixedFormat2 SaveName, wdExportFormatPDF, , wdExportOptimizeForPrint并尝试过其他变量。
任何帮助将不胜感激。
代码:

Option Explicit

Sub ExportFile()

    Dim wrdApp As Word.Application
    Dim WrdDoc As Word.Document
    Dim WrdRng As Word.Range
    Dim WrdShp As Word.InlineShape
    Dim SaveName As String
    
    Dim ChrObj As ChartObject
    
    Set wrdApp = New Word.Application
    'wrdApp.Visible = True
    'wrdApp.Activate
    
    With wrdApp
        
        .Documents.Add Environ("UserProfile") & "\Desktop\Template.dotx"
        
        
        With .Selection
        Range("XEX771").Copy
            .GoTo What:=-1, Name:="Bookmark1"
            .PasteSpecial xlPasteValues
            .GoTo What:=-1, Name:="Bookmark2"
        Range("AG696", Range("AG696").End(xlDown).End(xlToRight)).Copy
        Application.Wait Now() + #12:00:02 AM#
            .PasteExcelTable True, False, False
            .GoTo What:=-1, Name:="Bookmark3"
        Range("F26", Range("F26").End(xlDown).End(xlToRight)).Copy
        Application.Wait Now() + #12:00:02 AM#
            .PasteExcelTable True, False, False
            .GoTo What:=-1, Name:="Bookmark4"
        Range("XEO5").Copy
            .PasteSpecial xlPasteValues
            .GoTo What:=-1, Name:="Bookmark5"
        Range("K26", Range("K26").End(xlDown).End(xlToRight)).Copy
        Application.Wait Now() + #12:00:02 AM#
            .PasteExcelTable True, False, False
        End With
    
    Set ChrObj = ActiveSheet.ChartObjects(1)
        ChrObj.Chart.ChartArea.Copy
        
        Application.Wait Now() + #12:00:02 AM#
        
    .Selection.GoTo What:=-1, Name:="Bookmark6"
    .Selection.PasteSpecial DataType:=wdPasteMetafilePicture, Placement:=wdInLine
    
    Set ChrObj = ActiveSheet.ChartObjects(2)
        ChrObj.Chart.ChartArea.Copy
        
        Application.Wait Now() + #12:00:02 AM#
        
    .Selection.GoTo What:=-1, Name:="Bookmark7"
    .Selection.PasteSpecial DataType:=wdPasteMetafilePicture, Placement:=wdInLine

    Set ChrObj = ActiveSheet.ChartObjects(3)
        ChrObj.Chart.ChartArea.Copy
        
        Application.Wait Now() + #12:00:02 AM#
        
    .Selection.GoTo What:=-1, Name:="Bookmark8"
    .Selection.PasteSpecial DataType:=wdPasteMetafilePicture, Placement:=wdInLine
   
SaveName = Environ("UserProfile") & "\Desktop\FileName.pdf"

    .ActiveDocument.ExportAsFixedFormat2 SaveName, wdExportFormatPDF, , wdExportOptimizeForPrint

    End With

wrdApp.ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges
wrdApp.Quit

Set wrdApp = Nothing

End Sub

最佳答案

使用 Selection 效率非常低 - 这也可能有助于解释为什么您在代码中插入了如此多的延迟。您还有许多不必要的 .Goto 和复制/粘贴操作。尝试:

Sub ExportFile()
Dim wrdApp As New Word.Application, WrdDoc As Word.Document
Dim WrdRng As Word.Range, WrdShp As Word.InlineShape
Dim xlSheet As Excel.Worksheet: Set xlSheet = ActiveSheet
With wrdApp
  .Visible = False
  Set WrdDoc = .Documents.Add(Environ("UserProfile") & "\Desktop\Template.dotx")
  With WrdDoc
    .Bookmarks("Bookmark1").Range.Text = xlSheet.Range("XEX771").Text
    xlSheet.Range("AG696", Range("AG696").End(xlDown).End(xlToRight)).Copy
    .Bookmarks("Bookmark2").Range.PasteExcelTable True, False, False
    xlSheet.Range("F26", Range("F26").End(xlDown).End(xlToRight)).Copy
    .Bookmarks("Bookmark3").Range.PasteExcelTable True, False, False
    .Bookmarks("Bookmark4").Range.Text = xlSheet.Range("XEO5").Text
    xlSheet.Range("K26", Range("K26").End(xlDown).End(xlToRight)).Copy
    .Bookmarks("Bookmark5").Range.PasteExcelTable True, False, False
    xlSheet.ChartObjects(1).Chart.ChartArea.Copy
    .Bookmarks("Bookmark6").Range.PasteSpecial DataType:=wdPasteMetafilePicture, Placement:=wdInLine
    xlSheet.ChartObjects(2).Chart.ChartArea.Copy
    .Bookmarks("Bookmark7").Range.PasteSpecial DataType:=wdPasteMetafilePicture, Placement:=wdInLine
    xlSheet.ChartObjects(3).Chart.ChartArea.Copy
    .Bookmarks("Bookmark8").Range.PasteSpecial DataType:=wdPasteMetafilePicture, Placement:=wdInLine
    .SaveAs FileName:=Environ("UserProfile") & "\Desktop\FileName.pdf", _
      FileFormat:=wdFormatPDF, AddToRecentFiles:=False
    .Close False
  End With
  .Quit
End With
Set WrdDoc = Nothing: Set wrdApp = Nothing: Set xlSheet = Nothing
End Sub

关于Excel 到 Word 到 PDF 使用 VBA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66672973/

相关文章:

c# - XSL + XML -> 用于 C# 的 PDF

vba - 双击单元格后,将单元格值复制到同一行上的另一个单元格

java - 将Java程序的结果放入Excel单元格

sorting - 关于在单列中查找重复项的宏的建议

vba - 从命令行启动 VBA 宏 (Excel)

vba - 在 Excel 中按单元格值获取列号

python - 以编程方式将 png 图像插入 pdf 文件中的特定位置

javascript - 使用 javascript 获取 PDF 的设备 ID

使用 ISBLANK 的 EXCEL IF/OR 语句

vba - 锁定或卡住 VBA 代码以防止编辑