如何關閉 Office 應用程式與 Visual Basic 所顯示的對話方塊

文章翻譯 文章翻譯
文章編號: 259971 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

結論

您會自動化 Office 應用程式從 Visual Basic (VB) 時, Office 應用程式可能會顯示一個對話方塊。[] 對話方塊中,會造成 Visual Basic 應用程式似乎停止回應 (或擱置),因為 VB 等待 [] 對話方塊會關閉。Visual Basic 應用程式繼續執行之前,必須關閉對話方塊。

本文將告訴您如何使用 Office 應用程式的物件模型來避免對話方塊在自動化。它也提供逐步的範例,說明如何模擬使用者輸入,以程式設計的方式解除無法避免使用平常的屬性和方法公開物件模型中的對話方塊。

其他相關資訊

有些時候您可能想將自動化 Office 應用程式,但是不會需要 Office 應用程式與任何使用者互動。在這種情況下如果 Office 應用程式會顯示一個對話方塊,您的應用程式會似乎停止回應,直到使用者可以關閉對話方塊。不過,有可能不是使用者,坐在電腦可以關閉該對話方塊的前面。

Office 應用程式不被設計為自動執行。 因此,Office 會自動執行的應用程式可能有時候會碰到 Office 應用程式所顯示的對話方塊。從一般測試的應用程式,您通常可以判斷哪一個對話方塊方塊就會發生和撰寫程式碼時,能夠避免這些特定的對話方塊。

下列一些建議策略避免對話方塊時自動執行的 Office 應用程式:
  • 判斷屬性或您正在使用 (造成這項 [] 對話方塊中那一個) 的方法具有您可以傳遞給它的選擇性引數。 有時候,藉由將所有的引數傳遞至屬性或方法,您可以避免一個對話方塊。比方說如果您使用 Open 方法來開啟該活頁簿和 Excel 活頁簿是密碼保護,Excel 會顯示對話方塊,詢問使用者輸入密碼,如果您不提供密碼引數呼叫 Open 方法時對應表。若要避免對話方塊,提供的 密碼 引數的 [值] 時呼叫 Open 方法。同樣地,使用 Close 方法關閉文件時, 它通常有助於指定 SaveChanges 引數,以避免對話方塊,詢問使用者儲存變更。如需有關如何判斷何種引數可以使用屬性或您所呼叫的方法的詳細資訊,按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
    222101如何尋找和使用 Office 物件模型文件
  • 研究物件模型,Office 應用程式來查看是否可能會有屬性避免某些對話方塊。比方說 Excel 應用程式 物件有 AskToUpdateLinksAlertBeforeOverwriting 屬性。
  • 設定 Application.DisplayAlerts 屬性 (Excel 專案,Word),或是使用 Application.DoCmd.SetWarnings False (只存取) 以關閉警示訊息顯示。使用此設定可避免大部分,但並非所有的對話方塊。
  • Application.FeatureInstall 屬性 (Office 2000 和更新版本) 設定為處理越好 」 這項功能不安裝...」 對話方塊] 方塊,當存取可能不會在使用者系統安裝的元件。
  • 當使用者的系統上不安裝任何印表機驅動程式時,設定 Application.ActivePrinter 嘗試使用 On Error 陳述式,若要避免可能發生這類的時機的執行階段錯誤訊息。
  • 測試您的應用程式徹底以協助預測對話方塊可能會發生。比方說假設呼叫 SaveAs 方法,Office 應用程式可將儲存到檔案。如果該檔案已存在,可能會出現一個對話方塊,詢問您確認?取代現有的檔案。如果您修改程式碼以呼叫 SaveAs 方法之前先檢查該檔案時,您可以避免出現在對話方塊的可能性。比方說如果檔案已經存在刪除它使用 Kill 陳述式呼叫 SaveAs 方法之前。
附註就算您使用這些技巧,然後請仔細設計應用程式避免對話方塊您可能仍然會面對一個對話方塊不能避免與方法和 Office 應用程式的物件模型中公開屬性的情況。在這種情況下可能需要以程式設計方式藉由模擬使用者輸入關閉對話方塊。 下列示範說明如何可以達到此目的使用 Visual Basic 自動化用戶端。

範例

這一節中的步驟將告訴您,自動化的 Microsoft Word 列印文件。自動化用戶端呼叫 PrintOut 方法為 Word 文件 物件。如果使用者的預設印表機設定為列印到檔案的連接埠,然後 PrintOut 的呼叫就會產生對話方塊,提示使用者輸入的檔案名稱。若要決定如果 PrintOut 方法會導致出現此對話方塊,Visual Basic 自動化用戶端會使用 Timer 控制項來偵測呼叫 PrintOut 方法後的閒置 (Idle) 時間。之前要呼叫 PrintOutTimer 是啟用,而且設定成在五秒後引發。當 PrintOut 完成時,已停用 計時器。因此,如果五秒內完成 PrintOut 方法,在 Timer 事件從未發生,而且不會執行任何進一步的動作。列印文件,並執行程式碼繼續超出 PrintOut 方法。不過,如果 計時器 事件發生在五個的第二個間隔內,它假設 PrintOut 方法尚未完成而且延遲因等待使用者輸入的對話方塊。當 計時器 事件發生時,自動化用戶端提供焦點到 Word,並使用 SendKeys 巨集 關閉對話方塊。

