VBA Sendkeys循环用于打印选项

时间:2013-11-20 17:26:34

标签: vba loops windows-7 excel-2010 sendkeys

更新:@Blackhawk向我提供了回答问题所需的信息 - 滚动到底部以获得有效的解决方案。

我们的系统上安装了一些烦人的新打印软件,要求我在Excel工作簿中选择每个工作表,并单独设置打印选项(即横向,页面大小,整理首选项,颜色等)。支持似乎认为这是完全可以接受的,并没有多大用处。我找到了两种解决方法,一种是将选定的纸张保存为.pdf然后打印(只需要选择一次打印选项),另一种是使用sendkeys。从阅读中我可以看到sendkeys不是一个好选择,所以如果我必须去.pdf路线我会,但这肯定不理想,因为我的最终用户更喜欢.xls文件,因为这意味着他们可以过滤数据等因为其中,我写了一些VBA,目前允许我快速设置excel中一个工作表的打印选项。

Sub A00_Sendkeystest()
'

Application.Wait (Now() + TimeValue("00:00:01"))

Application.SendKeys ("%p"), True 'Selects Page Layout
Application.SendKeys ("%i"), True 'Selects Print Titles
Application.SendKeys ("%o"), True 'Selects Options
Application.SendKeys ("%f"), True 'Selects profile
Application.SendKeys ("l"), True  'Selects 'Landscape' default (this needs to be set up initially)
Application.SendKeys "{TAB 14}", True 'Tabs to OK
Application.SendKeys "~", True 'Hits enter to close screen
Application.SendKeys "{TAB 11}", True 'Tabs to OK
Application.SendKeys "~", True 'Hits enter to close screen

End Sub

当分配给快捷方式时,它运行得非常好,因此我可以在工作簿中的一个工作表上快速运行它,并且它可以根据需要运行。但是,我真正想做的是编写vba来遍历我选择进行打印的工作表,并针对每个工作表运行sendkeys代码。我尝试了以下内容:

Sub cycle()

    Dim ws As Worksheet
    For Each ws In ActiveWindow.SelectedSheets

    ws.Activate

    'Application.Wait (Now() + TimeValue("00:00:10"))

    Application.SendKeys ("%p") ', True 'Selects Page Layout
    Application.SendKeys ("%i") ', True 'Selects Print Titles
    Application.SendKeys ("%o") ', True 'Selects Options
    Application.SendKeys ("%f") ', True 'Selects profile
    Application.SendKeys ("l") ', True  'Selects 'Landscape' default (this needs to be set up initially)
    Application.SendKeys "{TAB 14}" ', True 'Tabs to OK
    Application.SendKeys "~" ', True 'Hits enter to close screen
    Application.SendKeys "{TAB 11}" ', True 'Tabs to OK
    Application.SendKeys "~" ', True 'Hits enter to close screen

    Application.Wait (Now() + TimeValue("00:00:03"))

    Next

End Sub

然而,当观看宏运行时,它循环遍历每个页面,然后就像宏结束时,它似乎尝试执行sendkeys部分4次(当然不起作用)。我尝试过延迟构建,但它实际上就像application.sendkeys代码的一部分只在宏结束之前执行。我正在使用Office 2010与Windows 7,但任何有关如何使其工作(或任何其他想法!)的建议将非常感激。

由于

最终代码:

Sub cycle()

'Macro will cycle through selected sheets and select landscape_printing profile in print options.

    Application.ScreenUpdating = False

    Dim ws As Worksheet
    For Each ws In ActiveWindow.SelectedSheets

    ws.Activate

    Application.SendKeys ("%p"), True 'Selects Page Layout
    Application.SendKeys ("%i"), True 'Selects Print Titles
    Application.SendKeys ("%o"), True 'Selects Options
    Application.SendKeys ("%f"), True 'Selects profile
    Application.SendKeys ("l"), True  'Selects 'Landscape' default (this needs to be set up initially)
    Application.SendKeys "{TAB 14}", True 'Tabs to OK
    Application.Wait (Now() + TimeValue("00:00:01"))
    Application.SendKeys "~", True 'Hits enter to close screen
    Application.Wait (Now() + TimeValue("00:00:01"))
    Application.SendKeys "~", True 'Hits enter to close screen

    DoEvents

    Next

    Application.ScreenUpdating = True

    MsgBox "Completed."

End Sub

1 个答案:

答案 0 :(得分:1)

尝试在DoEvents之前抛出Application.Wait。我怀疑Excel需要片刻来处理这些按键作为OS事件。

每个Windows应用程序都有一个消息队列,Windows会向其发送相应的事件消息,以通知用户单击或按键等操作。我的猜测是Excel不断运行你的代码(甚至等待)并且没有机会处理按键,因此Windows发送给Excel的消息只是排队。当它完成运行宏时,它将转向处理所有排队的消息并处理它们。

添加DoEvents告诉Excel处理当前在其队列中的任何消息(或其中的某些部分,在该点上不太确定),这意味着运行按键并打印表。