【问题标题】:Excel VBA Print or SaveAs Webpage as PDFExcel VBA 打印或另存为 PDF 网页
【发布时间】:2018-07-10 19:27:31
【问题描述】:

目前,我在 Excel 工作表的 C 列中有一个 URL 列表。我的代码将遍历所有 URL 并在 Internet Explorer 中打开它们。加载后,它将在同一浏览器中打开下一个,依此类推。

我缺少的是在转到下一个 URL 之前将页面打印为 PDF 或另存为 PDF。 PDF 文件名将是 B 列中相应单元格的内容。

我是打印网页的新手,所以我一直在尝试几种不同的方法。最常见的方法是使用.ExecWB OLECMDID_PRINT 命令。问题是,它从来没有为我做任何事情。它只是移动到下一个 URL 而不保存或打印网页。

我参考了很多 stackoverflow 的帖子,这里有一些可以命名:

VBA to click within Print Preview window in IE11

Automate IE print dialog box without using SendKeys

Bypass Printdialog in IE9

这是我的代码:

Option Explicit

Const OLECMDID_PRINT = 6
Const OLECMDEXECOPT_PROMPTUSER = 1
Const OLECMDEXECOPT_DONTPROMPTUSER = 2
Const PRINT_WAITFORCOMPLETION = 2
Const OLECMDID_SAVEAS = 4

Sub OpenURL_Print()

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = True

Dim wb As Workbook
Dim wsSheet As Worksheet, Rows As Long, links As Variant, IE As Object, link As Variant
Set wb = ThisWorkbook
Set wsSheet = wb.Sheets("Sheet1")

Set IE = New InternetExplorerMedium

Rows = wsSheet.Cells(wsSheet.Rows.Count, "C").End(xlUp).Row
links = wsSheet.Range("C1:C" & Rows)

With IE
    .Visible = True
    For Each link In links
        .Navigate (link)
        While .Busy Or .ReadyState <> 4: DoEvents: Wend

  IE.ExecWB OLECMDID_SAVEAS, OLECMDEXECOPT_DONTPROMPTUSER


    Next link
End With

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub

在转到下一个 URL 之前,有人可以帮助我将页面打印为 PDF 吗?我不确定我在这段代码中遗漏了什么或做错了什么。我什至还没有尝试指定保存位置或保存名称,因为我第一次尝试以任何方式打印它。

非常感谢!

【问题讨论】:

  • @QHarr 感谢您的回复!通过该链接,我看到了它的 PDFCreator,这是一个我无法访问的软件。那里的示例代码是否仍然适用于“Microsoft Print to PDF”甚至“CutePDF Writer”?
  • 在 SO 上有许多用于此任务的示例打印功能。有些地方你可以改变论点,但恐怕我还没有测试过。

标签: vba excel


【解决方案1】:

您的代码有几个不同的问题。你应该做的第一件事是让它在单元格范围内正确循环(你的不返回任何内容。)

Option Explicit
Sub LoopURL()

    Dim ws As Worksheet, urls As Range, url, lastRow As Long, ie
    Set ws = Sheets("Sheet1")
    Set ie = New InternetExplorer
    With ie
        lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
        Set urls = ws.Range("C1:C" & lastRow)

        For Each url In urls.Cells

            Debug.Print "Loading: ", url

            ie.Navigate url
            Do While .Busy Or .readyState <> 4: DoEvents: Loop

            'print your page here...

            'wait for page to print...

        Next url
        .Quit
        Set ie = Nothing
    End With

End Sub

然后您可以添加实际打印所需的代码,您可以在以下几个答案中找到该代码:Print Wesite to PDF using VBA

此外,我不确定您为什么认为有必要禁用事件、屏幕更新和计算...但通常所有这些类型的设置都可以保持原样 - 尤其是在解决问题时。

【讨论】:

  • 感谢您的回复。我查看了您共享的链接,但我没有看到他们曾经打印过页面的位置,看起来响应是更改默认打印机然后将其更改回来,但这对我来说不是问题。另外,我禁用了任何我不需要的事件,因为我的理解是屏幕更新和计算会减慢这个过程。
猜你喜欢
  • 2019-04-21
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 2018-03-15
  • 2015-11-06
相关资源
最近更新 更多