Board logo

標題: [發問] excel vba 如何將其它程式的視窗移到最上層? [打印本頁]

作者: eigen    時間: 2016-10-28 17:54     標題: excel vba 如何將其它程式的視窗移到最上層?

本帖最後由 eigen 於 2016-10-28 17:57 編輯

這是一個列印的程式,會從 月結地址 抓指定的行,到 信封15K ,填入資料,然後從印表機列印。(又臭又長,我將這些省略了)

現在,我希望將這些,輸出成 pdf ,我的pc 有安裝  cutepdf ,列印時,然定cupte pdf  ,就能產生另新檔的畫面,就能產生pdf
[attach]25680[/attach]
  1. Sheets("信封15K").PrintOut Copies:=1, Collate:=True, ActivePrinter:="CutePDF Writer"    '指定cutePDF 列印   
  2. Application.Wait Now() + TimeValue("00:00:03")  'delay 3sec                                                
  3.                                                                                                             
  4. '如何讓 cutepdf 產生的 『另存新檔』的視窗出現在 最上面?                                                   
  5.                                                                                                             
  6. SendKeys "n", False                 'press n 跳到 檔名輸入樓位                                             
  7. SendKeys E.Range("B1") & ".Pdf" & "{ENTER}", False  'key in file name A001.pdf                              
複製代碼
delay 3sec 是因為 cupte pdf 的反應不快

出現另存新檔之後,我再用 SendKeys 這個指令來 輸入  n 及 輸入編號.pdf (a001.pdf b001.pdf之類)

後來實做時,400個地址大約要 27分鐘,在列印的期間,我只要操作電腦,(開啟 chrome/ word / 記事本..)  另存新檔 這個 視窗就會被擠到圖層的下面

這時的 key in 就會變成在 word / 記事本上打字 ,然後就....整個錯亂了

※我想在 key in 之前,能先將上圖的 『另存新檔』移到最上層,請問如何實作?謝謝
  1. Option Explicit
  2. Sub Print__15k()
  3. '******************************************************************
  4. '在Sheets("月結地址")中,用滑鼠選擇要印列的行,執行此程式,即可套表列印
  5. '******************************************************************
  6.     Dim E As Range
  7.       
  8.     Sheets("月結地址").Activate
  9.         For Each E In Selection.EntireRow
  10.         
  11.             If (E.Range("A1") = 1 Or UCase(E.Range("A1").Value) = "F") Then '排除第一行標頭 及 非準備列印的資料,行首需為1或F

  12.                 E.Range("a1") = "Yes"                   '標示 Yes,不同程序標示不一樣
  13.       
  14.         
  15.                 If Sheets("月結地址").AutoPDF.Value = False Then
  16.                     Sheets("信封15K").PrintOut              '印列
  17.                     Sheets("信封15K").Activate
  18.                 Else
  19.                     Sheets("信封15K").PrintOut Copies:=1, Collate:=True, ActivePrinter:="CutePDF Writer"    '指定cutePDF 列印
  20.                     Application.Wait Now() + TimeValue("00:00:03")  'delay 3sec
  21.                     
  22.                     '如何讓 cutepdf 產生的 『另存新檔』的視窗出現在 最上面?
  23.                     
  24.                     SendKeys "n", False                 'press n 跳到 檔名輸入樓位
  25.                     SendKeys E.Range("B1") & ".Pdf" & "{ENTER}", False  'key in file name A001.pdf
  26.                 End If
  27.                
  28.             'Else
  29.             '       MsgBox  "Input error!" & vbCrLf & vbCrLf & "Can't Print Cheque.", vbOKOnly, "Error"
  30.             End If
  31.         End If
  32.         
  33.         Next

  34. End Sub
複製代碼

作者: GBKEE    時間: 2016-10-29 10:01

本帖最後由 GBKEE 於 2016-10-29 10:04 編輯

回復 1# eigen

試試看,用活頁簿的預設事件 BeforePrint 事件 在活頁簿 (或者其中某些內容) 列印前發生此事件。