附註供示範之用這個範例會使用 PrintOut 方法,一種它顯示一個對話方塊刻意時就會列印到印表機一到 FILE 連接埠。請注意 PrintOut 方法有兩個引 OutputfileNamePrintToFile,您可以提供避免此對話方塊的。

此外,使用 [此計時器"方法時您可以自訂等待時間必須大於或小於五秒鐘,以及來自訂您傳送給 [] 對話方塊的按鍵動作。

這個展示中是由兩個 Visual Basic 專案所組成:
  1. 提供用來偵測一段延遲的 Timer 類別的 ActiveX 執行檔。ActiveX 執行檔所使用的 Timer 類別是在執行 [計時器,其理由的程式碼在不同的處理序和因此,不同的執行緒。這可讓 Timer 類別若要暫停的自動化呼叫期間引發事件。
  2. 標準執行檔使用自動化 Word,並呼叫 PrintOut 方法來列印文件。它會使用 ActiveX 執行檔呼叫 PrintOut 方法時,偵測一段延遲。
建立 ActiveX EXE 專案
  1. 啟動 Visual Basic,並建立一個 ActiveX 執行檔的專案。 預設會建立類別 1。
  2. 在 [專案] 功能表上按一下以選取 [內容],然後再變更 [MyTimer 到的 [專案名稱]。
  3. 複製,並將下列程式碼貼到 [類別 1] 模組:
    Option Explicit
    
    Public Event Timer()
    Private oForm1 As Form1
    
    Private Sub Class_Initialize()
        Set oForm1 = New Form1
        oForm1.Timer1.Enabled = False
    End Sub
    
    Private Sub Class_Terminate()
        Me.Enabled = False
        Unload oForm1
        Set oForm1 = Nothing
    End Sub
    
    Public Property Get Enabled() As Boolean
        Enabled = oForm1.Timer1.Enabled
    End Property
    
    Public Property Let Enabled(ByVal vNewValue As Boolean)
        oForm1.Timer1.Enabled = vNewValue
        If vNewValue = True Then
            Set oForm1.oClass1 = Me
        Else
            Set oForm1.oClass1 = Nothing
        End If
    End Property
    
    Public Property Get Interval() As Integer
        Interval = oForm1.Timer1.Interval
    End Property
    
    Public Property Let Interval(ByVal vNewValue As Integer)
        oForm1.Timer1.Interval = vNewValue
    End Property
    
    Friend Sub TimerEvent()
        RaiseEvent Timer
    End Sub
    					
  4. 在 [專案] 功能表上, 選擇 [加入表單 將新的表單加入至專案]。
  5. Timer 控制項加入至表單。
  6. 複製並貼入程式碼模組中的下列程式碼,為 Form1:
    Option Explicit
    
    Public oClass1 As Class1
    
    Private Sub Timer1_Timer()
        oClass1.TimerEvent
    End Sub
    					
  7. 儲存這個專案在名為 伺服器 的新子資料夾中。
  8. 在 [檔案] 功能表中上, 選擇 [製成 MyTimer.Exe 若要建置並登錄元件]。
建立自動化用戶端
  1. 建立新的標準 EXE 專案在 Visual Basic 中時。預設會建立 Form1。
  2. 命令按鈕 控制項加入至表單。
  3. 在 [專案] 功能表上, 選取 [參考]。將參考加入 Microsoft Word 8.0 (或 9.0 或 10.0) 物件程式庫,並 MyTimer
  4. 複製並貼上下列程式碼,以表單模組:
    Option Explicit
    
    Private oWord As Word.Application
    Private strWordCaption As String
    Private WithEvents oMyTimer As MyTimer.Class1
    
    Private Sub Form_Load()
        'Create MyTimer object, and then disable it by default:
        Set oMyTimer = New MyTimer.Class1
        oMyTimer.Enabled = False
    End Sub
    
    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        'Terminate MyTimer object when the form is closed:
        oMyTimer.Enabled = False
        Set oMyTimer = Nothing
    End Sub
    
    Private Sub Command1_Click()
        On Error GoTo ErrorHandler
        
        'Create a new Word instance and put text in the new document:
        Set oWord = CreateObject("Word.Application")
        oWord.Visible = True
        oWord.Documents.Add
        oWord.Selection.TypeText "Hello World!"
        
        'Prepare Timer to "watch out" for a delay in calling PrintOut:
        strWordCaption = GetWordCaption 'for use with AppActivate
        oMyTimer.Interval = 5000 'allow 5 second wait time
        oMyTimer.Enabled = True
            
        'Call the PrintOut method, which may prompt the user to select
        'an output file name if the default printer is set to FILE:
        oWord.PrintOut Background:=False
    
    Done:
        On Error Resume Next
        'Turn off Timer:
        oMyTimer.Enabled = False
        
        'Close document and quit the Word instance:
        oWord.ActiveDocument.Close SaveChanges:=False
        oWord.Quit
        Set oWord = Nothing
        Exit Sub
    ErrorHandler:
        Resume Done
    End Sub
    
    Private Sub oMyTimer_Timer()
    'If this event occurs, there was a delay in calling PrintOut.
    'You can assume that the delay is caused by a dialog box prompting
    'for an output file name because the user has the printer
    'configured to print to FILE. SendKeys is used to provide the
    'output file name and dismiss the dialog box.
        Dim strKeys As String
        
        On Error Resume Next
        
        'Make sure that Word has the focus before using SendKeys to it:
    
        AppActivate strWordCaption 'Set focus to Word.
        
        'Send keystrokes to enter the output file name:
        If Right$(App.Path, 1) = "\" Then
            strKeys = App.Path & "MyOutput.prn"
        Else
            strKeys = App.Path & "\MyOutput.prn"
        End If
        Kill strKeys 'make sure file does not already exist
        strKeys = strKeys & "~" '~ represents the OK button to dismiss dialog
        SendKeys strKeys, True
           
        'Disable MyTimer:
        oMyTimer.Enabled = False
    End Sub
    
    Private Function GetWordCaption() As String
    'Returns the Word Caption. For use with the AppActivate statement
        Dim s As String
        On Error Resume Next
        If Left$(oWord.Version, 1) = "8" Then
            'Word 97 logic:
            s = oWord.Caption
        Else
            'Word 2000 or 2002 logic:
            Err.Clear
            s = oWord.ActiveWindow.Caption
            If Err.Number = 0 Then 'no error
                s = s & " - " & oWord.Caption
            Else
                s = oWord.Caption
            End If
        End If
        GetWordCaption = s
    End Function
    					
  5. 儲存這個專案在名為 用戶端 的新子資料夾中。
  6. 按下 F5 鍵以執行專案。Form1 會出現。
  7. 按一下 [在表單上的 [Command1]。這可自動化 Word、 新增一些文字的新文件,然後它傳送到印表機使用 PrintOut 方法。如果您的印表機設定為列印到印表機,您看不到一個對話方塊。
  8. [Windows] 控制台] 中變更預設印表機,讓它被設定為列印到檔案的連接埠。
  9. 按一下 [Command1 再次,並注意在 Word 中會出現一個對話方塊。執行不關閉對話方塊 ; 等候五秒鐘,然後對話方塊以程式設計方式關閉 計時器 事件發生時。用戶端子資料夾中建立名為 MyOutput.prn 的輸出檔案。
Microsoft 僅,為了說明提供程式設計範例,不提供任何明示或默示的保證,包括但不是限於適售性以及適合某特定用途之默示擔保責任。本文假設您已熟悉我們所示範的程式設計語言,以及用來建立和偵錯程序的工具。Microsoft 技術支援工程師可以協助解釋特定程序的功能,但它們不會修改這些範例以提供附加功能或建構程序,以符合您的特定需求。
如果您有限制程式設計經驗,您可以連絡 Microsoft 認證合作夥伴或 Microsoft 諮詢服務。如需詳細資訊請造訪下列 Microsoft] 網站:

Microsoft 認證合作夥伴-https://partner.microsoft.com/global/30000104

Microsoft 摘要報告服務-http://support.microsoft.com/gp/advisoryservice

如需有關可用的支援選項,以及有關如何連絡 Microsoft 的詳細資訊,請造訪下列 Microsoft 網站: http://support.microsoft.com/default.aspx?scid=fh;EN-US;CNTACTMS

?考

如需詳細資訊按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中發行項]:
257757Office 伺服器端自動化的資訊: 考量事項
226118OFF2000: 應用程式的 Visual Basic 程式設計資源
253235FILE: Offautmn.exe 討論 Office 97 與 2000年自動化,並提供範例程式碼
取得更多資訊有關 Office 自動化請瀏覽 Office 程式開發中的 [在下列 Microsoft 網站] 支援中心:
http://support.microsoft.com/ofd

屬性

文章編號: 259971 - 上次校閱: 2007年1月17日 - 版次: 6.7
這篇文章中的資訊適用於:
  • Microsoft Office Access 2003
  • Microsoft Access 2002 Standard Edition
  • Microsoft Access 2000 Standard Edition
  • Microsoft Access 97 Standard Edition
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Office PowerPoint 2003
  • Microsoft PowerPoint 2002 Standard Edition
  • Microsoft PowerPoint 2000 Standard Edition
  • Microsoft PowerPoint 97 Standard Edition
  • Microsoft Office Word 2003
  • Microsoft Word 2002 Standard Edition
  • Microsoft Word 2000 Standard Edition
  • Microsoft Word 97 Standard Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
關鍵字:?
kbmt kbautomation kbhowto kbprogramming KB259971 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:259971
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com