2013-11-20 66 views
0

更新:@Blackhawk與資料片,我需要回答的問題提供了我 - 滾動到底部的工作方案。VBA的SendKeys環路打印選項

我們在我們的系統上安裝了一些煩人的新打印軟件,這需要我在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代碼的一部分只是在宏結束之前執行。我正在使用Windows 7的Office 2010,但是如何讓這個工作(或任何其他想法!)的任何建議將不勝感激。

感謝

最終代碼:

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

此外,前兩個sendkeys行可以被這一行替換'Application.CommandBars.ExecuteMso(「PrintTitles」)' –

+0

@SiddharthRout感謝您的這一點,我可以看到它的作品,但由於某種原因,當使用這個休息我的宏沒有按照我想要的方式運行,所以我現在就把它離開了。 – bawpie

回答

1

嘗試在那裏拋出DoEvents,在Application.Wait之前。我懷疑Excel需要一些時間來將這些按鍵處理爲OS事件。

每個窗口的應用程序有一個消息隊列中,向其中Windows發送相應的事件消息發送到通知它的東西,如用戶點擊或按下的鍵。我的猜測是Excel不斷運行你的代碼(甚至是Wait),並且沒有機會處理按鍵,所以Windows發送給Excel的消息只是排隊等待。當它完成運行宏時,它轉而處理所有排隊的消息並處理它們。

添加一個DoEvents告訴Excel處理當前在其隊列中的任何消息(或其中的一部分,在該點上不太確定),這意味着運行您的按鍵並打印表單。

+0

謝謝,這個伎倆。謝謝你的回答和解釋。我已經發布了我修改過的VBA,因爲我不得不做一些調整,因爲doevents添加了它並沒有關閉選項/打印標題屏幕。我嘗試使用application.commandbars行,但它是拋出宏,所以我堅持前兩個sendkeys。乾杯! – bawpie