HOWTO:使用 Visual Basic 关闭 Office 应用程序显示的对话框

文章翻译 文章翻译
文章编号: 259971 - 查看本文应用于的产品
展开全部 | 关闭全部

概要

当您从 Visual Basic (VB) 中自动运行一个 Office 应用程序时,该 Office 应用程序可能会显示一个对话框。该对话框使 Visual Basic 应用程序似乎停止响应(或挂起),因为 VB 在等待该对话框关闭。必须关闭该对话框,然后 Visual Basic 应用程序才能继续运行。

本文讨论如何使用 Office 应用程序的对象模型来避免在自动运行期间出现对话框。本文还提供了一个分步示例,介绍如何模拟用户输入以编程方式关闭那些无法通过使用对象模型中公开的常用属性和方法加以避免的对话框。

更多信息

有时,您可能需要使 Office 应用程序自动运行,而不需要用户与 Office 应用程序之间进行任何交互操作。在这种情况下,如果 Office 应用程序显示一个对话框,应用程序似乎停止响应,直到用户关闭对话框才恢复正常。但是,计算机前面可能并没有可以关闭该对话框的用户。

Office 应用程序不能在无人参与的情况下执行。因此,使 Office 自动运行的应用程序有时会遇到 Office 应用程序所显示的对话框。通过对应用程序进行正常测试,您通常可以确定会显示哪些对话框,然后可以编写代码来避免显示这些特定的对话框。

下面是一些推荐策略,用于在使 Office 应用程序自动运行期间避免显示对话框:
  • 确定您正在使用的属性或方法(导致显示对话框的属性或方法)是否有可以传递给它的可选参数。有时,如果将所有参数传递给属性或方法,就可以避免对话框出现。例如,当您使用 Open 方法打开 Excel 工作簿而该工作簿受到密码保护时,如果您在调用 Open 方法时没有提供密码参数,Excel 将显示一个对话框以要求用户输入密码。要避免显示该对话框,请在调用 Open 方法时为 Password 参数提供一个值。同样,当使用 Close 方法关闭文档时,指定 SaveChanges 参数通常可以有助于避免显示对话框并询问用户是否保存更改。 有关确定所调用的属性或方法有哪些可用参数的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    222101 HOWTO:Find and Use Office Object Model Documentation
  • 请研究 Office 应用程序的对象模型,查看是否有可以避免显示某些对话框的属性。例如,Excel Application 对象有 AskToUpdateLinksAlertBeforeOverwriting 两种属性。
  • 设置 Application.DisplayAlerts 属性(对于 Excel、Project 或 Word)或使用 Application.DoCmd.SetWarnings False(仅限于 Access)可以禁止显示警报消息。使用此设置可避免显示大多数(但非全部)对话框。
  • 设置 Application.FeatureInstall 属性(对于 Office 2000 及更高版本)来处理在访问用户系统中没有安装的组件时可能显示的“This feature is not installed...”(未安装此功能...)对话框。
  • 使用 On Error 语句来避免可能出现的运行时错误信息,例如,当您在用户系统中没有安装打印机驱动程序的情况下尝试设置 Application.ActivePrinter 时。
  • 对应用程序进行全面测试,以帮助推测何时会出现对话框。例如,假设您调用 Office 应用程序的 SaveAs 方法来将数据保存到文件。如果该文件已经存在,则会出现一个对话框,要求确认是否替换现有的文件。如果您修改代码,以便在调用 SaveAs 方法之前检查是否有这样一个文件,则可以避免显示该对话框。例如,如果该文件已经存在,请在调用 SaveAs 方法之前使用 Kill 语句删除该文件。
注意:即使您使用了这些技巧并仔细设计应用程序以避免出现对话框,您仍然可能遇到这样的情况,即无法通过 Office 应用程序对象模型中公开的方法和属性来避免显示某个对话框。在这种情况下,可能需要通过模拟用户输入以编程方式关闭对话框。下面的演示阐述了如何使用 Visual Basic 自动化客户端来达到此目的。

示例

本部分中的步骤演示了 Microsoft Word 自动化如何打印文档。自动化客户端调用 Word Document 对象的 PrintOut 方法。如果将用户的默认打印机配置为打印到 FILE 端口,则调用 PrintOut 时会产生一个对话框,提示用户输入文件名。为确定 PrintOut 方法是否会导致该对话框显示,Visual Basic 自动化客户端使用 Timer 控件来检测调用 PrintOut 方法之后的空闲时间。在调用 PrintOut 之前,会启用 Timer 并将其设置为在五秒钟后激发。当 PrintOut 完成后,将禁用 Timer。因此,如果 PrintOut 方法在五秒钟内完成,Timer 事件就绝不会发生,并且不会采取进一步的操作。PrintOut 方法完成后,文档将被打印,并且代码将继续执行。但是,如果 Timer 事件在五秒钟时间间隔内发生,则假设 PrintOut 方法尚未完成,并且该延迟是由等待用户输入的对话框引起的。当 Timer 事件发生后,自动化客户端会将焦点切换到 Word 并使用 SendKeys 关闭该对话框。

