Erreur d'automatisation VBA

Ce didacticiel expliquera ce que signifie une erreur d'automatisation VBA et comment elle se produit.

Excel est composé d'objets - l'objet Workbook, l'objet Worksheet, l'objet Range et l'objet Cell pour n'en nommer que quelques-uns. Chaque objet possède plusieurs propriétés et méthodes dont le comportement peut être contrôlé avec du code VBA. Si le code VBA n'est pas correctement programmé, une erreur d'automatisation peut se produire. C'est l'une des erreurs les plus frustrantes de VBA car elle peut souvent apparaître sans raison apparente lorsque votre code semble parfaitement correct !

(Consultez notre Guide de gestion des erreurs pour plus d'informations sur les erreurs VBA)

Faire référence à une variable qui n'est plus active

Une erreur d'automatisation peut se produire lorsque vous faites référence à un classeur ou une feuille de calcul via une variable, mais la variable n'est plus active.

1234567891011 Sous-TestAutomation()Dim strFile As StringDim wb comme classeur'ouvrir le fichier et définir la variable du classeurstrFile = Application.GetOpenFilenameDéfinir wb = Workbooks.Open(strFile)'Fermer le classeurwb.Fermer'essaye d'activer le classeurwb.ActiverFin du sous-marin

Lorsque nous exécutons le code ci-dessus, nous obtiendrons une erreur d'automatisation. Cela est dû au fait que nous avons ouvert un classeur et affecté une variable à ce classeur. Nous avons ensuite fermé le classeur mais dans la ligne de code suivante, nous essayons d'activer le classeur fermé. Cela provoquera l'erreur car la variable n'est plus active.

Si nous voulons activer un classeur, nous devons d'abord ouvrir le classeur !

Surcharge de mémoire

Cette erreur peut aussi parfois se produire si vous avez une boucle et que vous oubliez d'effacer un objet au cours de la boucle. Cependant, cela peut ne se produire que parfois, et pas d'autres, ce qui est l'une des raisons pour lesquelles cette erreur peut être si ennuyeuse.

Prenons par exemple ce code ci-dessous :

1234567891011121314151617 Sous InsérerImage()Diminuer en tant qu'entierDim shp comme objetPour i = 1 à 100Avec des feuilles de calcul("Feuille1")'définit la variable objetSet shp = .OLEObjects.Add(ClassType:="Forms.Image.1", Link:=False, DisplayAsIcon:=False, Left:=.Cells(i, "A").Left, Top:=.Cells( i, "A").Haut, Largeur :=264, Hauteur :=124)Terminer parAvec shp.Object.PictureSizeMode = 3'charger l'image.Object.Picture = LoadPicture("C:\data\image" & i & ".jpg").Object.BorderStyle = 0.Object.BackStyle = 0Terminer parEnsuite jeFin du sous-marin

La variable est déclarée en tant qu'objet, puis le ENSEMBLE Le mot-clé est utilisé pour attribuer une image à l'objet. L'objet est ensuite rempli d'une image et inséré dans la feuille Excel avec une mise en forme simultanée. Nous ajoutons ensuite une boucle au code pour insérer 100 images dans la feuille Excel. Parfois, cela provoque une erreur d'automatisation, mais parfois ce n'est pas le cas - frustrant, n'est-ce pas ?

La solution à ce problème consiste à effacer la variable objet dans la boucle en définissant l'objet sur RIEN - cela libérera la mémoire et évitera l'erreur.

12345678910111213141516171819 Sous InsérerImage()Diminuer en tant qu'entierDim shp comme objetPour i = 1 à 100Avec des feuilles de calcul("Feuille1")'définit la variable objetSet shp = .OLEObjects.Add(ClassType:="Forms.Image.1", Link:=False, DisplayAsIcon:=False, Left:=.Cells(i, "A").Left, Top:=.Cells( i, "A").Haut, Largeur :=264, Hauteur :=124)Terminer parAvec shp.Object.PictureSizeMode = 3'charger l'image.Object.Picture = LoadPicture("C:\data\image.jpg").Object.BorderStyle = 0.Object.BackStyle = 0Terminer par'effacer la variable objetDéfinir shp = RienEnsuite jeFin du sous-marin

Erreurs DLL et mise à jour de Windows

Parfois, l'erreur se produit et il n'y a rien à faire dans le code VBA. Ré-enregistrer les DLL qui sont utilisées, en s'assurant que notre Windows est à jour et en dernier recours, en exécutant une vérification du registre comme parfois les seules choses qui peuvent fonctionner pour effacer cette erreur.

Un bon moyen d'éviter cette erreur est de s'assurer que les traps d'erreur sont en place en utilisant le En cas d'erreur Aller à ou En cas d'erreur Reprendre Suivant routines.

wave wave wave wave wave