更新:@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
答案 0 :(得分:1)
尝试在DoEvents
之前抛出Application.Wait
。我怀疑Excel需要片刻来处理这些按键作为OS事件。
每个Windows应用程序都有一个消息队列,Windows会向其发送相应的事件消息,以通知用户单击或按键等操作。我的猜测是Excel不断运行你的代码(甚至等待)并且没有机会处理按键,因此Windows发送给Excel的消息只是排队。当它完成运行宏时,它将转向处理所有排队的消息并处理它们。
添加DoEvents告诉Excel处理当前在其队列中的任何消息(或其中的某些部分,在该点上不太确定),这意味着运行按键并打印表。