Excel VBA以PDF格式打印或另存为网页

时间:2018-07-10 19:27:31

标签: excel vba excel-vba

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

我所缺少的是在继续下一个URL之前将页面打印为PDF或SaveAs 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吗?我不确定这段代码中我缺少什么或做错了什么。我什至还没有尝试指定保存位置或保存名称,因为我第一次尝试以任何方式打印它。

非常感谢!

1 个答案:

答案 0 :(得分:0)

您的代码有几个不同的问题。您应该做的第一件事是让它正确遍历整个单元格范围(您什么也不会返回。)

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

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