Erreur automation

Bonjour,

Pour simplifier l'un de mes programmes, j'ai modifié mon code en utilisant deux nouvelles variables workbooks :

wbOffre et wbSuivi (Dans le code de l'UserForm nouveauRex)

Ces deux variables me permettent d'éviter d'utiliser les fonctions .select et .activate.

Depuis cet ajout, mon programme ne fonctionne, plus en raison d'un erreur de type "automation".

Ligne 264 : ligne = wbOffre.Sheets("RECAp").Range("B1:B500").Find("TOTAL", lookat:=xlWhole).Row

Quelqu’un pourrait-il m'aiguiller sur les causes de cette erreur?

Par avance merci!

19fi-flash.xlsm (64.56 Ko)

Tu écris:

Set ligne = wbOffre.Sheets("RECAp").Range("B1:B500").Find("TOTAL", lookat:=xlWhole).Row

Alors qu'il faudrait uniquement écrire

ligne = wbOffre.Sheets("RECAp").Range("B1:B500").Find("TOTAL", lookat:=xlWhole).Row

Et juste dernière tu écris

ligne = cellule.row

Tu as des incohérences dans ton code. Il est à revoir

Bonsoir,

Ces deux variables me permettent d'éviter d'utiliser les fonctions .select et .activate.

Utiliser des variables pour éviter d'utiliser Select et Activate : les deux choses n'ont aucun rapport entre elles.

C'est très bien de vouloir éliminer les actions Select et Activate (dont ton code n'est pas exempt !) qui n'ont aucun intérêt (sauf exception rare) et surchargent inutilement VBA. On s'en passe simplement parce que, contrairement aux actions manuelles, VBA n'a nul besoin de ces actions intermédiaires pour manipuler des objets.

Select et Activate ne sont pas des fonctions, mais des méthodes communes à différents objets Excel.

