Como dispensar uma caixa de diálogo apresentada por uma aplicação do Office com o Visual Basic

Traduções de Artigos Traduções de Artigos
Artigo: 259971 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sumário

Quando estiver a automatizar uma aplicação do Office a partir do Visual Basic (VB), a aplicação do Office poderá apresentar uma caixa de diálogo. A caixa de diálogo faz com que a aplicação do Visual Basic parecer deixar de responder (ou não reagir) porque VB está a aguardar a caixa de diálogo ser dispensada. A caixa de diálogo tem de ser dispensada antes de pode continuar aplicação do Visual Basic.

Este artigo descreve como pode utilizar os modelos de objecto para aplicações do Office para evitar caixas de diálogo durante a automatização. Também fornece um exemplo passo a passo de como simular a intervenção do utilizador para fechar programaticamente uma caixa de diálogo que não pode ser evitada, utilizando a habituais propriedades e métodos expostos nos modelos de objecto.

Mais Informação

Por vezes, poderá automatizar uma aplicação do Office, mas não requerer intervenção do utilizador com a aplicação do Office. Neste caso, se a aplicação do Office apresentar uma caixa de diálogo, a aplicação parece deixar de responder até que um utilizador pode fechar a caixa de diálogo. No entanto, poderão não existir um utilizador sentado à frente do computador que pode fechar a caixa de diálogo.

As aplicações do Office não foram concebidas para execução automática. Por este motivo, uma aplicação que automatiza o Office, por vezes, poderá encontrar uma caixa de diálogo apresentada, a aplicação do Office. De teste normal da aplicação, pode normalmente determinar que diálogo caixas ocorrem e escreva o código para evitar essas caixas de diálogos específico.

Seguem alguns recomendam estratégias para evitar caixas de diálogo ao automatizar um Office aplicação:
  • Determine se a propriedade ou método estiver a utilizar (aquele que está a causar a caixa de diálogo) tem argumentos opcionais que pode passar para o mesmo. Por vezes, ao passar todos os argumentos para a propriedade ou método, pode evitar uma caixa de diálogo. Por exemplo, se estiver a utilizar o método Abrir para abrir um livro do Excel e esse livro é a palavra-passe protegido, Excel apresenta uma caixa de diálogo pedindo ao utilizador para introduzir a palavra-passe se não fornecer o argumento de palavra-passe ao chamar o método Open . Para evitar a caixa de diálogo, fornecer um valor para o argumento de palavra-passe ao chamar o método Open . Do mesmo modo, quando utilizar o método Fechar para fechar um documento, muitas vezes ajuda a especificar o argumento de função SaveChanges para evitar uma caixa de diálogo pedindo ao utilizador para guardar as alterações. Para obter informações adicionais sobre como determinar que argumentos estão disponíveis para a propriedade ou o método que está a contactar, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
    222101Como Localizar e utilizar a documentação sobre o modelo de objecto do Office
  • Examine o modelo de objectos da aplicação do Office para ver se é possível que haja uma propriedade que impede que determinadas caixas de diálogo. Por exemplo, o objecto do Excel aplicações tem propriedades AskToUpdateLinks e AlertBeforeOverwriting .
  • Defina a propriedade Application.DisplayAlerts (Excel, Project, o Word) ou utilizar Application.DoCmd.SetWarnings FALSO (apenas acesso) para desactivar a apresentação de mensagens de alerta. A maior parte dos, mas não todos, caixas de diálogo podem ser evitadas utilizando esta definição.
  • Defina a propriedade Application.FeatureInstall (Office 2000 e posterior) para lidar com possíveis caixas de diálogo "Esta funcionalidade não está instalada..." quando acede a um componente que não esteja instalado no sistema do utilizador.
  • Utilize a instrução de Erro para evitar mensagens de erro em tempo de execução que podem ocorrer, tal como quando tentar definir Application.ActivePrinter quando o controlador de impressora não está instalado num sistema do utilizador.
  • Teste a aplicação cuidadosamente para ajudar a prever quando caixas de diálogo podem ocorrer. Por exemplo, suponha que chame o método ' Guardar como ' de uma aplicação do Office para guardar um ficheiro. Se esse ficheiro já existir, poderá apresentada uma caixa de diálogo pedindo confirmação para substituir o ficheiro existente. Se modificar o código para procurar o ficheiro antes de chamar o método ' Guardar como ' , pode evitar a possibilidade da caixa de diálogo que aparece. Por exemplo, se o ficheiro já existir, eliminá-la utilizando a instrução kill antes de chamar o método ' Guardar como ' .
Nota Mesmo se utilizar estas técnicas e cuidadosamente conceber a aplicação para evitar caixas de diálogo, pode ainda poderá ser confrontado com uma situação em que uma caixa de diálogo não pode ser evitada com os métodos e propriedades expostas no modelo de objecto de aplicação do Office. Nestas situações, poderá ser necessário fechar programaticamente uma caixa de diálogo simulando intervenção do utilizador. A demonstração seguinte ilustra como isto pode ser efectuado com um cliente de automatização do Visual Basic.

Exemplo

Os passos nesta secção demonstram automatização do Microsoft Word para imprimir um documento. O cliente de automatização chama o método Imprimir para o objecto de documento do Word. Se predefinido impressora o utilizador estiver configurada para imprimir para a porta FILE, uma chamada para Imprimir produz uma caixa de diálogo pedindo ao utilizador para introduzir um nome de ficheiro. Para determinar se o método Imprimir origina esta caixa de diálogo aparecer, o cliente de automatização do Visual Basic utiliza um controlo de temporizador para detectar o tempo de inactividade depois de chamar o método Imprimir . Antes para chamar Imprimir , o temporizador é activado e defina a lançar em cinco segundos. Quando Imprimir estiver concluída, o temporizador está desactivado. Por este motivo, se o método Imprimir completa em 5 segundos, nunca ocorre o evento Timer e não é efectuada nenhuma acção adicional. O documento é impresso e continua a execução de código para além do método de Imprimir . No entanto, se ocorre o evento Timer dentro do intervalo segundo cinco, é assumido que o método Imprimir não foi concluída e que o atraso é causado por uma caixa de diálogo aguardar intervenção do utilizador. Quando ocorre o evento Timer , o cliente de automatização atribui o foco para o Word e utiliza ComandosPorTeclado para fechar a caixa de diálogo.