ThisWorkbook 模組程式碼
  1. Option Explicit
  2. Private Sub Workbook_BeforePrint(Cancel As Boolean)
  3.     If Sheet1.Msg Then
  4.         SendKeys "n", False                 'press n 跳到 檔名輸入樓位
  5.         SendKeys Sheet1.Rng.Range("B1") & ".Pdf" & "{ENTER}", False   'key in file name A001.pdf
  6.     End If
  7. End Sub
複製代碼
Sub Print__15k() 所在的模組程式碼
  1. '**'**Sub Print__15k() 如在模組 Sheet1
  2. Option Explicit
  3. Public Rng As Range, Msg As Boolean   '設為 專案可用的共用變數
  4. Sub Print__15k()
  5. '******************************************************************
  6. '在Sheets("月結地址")中,用滑鼠選擇要印列的行,執行此程式,即可套表列印
  7. '******************************************************************
  8.     Dim E As Range
  9.     Sheets("月結地址").Activate
  10.     For Each E In Selection.EntireRow
  11.         Msg = False
  12.         If (E.Range("A1") = 1 Or UCase(E.Range("A1").Value) = "F") Then '排除第一行標頭 及 非準備列印的資料,行首需為1或F
  13.             E.Range("a1") = "Yes"                   '標示 Yes,不同程序標示不一樣
  14.                        If Sheets("月結地址").AutoPDF.Value = False Then
  15.                 Sheets("信封15K").PrintOut              '印列
  16.                 Sheets("信封15K").Activate
  17.             Else
  18.                 Set Rng = E
  19.                 Msg =True
  20.                 Sheets("信封15K").PrintOut Copies:=1, Collate:=True, ActivePrinter:="CutePDF Writer"    '指定cutePDF 列印
  21.             End If
  22.         End If
  23.     Next
  24. End Sub
複製代碼

作者: eigen    時間: 2016-10-29 14:57

回復 2# GBKEE

謝謝~~
  1. 'Option Explicit
  2. Private Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
  3. Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long
複製代碼
先宣告這兩個

改寫程式如下,下達列印指令之後,在for 迴圈等8次(時間可以自己調), 找到『另存新檔』的視窗出現後立刻跳出for,

將 『另存新檔』 BringWindowToTop 移到最上層,輸入檔名

離開之後再等一秒(我發現cutepdf 的速度比 excel 慢,輸入完檔名,cutepdf 還沒完成工作,excel 已經抓完下一組的資料,在找『另存新檔』,導致順序錯亂)

※ 缺點:程式運作期間,不能操作電腦,不然一不小時就會影響譬另存新檔的輸入。

※我用過許多免費的 pdf ,目前就cutepdf 的輸出畫面最正常,窮則變,變則通~~

以上是 excel 2003 利用 vba 輸出一堆 pdf 的方法
  1. If Sheets("月結地址").AutoPDF.Value = False Then
  2.         Sheets("信封15K").PrintOut                      '印列
  3.         Sheets("信封15K").Activate
  4. Else
  5.         Sheets("信封15K").PrintOut Copies:=1, Collate:=True, ActivePrinter:="CutePDF Writer"
  6.         Application.Wait Now() + TimeValue("00:00:01")  'delay 1sec
  7.         Dim THandle As Long
  8.         Dim i  As Integer
  9.         For i = 1 To 8
  10.                 Application.Wait Now() + TimeValue("00:00:01")  'delay 1sec
  11.                 THandle = FindWindow(vbEmpty, "另存新檔")
  12.                 If THandle <> 0 Then
  13.                         i = 20
  14.                 End If
  15.         Next

  16.         If i = 20 + 1 Then
  17.                 BringWindowToTop THandle
  18.                 SendKeys "n", False                             'press n
  19.                 BringWindowToTop THandle
  20.                 SendKeys E.Range("B1") & "_" & E.Range("M1") & "_" & E.Range("C1") & ".Pdf" & "{ENTER}", False  'key in file name
  21.         End If
  22.         Application.Wait Now() + TimeValue("00:00:01")  'delay 1sec
  23. End If
複製代碼

作者: stillfish00    時間: 2016-11-2 09:46

回復 1# eigen
建議試試看直接用 PrintOut 方法的參數(PrintToFile、PrToFileName)來指定輸出檔名




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)