注意:为了便于演示,此示例采用以下方式来使用 PrintOut 方法:当向设置到 FILE 端口的打印机进行打印时,有意显示一个对话框。请注意,PrintOut 方法有两个参数:OutputfileNamePrintToFile;您可以提供这两个参数来避免出现此对话框。

此外,当您使用此“timer”方法时,您可以自定义等待时间以使其大于或小于五秒钟,同时还可以自定义发送给该对话框的击键次数。

此演示由两个 Visual Basic 项目构成:
  1. 一个项目是 ActiveX EXE,它提供用于检测延迟的 Timer 类。为 Timer 类使用 ActiveX EXE 的原因是为了在单独的进程中运行 Timer 代码,从而生成一个单独的线程。这使 Timer 类可以在挂起的自动化调用期间触发事件。

    另一个项目是标准 EXE,它使用 Word 自动化并调用 PrintOut 方法来打印文档。它使用 ActiveX EXE 来检测调用 PrintOut 方法时的延迟。
  2. 另一个项目是标准 EXE,它使用 Word 自动化并调用 PrintOut 方法来打印文档。它使用 ActiveX EXE 来检测调用 PrintOut 方法时的延迟。
创建 ActiveX EXE 项目
  1. 启动 Visual Basic,并创建一个 ActiveX EXE 项目。默认情况下将创建 Class1。
  2. 项目菜单上,单击以选择属性,然后将项目名更改为 MyTimer
  3. 将以下代码复制并粘贴到 Class1 模块中:
    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. 将该项目保存到一个名为 Server 的新子文件夹中。
  8. 文件菜单上,选择 Make MyTimer.Exe(建立 MyTimer.Exe)生成和注册该组件。
创建自动化客户端
  1. 在 Visual Basic 中创建一个新的标准 EXE 项目。默认情况下将创建 Form1。
  2. 向窗体中添加一个 CommandButton 控件。
  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. 将该项目保存到一个名为 Client 的新子文件夹中。
  6. 按 F5 键运行该项目。将出现 Form1
  7. 单击该窗体上的 Command1。这将使 Word 自动运行,添加一个包含一些文本的新文档,然后通过使用 PrintOut 方法将该文档发送到打印机。如果打印机被配置为打印到打印机,则不会看到对话框。
  8. 在 Windows“控制面板”中,更改您的默认打印机,将它配置为打印到 FILE 端口。
  9. 再次单击 Command1,并请注意 Word 中将显示一个对话框。不要关闭该对话框,等待五秒钟,当 Timer 事件发生后将以编程方式关闭该对话框。将在 Client 子文件夹中创建一个名为 MyOutput.prn 的输出文件。
Microsoft 提供的编程示例只是为了进行说明,没有任何明示或暗示保证,包括(但不限于)针对特定用途的适销性和/或适用性的暗示保证。本文假定您熟悉所演示的编程语言以及用于创建和调试过程的工具。Microsoft 的支持人员可以帮助解释某个特定过程的功能,但是他们不会修改这些示例以提供额外的功能或构建过程以满足您的特殊需要。如果您的编程经验不够丰富,您可能需要与 Microsoft 认证伙伴联系或者拨打 Microsoft 收费咨询电话 (800) 936-5200。有关 Microsoft 认证伙伴的更多信息,请访问下面的 Microsoft Web 站点:
https://partner.microsoft.com/global/30000104
有关可用的支持选项以及如何与 Microsoft 联系的更多信息,请访问下面的 Microsoft Web 站点:
http://support.microsoft.com/default.aspx?scid=fh;EN-US;CNTACTMS

参考

有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
257757 INFO:Automation of Office for Unattended Execution Is Not Recommended or Supported
226118 OFF2000:Programming Resources for Visual Basic for Applications
253235 文件:OFFAUTMN.EXE 讨论 Office 97 和 2000 自动化并提供示例代码
有关 Office 自动化的更多信息,请访问 Microsoft Web 上的 Office Development 支持中心站点:
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx

属性

文章编号: 259971 - 最后修改: 2007年1月17日 - 修订: 5.3
这篇文章中的信息适用于:
  • Microsoft Office Access 2003
  • Microsoft Access 2002 标准版
  • Microsoft Access 2000 标准版
  • Microsoft Access 97 标准版
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 标准版
  • Microsoft Excel 2000 标准版
  • Microsoft Excel 97 标准版
  • Microsoft Office PowerPoint 2003
  • Microsoft PowerPoint 2002 标准版
  • Microsoft PowerPoint 2000 标准版
  • Microsoft PowerPoint 97 标准版
  • Microsoft Office Word 2003
  • Microsoft Word 2002 标准版
  • Microsoft Word 2000 标准版
  • Microsoft Word 97 标准版
  • Microsoft Visual Basic 5.0 专业版
  • Microsoft Visual Basic 6.0 专业版
  • Microsoft Visual Basic 5.0 企业版
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
关键字:?
kbautomation kbhowto kbprogramming KB259971
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