iT邦幫忙

0

VBA使用sendkeys指令預覽列印後畫面跑掉

各位大大晚安
新手又來發問了

我用SendKeys "^p"來預覽列印
但希望關閉預覽時畫面不停留在列印區工作表
而是回到資料區工作表
所以又加了其他指令
但這樣導致預覽看到的內容
不是我真正要列印的範圍

請問有什麼方法可解決呢?
例如讓程序在預覽畫面時先暫停
等跳開預覽時才繼續執行…之類的

附上我輸入的指令

'預覽列印
Sheets("列印區").Visible = True
Sheets("列印區").Select
Range("A1:F20").Select
Application.SendKeys "^p"

'預覽結束時回到資料區
Sheets("列印區").Visible = False
Sheets("資料區").Select

感謝前輩們的觀看與回覆

備註:
因為特殊原因
所以不使用PrintPreview

1 個回答

1
giulian
iT邦新手 5 級 ‧ 2019-07-16 02:04:20
最佳解答

不要用sendkey 叫出列印視窗
改用Temp = Application.Dialogs(xlDialogPrint).Show
temp就是視窗回傳的結果
然後再根據結果看之後要怎麼處理

想要調用其它視窗的話可以參考這邊
https://docs.microsoft.com/en-us/office/vba/api/excel.xlbuiltindialog

看更多先前的回應...收起先前的回應...
eetufoo iT邦新手 5 級 ‧ 2019-07-16 11:07:57 檢舉

謝謝giulian大的回覆

使用temp方式的話,只會跳出是否確定要列印的視窗
而不是預覽列印的畫面耶

這樣不是我要的結果,抱歉了
/images/emoticon/emoticon02.gif

giulian iT邦新手 5 級 ‧ 2019-07-16 19:09:03 檢舉

有試過
xlDialogPrintPreview
這個選項嗎

eetufoo iT邦新手 5 級 ‧ 2019-07-16 19:42:07 檢舉

xlDialogPrintPreview的確會跳出預覽列印的畫面
但是跟用滑鼠選擇[電腦]→[列印]或用鍵盤按ctrl+p
看到的預覽列印是不一樣的畫面

因為有特殊原因 所以不用PrintPreview這種另開視窗的方式預覽

giulian iT邦新手 5 級 ‧ 2019-07-16 20:44:18 檢舉

可以截個圖看一下你想停在那個畫面的列印預覽嗎?

eetufoo iT邦新手 5 級 ‧ 2019-07-16 21:11:21 檢舉

可以唷 沒問題
謝謝您耐心的回覆

順便說一下excel2013之後的預覽列印好像都是這樣
https://ithelp.ithome.com.tw/upload/images/20190716/20118940W2vk9dFw9S.png

giulian iT邦新手 5 級 ‧ 2019-07-17 03:19:29 檢舉

這一塊的話比較麻煩這一塊是backstage,你需要兩個部分才能完成你要的功能
1.自訂一個新的Ribbon UI
2.把原本你想處理的動作綁定在backstage 的onHide事件上

下面是backstage onHide的範例
https://www.dropbox.com/s/nqogmawzyliq7n6/xl-backstage.xlam?dl=0

如果需要開其他功能選單的話你會需要這個
https://github.com/OfficeDev/office-custom-ui-editor

eetufoo iT邦新手 5 級 ‧ 2019-07-17 10:58:56 檢舉

這樣的話好像變得稍微有點複雜耶

所以沒有像我舉例的那樣
先讓程序暫停
直到使用者按任意鍵
才開始下一動

或是直接固定住列印範圍
不會因為點了其他格
預覽列印就跑掉之類的方式

giulian iT邦新手 5 級 ‧ 2019-07-17 16:12:25 檢舉

1.要暫停在你說的那個畫面就是只能改backstage的ui去包
2.如果是要用程式設定列印範圍的話是做得到的,
但你所謂的點了其他格會跑掉有沒有圖片或影片可以輔助說明一下

eetufoo iT邦新手 5 級 ‧ 2019-07-18 11:14:54 檢舉

把相關的畫面截圖給您參考

↓這是資料區
https://ithelp.ithome.com.tw/upload/images/20190718/201189400q7fR5CNWB.jpg

↓這是列印區
https://ithelp.ithome.com.tw/upload/images/20190718/201189404iHhnzjfvU.jpg

目前指令是這樣

'設定列印範圍
Worksheets("列印區").PageSetup.PrintArea = "$A$1:$F$20"

'預覽列印
Application.SendKeys "^p"

'把畫面移回到資料區
Sheets("資料區").Select

但執行預覽列印後的畫面卻是這樣↓
https://ithelp.ithome.com.tw/upload/images/20190718/20118940CxRk77TjuC.jpg

請問是指令的部份下錯了嗎?
還是真的像您說的只能改backstage的ui去包?

giulian iT邦新手 5 級 ‧ 2019-07-19 00:25:53 檢舉

有一個解套方式
新增一個UserForm,裡面做兩個按鈕

按鈕一設定列印範圍並呼叫backstage的列印畫面程式如下

'設定列印範圍
Worksheets("列印區").PageSetup.PrintArea = "$A$1:$F$20"

'預覽列印
Application.CommandBars.ExecuteMso "PrintPreviewAndPrint"

按鈕二 把畫面移回到資料區放這裡,順便關閉視窗

Sheets("資料區").Select
unload me

原本呼叫執行這段的地方改成

UserForm1.show false
eetufoo iT邦新手 5 級 ‧ 2019-07-19 11:21:52 檢舉

若照您提供的方式
是不是使用者點了按鈕一後出現預覽列印的畫面
預覽畫面結束後 使用者要再自己點按鈕二
畫面才會回到資料區呢?

如果是的話 那想問看看有沒有方法
能在預覽畫面結束後(不管有無列印)
就自動跳回資料區

有一點很抱歉前面沒說明清楚
我本來就有一個預覽列印的按鈕是放在資料區
我的想法是當使用者按了按鈕後
程式自動選擇[列印區]的A1:F20
並出現預覽列印的畫面
若離開預覽則"自動"回到[資料區]

另外能否請您提供完整的程式呢?
因為像您上面回覆的最後一段就看不懂
不知道應該放在哪
我太新手了 一直困擾您(汗顏
/images/emoticon/emoticon06.gif

giulian iT邦新手 5 級 ‧ 2019-07-22 01:56:06 檢舉

其實都在上面了
連結是完整檔案,調用的順序改成開啟表單時,直接設定印表區域並開啟backstage,然後會出現自訂表單
表單只剩一個按鈕,按了之後會就直接將工作表移回資料區並關閉表單
你可以試試
https://www.dropbox.com/s/xtbndfuvkesks0m/sample1.xlsm?dl=0

eetufoo iT邦新手 5 級 ‧ 2019-07-22 18:47:36 檢舉

感謝您幫了大忙
雖然跟理想的有點不同
但已是很好的結果了
謝謝giulian大

我要發表回答

立即登入回答