Nota Para fins de demonstração, este exemplo utiliza o método Imprimir de tal forma que apresenta intencionalmente uma caixa de diálogo quando imprime para um conjunto de impressora a uma porta FILE. Tenha em atenção que o método Imprimir tem dois argumentos, OutputfileName e PrintToFile , que pode fornecer para evitar esta caixa de diálogo.

Além disso, quando utilizar esta abordagem "temporizador", pode personalizar o tempo de espera de ser maior ou menor que cinco segundos, bem como personalizar os batimentos de teclas que envia para a caixa de diálogo.

Esta demonstração é composto por dois projectos de Visual Basic:
  1. EXE de ActiveX que fornece uma classe de temporizador utilizada para detectar um atraso. O código de motivo para utilizar um EXE ActiveX para a classe de temporizador executar o temporizador num processo separado e, consequentemente, um thread separado. Isto torna possível para a classe temporizador accionar um evento durante uma chamada de automatização suspensa.
  2. EXE padrão que utilize Automatização para o Word e chama o método Imprimir para imprimir um documento. Utiliza um EXE ActiveX para detectar um atraso quando chamar o método de Imprimir .
Criar projecto EXE ActiveX
  1. Inicie o Visual Basic e crie um projecto EXE ActiveX. Aula1 é criado por predefinição.
  2. No menu projecto , clique para seleccionar Propriedades e, em seguida, altere o nome Project para MyTimer .
  3. Copiar e colar o seguinte código para o módulo Aula1 :
    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. No menu projecto , seleccione Adicionar formulário para adicionar um novo formulário ao projecto.
  5. Adicione um controlo de temporizador ao formulário.
  6. Copiar e colar o seguinte código para o módulo de código de Form1:
    Option Explicit
    
    Public oClass1 As Class1
    
    Private Sub Timer1_Timer()
        oClass1.TimerEvent
    End Sub
    					
  7. Guarde este projecto numa subpasta nova com o nome Server .
  8. No menu ficheiro , seleccione Criar MyTimer.Exe para criar e registar o componente.
criar o cliente de automatização
  1. Crie um novo projecto EXE padrão no Visual Basic. É criado o Form1 por predefinição.
  2. Adicione um controlo CommandButton ao formulário.
  3. No menu Project , seleccione References . Adicione referências para o Microsoft Word 8.0 (9.0 ou 10.0) Object Library e às MyTimer .
  4. Copie e cole o seguinte código ao módulo do formulário:
    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. Guarde este projecto numa nova subpasta denominada cliente .
  6. Prima a tecla F5 para executar o projecto. é apresentado o Form1 .
  7. Clique em Command1 do formulário. Isto automatiza Word, adiciona um novo documento com texto e, em seguida, envia-o para a impressora utilizando o método Imprimir . Não vir uma caixa de diálogo se a impressora estiver configurada para imprimir numa impressora.
  8. No painel de controlo do Windows, altere a impressora predefinida de modo a que está configurada para imprimir para a porta FILE.
  9. Clique em Command1 novamente e note que uma caixa de diálogo é apresentada no Word. Não fechar a caixa de diálogo; aguardar cinco segundos e a caixa de diálogo é dispensada programaticamente quando ocorre o evento Timer . É criado um ficheiro de saída denominado MyOutput.prn na subpasta cliente.
Microsoft fornece exemplos de programação ilustração só, sem garantia expressa ou implícita, incluindo, sem limitação, garantias implícitas de comercialização e/ou adequação a um fim específico. Este artigo pressupõe que está familiarizado com a linguagem de programação apresentada e as ferramentas utilizadas para criar e depurar procedimentos. Profissionais de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas não modificarão estes exemplos para proporcionarem funcionalidades adicionais nem criarão procedimentos adaptados às necessidades específicas.
Se dispõe de limitada experiência de programação, poderá contactar um Microsoft Certified Partner ou a serviços de aviso. Para obter mais informações, visite estes Web sites da Microsoft:

Microsoft certificado Partner - https://partner.microsoft.com/global/30000104

Serviços Microsoft aviso - http://support.microsoft.com/gp/advisoryservice

Para obter mais informações sobre as opções de suporte estão disponíveis e sobre como contactar a Microsoft, visite o seguinte Web site da Microsoft: http://support.microsoft.com/default.aspx?scid=fh;EN-US;CNTACTMS

Referências

Para obter informações adicionais, clique números de artigo que se seguem para visualizar os artigos na base de dados de conhecimento da Microsoft:
257757INFO: Considerações sobre a automatização do lado do servidor do Office
226118OFF2000: Recursos de programação do Visual Basic for Applications
253235FICHEIRO: Offautmn.exe aborda o Office 97 e 2000 automatização e fornece exemplos de código
Para obter informações adicionais sobre a automatização do Office, visite o Office Development Support Center no seguinte Web site da Microsoft:
http://support.microsoft.com/ofd

Propriedades

Artigo: 259971 - Última revisão: 17 de janeiro de 2007 - Revisão: 6.7
A informação contida neste artigo aplica-se a:
  • 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
Palavras-chave: 
kbmt kbautomation kbhowto kbprogramming KB259971 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 259971

Submeter comentários

 

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