Comportamento GetObject e CreateObject dos servidores de automatização do Office
Resumo
Este artigo aborda os diferentes comportamentos que ocorrem quando utiliza as funções GetObject e CreateObject com várias versões de aplicações do Microsoft Office.
GetObject e CreateObject são funções fornecidas pelo Microsoft Visual Basic e pelo Microsoft Visual Basic for Applications (VBA). No entanto, as informações também são aplicáveis ao Microsoft Visual C++ se tratar as referências a GetObject como chamadas à API GetActiveObject e referências a CreateObject como chamadas para a CoCreateInstanceAPI.
Mais Informações
GetObject
O GetObject é utilizado para anexar a uma instância em execução de um servidor de automatização. Existem algumas formas diferentes de chamar GetObject, mas a sintaxe recomendada para as aplicações do Microsoft Office é a seguinte:
set xlApp = GetObject(, "Excel.Application")
Se uma instância do Microsoft Excel estiver em execução quando este código é executado, terá acesso ao modelo de objetos da instância em execução através da variável xlApp. Se nenhuma instância estiver em execução, receberá a seguinte mensagem de erro de tempo de execução intercetável:
Run-time error '429':
ActiveX component can't create object
Se estiverem a ser executadas várias instâncias do Microsoft Excel, o GetObject anexa-se à instância que é iniciada primeiro. Se, em seguida, fechar a primeira instância, outra chamada para GetObject é anexada à segunda instância que foi iniciada e assim sucessivamente.
Pode anexar a uma instância específica se souber o nome de um documento aberto nessa instância. Por exemplo, se uma instância do Excel estiver em execução com um livro aberto chamado Book2, o seguinte código é anexado com êxito a essa instância, mesmo que não seja a instância mais antiga que foi iniciada:
Set xlApp = GetObject("Book2").Application
CriarObjeto
O CreateObject é utilizado para iniciar uma nova instância de um servidor de Automatização. Por exemplo:
set xlApp = CreateObject("Excel.Application")
Dependendo se o servidor foi concebido como SingleUse ou MultiUse, outro processo de servidor pode ou não ser iniciado. Esta pode ser uma distinção importante para decidir se deve encerrar à força uma instância de Automatização. Por exemplo, com um servidor MultiUse, se uma instância já estiver em execução antes de a anexar, poderá querer evitar encerrar o servidor programaticamente quando terminar de automatizar o mesmo.
A tabela seguinte serve como uma referência útil ao implementar uma solução com o Microsoft Office. Apresenta uma lista de comportamentos e atributos das várias versões e aplicações do Microsoft Office, tais como se a predefinição do servidor é visível quando é iniciada, se for SingleUse ou MultiUse, se tiver uma propriedade UserControl, se tiver um método Quit e o nome da classe para a janela principal.
Aplicações | Visível | Instancing | Tem UserControl | Tem QuitClassName | Nome da classe |
---|---|---|---|---|---|
Excel 97, 2000, 2002, 2003, 2007 | Não | SingleUse | Sim | Sim | XlMain |
Word 97, 2000, 2002, 2003, 2007 | Não | SingleUse | Sim | Sim | OpusApp |
PowerPoint 97 | Não | Multiusos | Não | Sim | PP97FrameClass |
PowerPoint 2000 | Não | Multiusos | Não | Sim | PP9FrameClass |
PowerPoint 2002 | Não | Multiusos | Não | Sim | PP10FrameClass |
PowerPoint 2003 | Não | Multiusos | Não | Sim | PP11FrameClass |
PowerPoint 2007 | Não | Multiusos | Não | Sim | PP12FrameClass |
Access 97 | Sim | SingleUse | Sim | Sim | OMain |
Access 2000, 2002, 2003, 2007 | Não | SingleUse | Sim | Sim | OMain |
Project 98, 2000 | Não | Multiusos | Sim | Sim | JWinproj-WhimperMainClass |
O nome da classe de janela principal é útil para chamar a API FindWindow quando quer descobrir convenientemente se alguma instância já está em execução. A propriedade UserControl é uma propriedade booleana que indica se a aplicação do servidor é encerrada automaticamente quando a última referência é lançada (definida como nada). O método Quit permite-lhe substituir a propriedade UserControl nos casos em que é necessário (por exemplo, quando uma instância não é encerrada após a última referência ser lançada).
Em geral, a Microsoft recomenda que utilize uma nova instância de uma aplicação do Office em vez de anexar a uma instância que o utilizador possa estar a utilizar. É melhor criar uma instância com o ProgID da Aplicação e, em seguida, abrir ou criar novos objetos a partir daí. Outros ProgIDs, como Excel.Sheet e Word. O documento, etc., destina-se a ser utilizado no OLE (Ligação de objetos e Incorporação) e pode fornecer resultados inconsistentes quando utilizado com CreateObject. Ao utilizar o ProgID da Aplicação, evita potenciais problemas ao iniciar explicitamente o servidor para Automatização (não incorporar).
Quando tiver terminado o servidor de Automatização, liberte todas as suas referências ao mesmo e chame o respetivo método Quit (se disponível) para que o servidor seja encerrado conforme esperado. Se quiser configurar uma instância através da Automatização e, em seguida, deixá-la aberta para o utilizador utilizar, tem de definir a propriedade UserControl como VERDADEIRO e, em seguida, libertar todas as suas referências. Em seguida, o servidor permanece em execução (porque a propriedade UserControl é TRUE) e encerra adequadamente quando o utilizador fecha a aplicação (porque não existem referências pendentes).
Nota Para Word, a propriedade UserControl é só de leitura. Não pode ser definido como Verdadeiro ou Falso. Word permanece sempre em execução quando a última referência é lançada.
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários