Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Resumo
Este artigo discute os diferentes comportamentos que ocorrem quando você usa as funções GetObject e CreateObject com várias versões de aplicativos 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 serão aplicáveis ao Microsoft Visual C++ se você tratar as referências a GetObject como chamadas para a API GetActiveObject e as referências a CreateObject como chamadas para a API CoCreateInstance.
Mais informações
GetObject
GetObject é usado para anexar a uma instância em execução de um servidor de automação. Há algumas maneiras diferentes de chamar GetObject, mas a sintaxe recomendada para os aplicativos do Microsoft Office é a seguinte:
set xlApp = GetObject(, "Excel.Application")
Se uma instância do Microsoft Excel estiver em execução quando esse código for executado, você terá acesso ao modelo de objeto da instância em execução por meio da variável xlApp. Se nenhuma instância estiver em execução, você receberá a seguinte mensagem de erro de tempo de execução interceptável:
Run-time error '429':
ActiveX component can't create object
Se várias instâncias do Microsoft Excel estiverem em execução, GetObject será anexado à instância iniciada primeiro. Se você fechar a primeira instância, outra chamada para GetObject será anexada à segunda instância que foi iniciada e assim por diante.
Você 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 uma pasta de trabalho aberta chamada Book2, o código a seguir será 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
CreateObject
CreateObject é usado para iniciar uma nova instância de um servidor de automação. Por exemplo:
set xlApp = CreateObject("Excel.Application")
Dependendo se o servidor foi projetado como SingleUse ou MultiUse, outro processo de servidor pode ou não ser iniciado. Essa pode ser uma distinção importante para decidir se você deve forçar o desligamento de uma instância de automação. Por exemplo, com um servidor MultiUso, se uma instância já estiver em execução antes de você anexá-la, talvez você queira evitar desligar o servidor programaticamente quando terminar de automatizá-lo.
A tabela a seguir serve como uma referência útil ao implementar uma solução com o Microsoft Office. Ele lista comportamentos e atributos das várias versões e aplicativos do Microsoft Office, como se o servidor é visível por padrão quando iniciado, se é SingleUse ou MultiUse, se tem uma propriedade UserControl, se tem um método Quit e o nome da classe para sua janela principal.
de terceiros | Visível | Instanciação | Tem UserControl | Tem QuitClassName | Nome da classe |
---|---|---|---|---|---|
Excel 97, 2000, 2002, 2003, 2007 | Não | Uso único | Sim | Sim | XlMain |
Palavra 97, 2000, 2002, 2003, 2007 | Não | Uso único | Sim | Sim | Aplicativo OpusApp |
PowerPoint 97 | Não | Multiuso | Não | Sim | Classe PP97FrameClass |
PowerPoint 2000 | Não | Multiuso | Não | Sim | Classe PP9FrameClass |
PowerPoint 2002 | Não | Multiuso | Não | Sim | Classe PP10FrameClass |
PowerPoint 2003 | Não | Multiuso | Não | Sim | Classe PP11FrameClass |
PowerPoint 2007 | Não | Multiuso | Não | Sim | Classe PP12FrameClass |
Acesso 97 | Sim | Uso único | Sim | Sim | OMain |
Acesso 2000, 2002, 2003, 2007 | Não | Uso único | Sim | Sim | OMain |
Projeto 98, 2000 | Não | Multiuso | Sim | Sim | JWinproj-WhimperMainClass |
O nome da classe da janela principal é útil para chamar a API FindWindow quando você deseja descobrir convenientemente se alguma instância já está em execução. A propriedade UserControl é uma propriedade booliana que indica se o aplicativo de servidor é desligado automaticamente quando sua última referência é liberada (definida como nada). O método Quit permite que você substitua a propriedade UserControl nos casos em que for necessário (como quando uma instância não é desligada depois que a última referência é liberada).
Em geral, a Microsoft recomenda que você use uma nova instância de um aplicativo do Office em vez de anexar a uma instância que o usuário possa estar usando. É melhor criar uma instância usando o Application ProgID e, em seguida, abrir ou criar novos objetos a partir daí. Outros ProgIDs, como Excel.Sheet e Word.Document e assim por diante, destinam-se ao uso em OLE (vinculação e inserção de objetos) e podem fornecer resultados inconsistentes quando usados com CreateObject. Usando o Application ProgID, você evita possíveis problemas iniciando explicitamente o servidor para Automação (não Inserção).
Quando terminar de usar o servidor de Automação, libere todas as suas referências a ele e chame seu método Quit (se disponível) para que o servidor seja desligado conforme o esperado. Se você quiser configurar uma instância por meio da Automação e deixá-la aberta para o usuário usar, será necessário definir a propriedade UserControl como TRUE e, em seguida, liberar todas as suas referências. Em seguida, o servidor permanece em execução (porque a propriedade UserControl é TRUE) e é desligado adequadamente quando o usuário fecha o aplicativo (porque não há referências pendentes).
Observação Para o Word, a propriedade UserControl é somente leitura. Ele não pode ser definido como Verdadeiro ou Falso. O Word sempre permanece em execução quando a última referência é liberada.