En VBA on manipule des objets, pour l'essentiel des objets appartenant à une application, en l'occurrence Excel, dont il est bon de maîtriser la hiérarchie pour les principaux. Ces objets ont des Propriétés (caractéristiques ou qualités d'objet que l'on peut généralement modifier) et des Méthodes qui permettent de leur faire accomplir ou les impliquer dans certaines actions. Ils appartiennent à des collections et il faut bien se rendre compte que c'est en passant par la collection qu'on atteint généralement un objet particulier (au moyen des propriétés Item [numéro d'index dans la collection] ou Name).

Ce qu'on réalise c'est au moyen de code exécutable, toujours inclu dans des procédures (tout ce qui est hors procédure n'est pas du code exécutable, mais des déclarations utilisables par le code lors de l'exécution), dont les deux principaux types qu'on utilise soit : Sub et Function se différencient par le fait qu'une procédure Function (qui peut réaliser aussi des actions à l'instar d'un procédure Sub) est conçue pour renvoyer un résultat.

Il plus qu'utile de maîtriser dès le départ quelques définitions et distinctions basiques pour comprendre ce que l'on fait en écrivant tel ou tel code et progresser en VBA.

Cordialement.

Bonjour,

Merci pour vos réponses.

J'ai bien conscience que mon code est loin d'être un chef d'oeuvre. Je ne serais surement jamais un génie de l'informatique et je n'ai d'ailleurs pas la prétention de devenir le prochain Bill Gates

Par contre je souhaiterais juste connaitre la cause de l'erreur décrite dans mon premier message.

J'ai beau tourner la formulation de ma ligne de code dans tous les sens ... mais rien à faire, l'erreur revient toujours.

Pourtant quelques lignes avant, un code identique fonctionne sans accroc (Ligne 182) :

Set cellule = wbSuivi.Sheets("Codes").Range("E1:E500").Find("PERSONNEL", lookat:=xlWhole)

ligne = cellule.Row

Qué pasa?

Quelle erreur d'abord ?

Et sur quelle ligne ?

Et quelle valeur de "cellule" au moment de l'arrêt ?

MFerrand,

Quelle erreur d'abord ?

L'erreur affichée :

erreur d'execution : '-2147221080 (800401a8)'

erreur automation

Et sur quelle ligne ?

Mon erreur se trouve sur la ligne 264 (ligne modifiée depuis mon premier message sur cette discussion):

261 Set cellule = wbOffre.Sheets("RECAp").Range("B1:B500").Find("TOTAL", lookat:=xlWhole)

262 ligne = celulle.row

Et quelle valeur de "cellule" au moment de l'arrêt ?

cellule = "PRESTATIONS DE SERVICES ETUDES"

Merci pour votre aide.

Si ça change à chaque fois... !

Si la valeur de 'cellule' est une chaîne, cellule.Row va inévitablement déclencher une erreur.

cellule est censé être un objet Range.

Bonjour MFerrand,

Ma variable cellule est bien de type range.

Cette même variable est utilisée à plusieurs reprises et sous une forme similaire à la ligne posant problème, sans pour autant faire apparaître de message d'erreur.

Que me conseillez vous?

"PRESTATIONS DE SERVICES ETUDES" est bien une valeur de type String.

Ligne 264, ne me dit quelle est la ligne, et tu en cites 2. quelle est donc la ligne sur laquelle se déclenche l'erreur ?

La ligne qui me pose problème est bien le ligne 264 :

Set cellule = wbOffre.Sheets("RECAp").Range("B1:B500").Find("TOTAL", lookat:=xlWhole).Row

Elle me renvoie bien un string "PRESTATIONS DE SERVICE- ETUDES" comme vous venez de me l'expliquer.

Avant la ligne 264, la ligne 213 est la dernière ligne à utiliser la variable cellule :

Set cellule = wbSuivi.Sheets("Codes").Range("E1:E500").Find("PRESTATIONS DE SERVICE- ETUDES", lookat:=xlWhole)

On retrouve bien la valeur "PRESTATIONS DE SERVICE- ETUDES" qui me bloque sur la ligne 264.

L'utilisation du code suivant :

Set cellule = wbSuivi.Sheets("Codes").Range("E1:E500").Find("PRESTATIONS DE SERVICE- ETUDES", lookat:=xlWhole)

Revient-il à récupérer la valeur d'une cellule :

Set cellule = wbSuivi.Sheets("Codes").Range("E1:E500").Find("PRESTATIONS DE SERVICE- ETUDES", lookat:=xlWhole).value

Set cellule = wbOffre.Sheets("RECAp").Range("B1:B500").Find("TOTAL", lookat:=xlWhole).Row

Cette ligne de commande est incohérente, au lieu d'affecter un objet Range, tu affectes son numéro de ligne...

Il faut déjà supprimer .Row

et voir si l'affectation de "TOTAL" se fait.

Et si besoin d'utiliser la valeur, tu utilises cellule.Value, de la ligne : cellule.Row, etc.

J'ai rectifié la ligne de code de la façon suivante :

Set cellule = wbOffre.Sheets("RECAp").Range("B1:B500").Find("TOTAL", lookat:=xlWhole)

Un nouveau message d'erreur s'affiche :

la méthode 'sheets' de l'objet '_workbook' a échoué.

La feuille n'existe pas ! Son nom est différent ! Le classeur n'est pas trouvé ! Que sais-je ?

La variable wbOffre n'est pas correctement initialisée (donc ne renvoie pas le classeur) !

Et d'où vient le '_workbook' écrit de cette façon ? As-tu déjà utilisé quelque part cette locution ainsi orthographiée ?

Bonjour MFerrand,

Je viens de tester : le blocage proviendrait effectivement de la variable wbOffre.

Le classeur associé à la variable wbSuivi est bien ouvert et fonctionne. En revanche lors de l’arrêt du programme, l’entête du second classeur (wbOffre) qui est utilisé auparavant dans le programme est renommé Excel,

J'ai également fait une recherche de la formulation '_workbook' qui n'est pas utilisé dans mon programme.

Les deux variables wbOffre et wbSuivi sont initialisées de la même manière, je ne vois toujours pas d'ou vient l'erreur.

Rechercher des sujets similaires à "erreur automation"