Este tutorial explicará o que significa um erro de automação do VBA e como ele ocorre.
O Excel é composto de objetos - o objeto Workbook, objeto Worksheet, objeto Range e objeto Cell, para citar apenas alguns. Cada objeto possui várias propriedades e métodos cujo comportamento pode ser controlado com o código VBA. Se o código VBA não estiver programado corretamente, pode ocorrer um erro de automação. É um dos erros mais frustrantes no VBA, já que muitas vezes pode aparecer sem motivo aparente quando seu código parece perfeitamente bom!
(Consulte nosso Guia de tratamento de erros para obter mais informações sobre erros VBA)
Referindo-se a uma variável que não está mais ativa
Um erro de automação pode ocorrer quando você está se referindo a uma pasta de trabalho ou planilha por meio de uma variável, mas a variável não está mais ativa.
1234567891011 | Sub TestAutomation ()Dim strFile As StringDim wb como pasta de trabalho'abrir o arquivo e definir a variável da pasta de trabalhostrFile = Application.GetOpenFilenameDefinir wb = Workbooks.Open (strFile)'Feche a pasta de trabalhowb.Fechar'tente ativar a pasta de trabalhowb.ActivateEnd Sub |
Quando executarmos o código acima, obteremos um erro de automação. Isso se deve ao fato de que abrimos uma pasta de trabalho e atribuímos uma variável a ela. Em seguida, fechamos a pasta de trabalho, mas na próxima linha de código, tentamos ativar a pasta de trabalho fechada. Isso causará o erro, pois a variável não está mais ativa.
Se quisermos ativar uma pasta de trabalho, primeiro precisamos ter a pasta de trabalho aberta!
Sobrecarga de memória
Este erro também pode ocorrer às vezes se você tiver um loop e se esquecer de limpar um objeto durante o curso do loop. No entanto, pode ocorrer apenas algumas vezes, e não outras - que é uma das razões pelas quais esse erro pode ser tão irritante.
Veja, por exemplo, este código abaixo:
1234567891011121314151617 | Sub InsertPicture ()Dim i As IntegerDim shp As ObjectPara i = 1 a 100Com planilhas ("Planilha1")'definir a variável do objetoDefina shp = .OLEObjects.Add (ClassType: = "Forms.Image.1", Link: = False, DisplayAsIcon: = False, Left: =. Cells (i, "A"). Left, Top: =. Cells ( i, "A"). Superior, Largura: = 264, Altura: = 124)Terminar comCom shp.Object.PictureSizeMode = 3'carregar a imagem.Object.Picture = LoadPicture ("C: \ data \ image" & i & ".jpg").Object.BorderStyle = 0.Object.BackStyle = 0Terminar comProximo euEnd Sub |
A variável é declarada como um objeto e, em seguida, o DEFINIR palavra-chave é usada para atribuir uma imagem ao objeto. O objeto é então preenchido com uma imagem e inserido na planilha do Excel com alguma formatação ocorrendo ao mesmo tempo. Em seguida, adicionamos um loop ao código para inserir 100 imagens na planilha do Excel. Ocasionalmente, isso causa um erro de automação, mas às vezes não - frustrante, certo?
A solução para este problema é limpar a variável do objeto dentro do loop, definindo o objeto para NADA - isso irá liberar a memória e evitar o erro.
12345678910111213141516171819 | Sub InsertPicture ()Dim i As IntegerDim shp As ObjectPara i = 1 a 100Com planilhas ("Planilha1")'definir a variável do objetoDefina shp = .OLEObjects.Add (ClassType: = "Forms.Image.1", Link: = False, DisplayAsIcon: = False, Left: =. Cells (i, "A"). Left, Top: =. Cells ( i, "A"). Superior, Largura: = 264, Altura: = 124)Terminar comCom shp.Object.PictureSizeMode = 3'carregar a imagem.Object.Picture = LoadPicture ("C: \ data \ image.jpg").Object.BorderStyle = 0.Object.BackStyle = 0Terminar com'limpar a variável do objetoDefinir shp = NothingProximo euEnd Sub |
Erros DLL e atualização do Windows
Às vezes, o erro ocorre e não há nada que possa ser feito no código VBA. Registrando novamente as DLLs que estão sendo usadas, certificando-se de que nosso Windows está atualizado e, como último recurso, executando uma Verificação do Registro como às vezes a única coisa que pode funcionar para limpar este erro.
Uma boa maneira de evitar este erro é certificar-se de que as armadilhas de erro estão no lugar usando o Em caso de erro, vá para ou em caso de erro, continuar próximo rotinas.