Board logo

標題: [發問] 程式F8可以F5就當機,以及關閉WORD.EXE [打印本頁]

作者: iceandy6150    時間: 2020-3-31 23:11     標題: 程式F8可以F5就當機,以及關閉WORD.EXE

本帖最後由 iceandy6150 於 2020-3-31 23:13 編輯

大家好,我寫了一個按鈕,按下去之後,主要功能是開啟一個WORD檔
然後進行合併列印,並合併列印到新檔案
等使用者列印後,關掉新檔案跟原檔案
(這邊本來想要寫成,新檔案會自動列印,然後關掉所有WORD檔)
(但是怕使用者的印表機可能不盡相同,因此作罷)

前面會先檢查是否已經開啟WORD檔
有開就詢問是否關掉WORD,或者不存檔強制關閉

問題在,每一次使用者列印後,關掉WORD新檔案跟原檔案後
其實【工作管理員】裡面,WORD.EXE這個程序還是存在

然後【先檢查是否已經開啟WORD檔】這邊,如果F8逐步執行,是沒問題的
如果直接按下按鈕執行,就會卡住(F5直接執行就會卡住)
解決辦法是去【工作管理員】裡面,把WORD.EXE這個程序關掉,才能正常跑
  1. Private Sub CommandButton2_Click()
  2. '====偵測是否有開啟中的WORD檔,並選則是否存檔關閉====

  3. Dim WordApp As Object, Doc As Object
  4. Dim box
  5. On Error GoTo Skip  '設置出錯跳轉位置
  6. Set WordApp = GetObject(, "word.application")  '獲取第一個word進程
  7. Do While Not WordApp Is Nothing  '如果成功獲取進程,則進入迴圈操作
  8.     With WordApp
  9.         If .Documents.Count > 0 Then  '如果進程中有打開的文檔

  10.             MsgBox ("偵測到有尚未關閉的WORD檔案")
  11.             box = MsgBox("您要離開本程式,先將WORD檔案關閉?" + Chr(13) + "【是】離開本程式" + Chr(13) + "【否】不存檔直接關閉WORD", 4, "重要訊息")

  12.             If box = 6 Then
  13.                Exit Sub

  14.             Else

  15.             For Each Doc In .Documents  '迴圈各個打開的文檔
  16.                 Doc.Close False  '關閉文檔並不保存(注:想保存的話,將後面的參數改為True)
  17.             Next Doc

  18.             End If

  19.         End If
  20.         .Quit  '關閉當前的word進程 <<<<<<這邊如果F8執行,是可以成功關閉工作管理員中的WORD.EXE的
  21.     End With
  22.     Set WordApp = GetObject(, "word.application")  '獲取下一個word進程
  23. Loop
  24. Skip:
  25.     Set Doc = Nothing  '結束或出錯跳轉至此,清空變數專案
  26.     Set WordApp = Nothing
  27. '================================

  28. Dim wdObj As Object
  29. Dim strXls As String,  strSQL As String
  30. Dim a, b


  31. a = ThisWorkbook.Path  '此EXCEL檔案存放位置
  32. b = ThisWorkbook.Name  'b為檔名
  33. strXls = a & "\" & b   '此EXCEL檔案完整路徑及檔名


  34. Set wdObj = CreateObject("Word.Application") '會先把所有WORD都關掉,所以用Creat 不用Get
  35. Set wdObj = New Word.Application '啟動Word
  36. wdObj.Visible = True
  37. wdObj.Documents.Open (a & "\列印.docx")


  38. With wdObj   '使用With後就正常了

  39.      '這邊以下是用WORD錄製巨集得到的合併列印寫法
  40.     .ActiveDocument.MailMerge.OpenDataSource Name:= _
  41.         strXls, ConfirmConversions:=False, _
  42.         ReadOnly:=False, LinkToSource:=True, AddToRecentFiles:=False, _
  43.         PasswordDocument:="", PasswordTemplate:="", WritePasswordDocument:="", _
  44.         WritePasswordTemplate:="", Revert:=False, Format:=wdOpenFormatAuto, _
  45.         Connection:= _
  46.         "Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=strXls;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Engine Type=37;Jet OLEDB:Database Locki" _
  47.         , SQLStatement:="SELECT * FROM `工作表1", SQLStatement1:="", SubType:= _
  48.         wdMergeSubTypeAccess
  49.         
  50.     .ActiveDocument.MailMerge.Fields.Add Range:=.ActiveDocument.Tables(1).Cell(2, 1).Range, Name:="號碼"
  51.    
  52.     .CommandBars("Mail Merge Panes").Visible = False
  53.    
  54.     With .ActiveDocument.MailMerge
  55.         .Destination = wdSendToNewDocument
  56.         .SuppressBlankLines = True
  57.         With .DataSource
  58.             .FirstRecord = wdDefaultFirstRecord
  59.             .LastRecord = wdDefaultLastRecord
  60.         End With
  61.         .Execute Pause:=False
  62.     End With
  63.    
  64. End With

  65. Set wdObj = Nothing

  66. MsgBox ("列印後,關閉WORD檔案時,記得通通【不要儲存】")
  67. MsgBox ("最後不印了,記得執行【清除背景WORD程式】")

  68. End Sub
複製代碼
求救各位,謝謝
[attach]31843[/attach]




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